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()));
+ }
}