You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2023/05/06 06:59:24 UTC

[kylin] 23/38: KYLIN-5521 [FOLLOW UP] Fix JoinsGraph toString method StackOverFlow

This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 625c4b6c7e86aa8402e450c085f8332b0f5fc8b2
Author: Jiale He <35...@users.noreply.github.com>
AuthorDate: Tue Feb 28 10:10:36 2023 +0800

    KYLIN-5521 [FOLLOW UP] Fix JoinsGraph toString method StackOverFlow
---
 .../apache/kylin/metadata/model/graph/JoinsGraph.java   | 12 ++++++++++--
 .../org/apache/kylin/metadata/model/JoinsGraphTest.java | 17 +++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/graph/JoinsGraph.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/graph/JoinsGraph.java
index 2029fd61ac..ee4efbf60b 100644
--- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/graph/JoinsGraph.java
+++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/model/graph/JoinsGraph.java
@@ -476,6 +476,10 @@ public class JoinsGraph implements Serializable {
         return unmatched;
     }
 
+    public List<Edge> getEdgesByFKSideWithoutSwap(TableRef table) {
+        return getEdgesByFKSide(table).stream().filter(e -> !e.isSwapJoin()).collect(Collectors.toList());
+    }
+
     /**
      * Root: TableRef[TEST_KYLIN_FACT]
      *   Edge: TableRef[TEST_KYLIN_FACT] LEFT JOIN TableRef[TEST_ORDER] ON [ORDER_ID] = [ORDER_ID]
@@ -487,7 +491,9 @@ public class JoinsGraph implements Serializable {
         StringBuilder sb = new StringBuilder();
         sb.append("Root: ").append(center);
         // build next edges
-        getEdgesByFKSide(center).forEach(e -> buildGraphStr(sb, e, 1));
+        for (Edge e : getEdgesByFKSideWithoutSwap(center)) {
+            buildGraphStr(sb, e, 1);
+        }
         return sb.toString();
     }
 
@@ -495,7 +501,9 @@ public class JoinsGraph implements Serializable {
         sb.append(IntStream.range(0, indent).mapToObj(i -> "  ")
                 .collect(Collectors.joining("", "\n", String.valueOf(edge))));
         // build next edges
-        getEdgesByFKSide(edge.pkSide()).forEach(e -> buildGraphStr(sb, e, indent + 1));
+        for (Edge e : getEdgesByFKSideWithoutSwap(edge.pkSide())) {
+            buildGraphStr(sb, e, indent + 1);
+        }
     }
 
     private <T> void addIfAbsent(List<T> edges, T edge) {
diff --git a/src/core-metadata/src/test/java/org/apache/kylin/metadata/model/JoinsGraphTest.java b/src/core-metadata/src/test/java/org/apache/kylin/metadata/model/JoinsGraphTest.java
index 65a359e63f..59a946831c 100644
--- a/src/core-metadata/src/test/java/org/apache/kylin/metadata/model/JoinsGraphTest.java
+++ b/src/core-metadata/src/test/java/org/apache/kylin/metadata/model/JoinsGraphTest.java
@@ -25,6 +25,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.function.Supplier;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.exception.KylinException;
 import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
@@ -368,4 +369,20 @@ public class JoinsGraphTest extends NLocalFileMetadataTestCase {
         Object invoke = method.invoke(matcher, a, b);
         Assert.assertEquals(true, invoke);
     }
+
+    @Test
+    public void testToString() {
+        NDataModel modelDesc = NDataModelManager.getInstance(getTestConfig(), "default")
+                .getDataModelDescByAlias("nmodel_basic_inner");
+        JoinsGraph graph1 = new MockJoinGraphBuilder(modelDesc, "TEST_KYLIN_FACT")
+                .innerJoin(new String[] { "TEST_KYLIN_FACT.ORDER_ID" }, new String[] { "TEST_ORDER.ORDER_ID" }).build();
+        Assert.assertTrue(StringUtils.isNotEmpty(graph1.toString()));
+
+        JoinsGraph graph2 = new MockJoinGraphBuilder(modelDesc, "TEST_KYLIN_FACT")
+                .innerJoin(new String[] { "TEST_KYLIN_FACT.ORDER_ID" }, new String[] { "TEST_ORDER.ORDER_ID" })
+                .innerJoin(new String[] { "TEST_ORDER.BUYER_ID" }, new String[] { "BUYER_ACCOUNT.ACCOUNT_ID" })
+                .innerJoin(new String[] { "BUYER_ACCOUNT.ACCOUNT_COUNTRY" }, new String[] { "BUYER_COUNTRY.COUNTRY" })
+                .build();
+        Assert.assertTrue(StringUtils.isNotEmpty(graph2.toString()));
+    }
 }