This is an automated email from the ASF dual-hosted git repository. huajianlan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 7ca6f8b6a2 [refactor](Nereids)split rewrite and insert into memo to 2 functions (#11342) 7ca6f8b6a2 is described below commit 7ca6f8b6a293c39d1eac658f1485243dd739b060 Author: morrySnow <101034200+morrys...@users.noreply.github.com> AuthorDate: Mon Aug 1 14:44:01 2022 +0800 [refactor](Nereids)split rewrite and insert into memo to 2 functions (#11342) Split rewrite and insert into memo to 2 functions to make the code easy to read. --- .../main/java/org/apache/doris/catalog/Table.java | 2 +- .../java/org/apache/doris/nereids/memo/Memo.java | 68 +++++---- .../nereids/{ => datasets}/ssb/AnalyzeSSBTest.java | 2 +- .../{ => datasets}/ssb/SSBJoinReorderTest.java | 2 +- .../nereids/{ => datasets}/ssb/SSBTestBase.java | 4 +- .../doris/nereids/{ => datasets}/ssb/SSBUtils.java | 2 +- .../{ => datasets}/tpch/AnalyzeCheckTestBase.java | 2 +- .../{ => datasets}/tpch/AnalyzeTPCHTest.java | 2 +- .../nereids/{ => datasets}/tpch/TPCHTestBase.java | 2 +- .../nereids/{ => datasets}/tpch/TPCHUtils.java | 2 +- .../org/apache/doris/nereids/memo/MemoTest.java | 152 ++++++++++++++------- .../nereids/trees/expressions/SubqueryTest.java | 2 +- .../{plan => trees/plans}/TestPlanOutput.java | 4 +- 13 files changed, 161 insertions(+), 85 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java index e41b835d07..c7fdfce7fd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java @@ -269,7 +269,7 @@ public class Table extends MetaObject implements Writable, TableIf { if (full) { return fullSchema; } else { - return fullSchema.stream().filter(column -> column.isVisible()).collect(Collectors.toList()); + return fullSchema.stream().filter(Column::isVisible).collect(Collectors.toList()); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java index aa96af697d..16d02e8fa9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java @@ -26,7 +26,6 @@ import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.qe.ConnectContext; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -92,8 +91,11 @@ public class Memo { node = replaceChildrenToGroupPlan(node, childrenGroups); GroupExpression newGroupExpression = new GroupExpression(node); newGroupExpression.setChildren(childrenGroups); - return insertOrRewriteGroupExpression(newGroupExpression, target, rewrite, - node.getLogicalProperties()); + if (rewrite) { + return rewriteGroupExpression(newGroupExpression, target, node.getLogicalProperties()); + } else { + return insertGroupExpression(newGroupExpression, target, node.getLogicalProperties()); + } // TODO: need to derive logical property if generate new group. currently we not copy logical plan into } @@ -122,44 +124,64 @@ public class Memo { } /** - * Insert or rewrite groupExpression to target group. + * Insert groupExpression to target group. * If group expression is already in memo and target group is not null, we merge two groups. * If target is null, generate new group. - * If rewrite is true, rewrite the groupExpression to target group. + * If target is not null, add group expression to target group * * @param groupExpression groupExpression to insert - * @param target target group to insert or rewrite groupExpression - * @param rewrite whether to rewrite the groupExpression to target group + * @param target target group to insert groupExpression * @return a pair, in which the first element is true if a newly generated groupExpression added into memo, * and the second element is a reference of node in Memo */ - private Pair<Boolean, GroupExpression> insertOrRewriteGroupExpression(GroupExpression groupExpression, Group target, - boolean rewrite, LogicalProperties logicalProperties) { + private Pair<Boolean, GroupExpression> insertGroupExpression( + GroupExpression groupExpression, Group target, LogicalProperties logicalProperties) { GroupExpression existedGroupExpression = groupExpressions.get(groupExpression); if (existedGroupExpression != null) { - Group mergedGroup = existedGroupExpression.getOwnerGroup(); if (target != null && !target.getGroupId().equals(existedGroupExpression.getOwnerGroup().getGroupId())) { - mergedGroup = mergeGroup(target, existedGroupExpression.getOwnerGroup()); - } - if (rewrite) { - mergedGroup.setLogicalProperties(logicalProperties); + mergeGroup(existedGroupExpression.getOwnerGroup(), target); } - return new Pair(false, existedGroupExpression); + return new Pair<>(false, existedGroupExpression); } if (target != null) { - if (rewrite) { - GroupExpression oldExpression = target.rewriteLogicalExpression(groupExpression, logicalProperties); - groupExpressions.remove(oldExpression); - } else { - target.addGroupExpression(groupExpression); - } + target.addGroupExpression(groupExpression); + } else { + Group group = new Group(groupIdGenerator.getNextId(), groupExpression, logicalProperties); + groups.add(group); + } + groupExpressions.put(groupExpression, groupExpression); + return new Pair<>(true, groupExpression); + } + + /** + * Rewrite groupExpression to target group. + * If group expression is already in memo, we replace logical properties regardless the target group present or not + * for replace UnboundLogicalProperties to LogicalProperties + * If target is null, generate new group. + * If target is not null, rewrite the groupExpression to target group. + * + * @param groupExpression groupExpression to rewrite old one + * @param target target group to rewrite groupExpression + * @return a pair, in which the first element is true if a newly generated groupExpression added into memo, + * and the second element is a reference of node in Memo + */ + private Pair<Boolean, GroupExpression> rewriteGroupExpression( + GroupExpression groupExpression, Group target, LogicalProperties logicalProperties) { + boolean newGroupExpressionGenerated = true; + GroupExpression existedGroupExpression = groupExpressions.get(groupExpression); + if (existedGroupExpression != null) { + target = existedGroupExpression.getOwnerGroup(); + newGroupExpressionGenerated = false; + } + if (target != null) { + GroupExpression oldExpression = target.rewriteLogicalExpression(groupExpression, logicalProperties); + groupExpressions.remove(oldExpression); } else { Group group = new Group(groupIdGenerator.getNextId(), groupExpression, logicalProperties); - Preconditions.checkArgument(!groups.contains(group), "new group with already exist output"); groups.add(group); } groupExpressions.put(groupExpression, groupExpression); - return new Pair(true, groupExpression); + return new Pair<>(newGroupExpressionGenerated, groupExpression); } /** diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/AnalyzeSSBTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/AnalyzeSSBTest.java similarity index 97% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/AnalyzeSSBTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/AnalyzeSSBTest.java index 6065f2159f..6d5b9a65cc 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/AnalyzeSSBTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/AnalyzeSSBTest.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.ssb; +package org.apache.doris.nereids.datasets.ssb; import org.junit.jupiter.api.Test; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBJoinReorderTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBJoinReorderTest.java similarity index 99% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBJoinReorderTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBJoinReorderTest.java index b78de68a5a..77a78c8529 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBJoinReorderTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBJoinReorderTest.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.ssb; +package org.apache.doris.nereids.datasets.ssb; import org.apache.doris.nereids.analyzer.NereidsAnalyzer; import org.apache.doris.nereids.rules.rewrite.logical.ReorderJoin; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBTestBase.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBTestBase.java similarity index 90% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBTestBase.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBTestBase.java index 87a620e0e1..691da60173 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBTestBase.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBTestBase.java @@ -15,9 +15,9 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.ssb; +package org.apache.doris.nereids.datasets.ssb; -import org.apache.doris.nereids.tpch.AnalyzeCheckTestBase; +import org.apache.doris.nereids.datasets.tpch.AnalyzeCheckTestBase; public abstract class SSBTestBase extends AnalyzeCheckTestBase { @Override diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBUtils.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBUtils.java similarity index 99% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBUtils.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBUtils.java index 97de88afd3..a728d01dce 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBUtils.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBUtils.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.ssb; +package org.apache.doris.nereids.datasets.ssb; import org.apache.doris.utframe.TestWithFeService; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeCheckTestBase.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeCheckTestBase.java similarity index 98% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeCheckTestBase.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeCheckTestBase.java index bfd01077d6..a994faaeb9 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeCheckTestBase.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeCheckTestBase.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.tpch; +package org.apache.doris.nereids.datasets.tpch; import org.apache.doris.nereids.analyzer.NereidsAnalyzer; import org.apache.doris.nereids.analyzer.Unbound; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeTPCHTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeTPCHTest.java similarity index 98% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeTPCHTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeTPCHTest.java index d4185d67d7..44de365d5d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeTPCHTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeTPCHTest.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.tpch; +package org.apache.doris.nereids.datasets.tpch; /** * There are still many functions that have not been implemented, diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHTestBase.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHTestBase.java similarity index 95% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHTestBase.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHTestBase.java index 64df88841d..71dddf165c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHTestBase.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHTestBase.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.tpch; +package org.apache.doris.nereids.datasets.tpch; public abstract class TPCHTestBase extends AnalyzeCheckTestBase { @Override diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHUtils.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHUtils.java similarity index 99% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHUtils.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHUtils.java index 5bc571cf97..ee8c4b25e4 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHUtils.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHUtils.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.tpch; +package org.apache.doris.nereids.datasets.tpch; import org.apache.doris.utframe.TestWithFeService; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java index ecf1aa3729..d31b455a6c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java @@ -18,9 +18,14 @@ package org.apache.doris.nereids.memo; import org.apache.doris.nereids.analyzer.UnboundRelation; -import org.apache.doris.nereids.trees.expressions.ExprId; +import org.apache.doris.nereids.trees.expressions.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.SlotReference; +import org.apache.doris.nereids.trees.plans.GroupPlan; +import org.apache.doris.nereids.trees.plans.JoinType; +import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; +import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import org.apache.doris.nereids.types.StringType; @@ -31,7 +36,7 @@ import org.junit.jupiter.api.Test; public class MemoTest { @Test - public void testCopyIn() { + public void testInsert() { UnboundRelation unboundRelation = new UnboundRelation(Lists.newArrayList("test")); LogicalProject insideProject = new LogicalProject( ImmutableList.of(new SlotReference("name", StringType.INSTANCE, true, ImmutableList.of("test"))), @@ -59,61 +64,112 @@ public class MemoTest { } /** - * initial Memo status: - * group#1(project1)-->group#0(relationA) - * group#3(project2)-->group#2(relationB) - * group#4(project3)-->group#2(relationB) - * copy relationA into group#2 - * after merge: - * group#1(project1)-->group#0(relationA, relationB) - * group#4(project3)-->group#0 - * merging group#2 and group#0 recursively invoke merging group#3 and group#1 and merging group#4 and group#1 + * Original: + * |---Project(name) + * |---Project(name) + * |---UnboundRelation + * + * After rewrite: + * Project(name) + * |---Project(rewrite) + * |---Project(rewrite_inside) + * |---UnboundRelation */ @Test - public void testMergeGroup() { - UnboundRelation relation1 = new UnboundRelation(Lists.newArrayList("A")); - LogicalProject project1 = new LogicalProject( - ImmutableList.of(new SlotReference(new ExprId(1), "name", StringType.INSTANCE, true, ImmutableList.of("test"))), - relation1 + public void testRewrite() { + UnboundRelation unboundRelation = new UnboundRelation(Lists.newArrayList("test")); + LogicalProject insideProject = new LogicalProject<>( + ImmutableList.of(new SlotReference("name", StringType.INSTANCE, true, ImmutableList.of("test"))), + unboundRelation ); - - Memo memo = new Memo(project1); - - UnboundRelation relation2 = new UnboundRelation(Lists.newArrayList("B")); - LogicalProject project2 = new LogicalProject( - ImmutableList.of(new SlotReference(new ExprId(1), "name", StringType.INSTANCE, true, ImmutableList.of("test"))), - relation2 + LogicalProject rootProject = new LogicalProject<>( + ImmutableList.of(new SlotReference("name", StringType.INSTANCE, true, ImmutableList.of("test"))), + insideProject ); - memo.copyIn(project2, null, false); - Assertions.assertEquals(4, memo.getGroups().size()); - LogicalProject project3 = new LogicalProject( - ImmutableList.of(new SlotReference(new ExprId(1), "other", StringType.INSTANCE, true, ImmutableList.of("other"))), - relation2 + // Project -> Project -> Relation + Memo memo = new Memo(rootProject); + Group leafGroup = memo.getGroups().stream().filter(g -> g.getGroupId().asInt() == 0).findFirst().get(); + Group targetGroup = memo.getGroups().stream().filter(g -> g.getGroupId().asInt() == 1).findFirst().get(); + LogicalProject rewriteInsideProject = new LogicalProject<>( + ImmutableList.of(new SlotReference("rewrite_inside", StringType.INSTANCE, + false, ImmutableList.of("test"))), + new GroupPlan(leafGroup) ); + LogicalProject rewriteProject = new LogicalProject<>( + ImmutableList.of(new SlotReference("rewrite", StringType.INSTANCE, + true, ImmutableList.of("test"))), + rewriteInsideProject + ); + memo.copyIn(rewriteProject, targetGroup, true); - memo.copyIn(project3, null, false); - - //after copyIn, group#2 contains relationA and relationB - memo.copyIn(relation1, memo.getGroups().get(2), true); - + Assertions.assertEquals(4, memo.getGroups().size()); + Plan node = memo.copyOut(); + Assertions.assertTrue(node instanceof LogicalProject); + Assertions.assertEquals("name", ((LogicalProject<?>) node).getProjects().get(0).getName()); + node = node.child(0); + Assertions.assertTrue(node instanceof LogicalProject); + Assertions.assertEquals("rewrite", ((LogicalProject<?>) node).getProjects().get(0).getName()); + node = node.child(0); + Assertions.assertTrue(node instanceof LogicalProject); + Assertions.assertEquals("rewrite_inside", ((LogicalProject<?>) node).getProjects().get(0).getName()); + node = node.child(0); + Assertions.assertTrue(node instanceof UnboundRelation); + Assertions.assertEquals("test", ((UnboundRelation) node).getTableName()); + } - Assertions.assertEquals(3, memo.getGroups().size()); + /** + * Original: + * Group 0: UnboundRelation C + * Group 1: UnboundRelation B + * Group 2: UnboundRelation A + * Group 3: Join(Group 1, Group 2) + * Group 4: Join(Group 0, Group 3) + * Group 5: Filter(Group 4) + * Group 6: Join(Group 2, Group 1) + * Group 7: Join(Group 0, Group 6) + * + * Then: + * Copy In Join(Group 2, Group 1) into Group 3 + * + * Expected: + * Group 0: UnboundRelation C + * Group 1: UnboundRelation B + * Group 2: UnboundRelation A + * Group 5: Filter(Group 7) + * Group 6: Join(Group 2, Group 1), Join(Group 1, Group 2) + * Group 7: Join(Group 0, Group 6) + */ + @Test + public void testMergeGroup() { + UnboundRelation unboundRelationA = new UnboundRelation(Lists.newArrayList("A")); + UnboundRelation unboundRelationB = new UnboundRelation(Lists.newArrayList("B")); + UnboundRelation unboundRelationC = new UnboundRelation(Lists.newArrayList("C")); + LogicalJoin logicalJoinAB = new LogicalJoin<>(JoinType.INNER_JOIN, unboundRelationA, unboundRelationB); + LogicalJoin logicalJoinBA = new LogicalJoin<>(JoinType.INNER_JOIN, unboundRelationB, unboundRelationA); + LogicalJoin logicalJoinCAB = new LogicalJoin<>(JoinType.INNER_JOIN, unboundRelationC, logicalJoinAB); + LogicalJoin logicalJoinCBA = new LogicalJoin<>(JoinType.INNER_JOIN, unboundRelationC, logicalJoinBA); + LogicalFilter logicalFilter = new LogicalFilter<>(new BooleanLiteral(true), logicalJoinCBA); + + Memo memo = new Memo(logicalFilter); + memo.copyIn(logicalJoinCAB, null, false); + Assertions.assertEquals(8, memo.getGroups().size()); + Assertions.assertEquals(8, memo.getGroupExpressions().size()); + + Group target = memo.getRoot().getLogicalExpression().child(0).getLogicalExpression().child(1); + LogicalJoin repeat = new LogicalJoin<>(JoinType.INNER_JOIN, unboundRelationA, unboundRelationB); + memo.copyIn(repeat, target, false); + Assertions.assertEquals(6, memo.getGroups().size()); + Assertions.assertEquals(7, memo.getGroupExpressions().size()); Group root = memo.getRoot(); Assertions.assertEquals(1, root.getLogicalExpressions().size()); - Assertions.assertEquals(PlanType.LOGICAL_PROJECT, root.logicalExpressionsAt(0).getPlan().getType()); - GroupExpression rootExpression = root.logicalExpressionsAt(0); - Assertions.assertEquals(1, rootExpression.children().size()); - //two expressions: relationA and relationB - Assertions.assertEquals(2, rootExpression.child(0).getLogicalExpressions().size()); - GroupExpression childExpression = rootExpression.child(0).logicalExpressionsAt(0); - Assertions.assertEquals(PlanType.LOGICAL_UNBOUND_RELATION, childExpression.getPlan().getType()); - - Group groupProjct3 = memo.getGroups().get(2); //group for project3 - Group groupRelation = memo.getGroups().get(0); //group for relation - //group0 is child of group4 - Assertions.assertEquals(groupRelation, groupProjct3.logicalExpressionsAt(0).child(0)); - Assertions.assertEquals(1, groupProjct3.getLogicalExpressions().size()); - Assertions.assertEquals(1, groupProjct3.logicalExpressionsAt(0).children().size()); + GroupExpression filter = root.getLogicalExpression(); + GroupExpression joinCBA = filter.child(0).getLogicalExpression(); + Assertions.assertEquals(1, joinCBA.child(0).getLogicalExpressions().size()); + Assertions.assertEquals(2, joinCBA.child(1).getLogicalExpressions().size()); + GroupExpression joinBA = joinCBA.child(1).getLogicalExpressions().get(0); + GroupExpression joinAB = joinCBA.child(1).getLogicalExpressions().get(1); + Assertions.assertTrue(joinAB.getPlan() instanceof LogicalJoin); + Assertions.assertTrue(joinBA.getPlan() instanceof LogicalJoin); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java index e731c26776..ef082e48c5 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java @@ -17,7 +17,7 @@ package org.apache.doris.nereids.trees.expressions; -import org.apache.doris.nereids.tpch.AnalyzeCheckTestBase; +import org.apache.doris.nereids.datasets.tpch.AnalyzeCheckTestBase; import org.junit.jupiter.api.Test; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/plan/TestPlanOutput.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/TestPlanOutput.java similarity index 97% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/plan/TestPlanOutput.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/TestPlanOutput.java index 2d93b1b802..6278ac14b3 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/plan/TestPlanOutput.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/TestPlanOutput.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.plan; +package org.apache.doris.nereids.trees.plans; import org.apache.doris.catalog.AggregateType; import org.apache.doris.catalog.Column; @@ -26,8 +26,6 @@ import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.trees.expressions.Slot; -import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalRelation; import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org