This is an automated email from the ASF dual-hosted git repository. jakevin 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 3c6b96b9be [enhancement](Nereids) avoid add project that output same with child to memo (#14180) 3c6b96b9be is described below commit 3c6b96b9be3e0c4ecf573e4db564355a7100d741 Author: morrySnow <101034200+morrys...@users.noreply.github.com> AuthorDate: Thu Dec 1 10:49:44 2022 +0800 [enhancement](Nereids) avoid add project that output same with child to memo (#14180) --- .../java/org/apache/doris/nereids/memo/Memo.java | 17 ++++++++++++++- .../org/apache/doris/nereids/memo/MemoTest.java | 8 +++---- .../join/SemiJoinSemiJoinTransposeProjectTest.java | 25 +++++++++------------- 3 files changed, 30 insertions(+), 20 deletions(-) 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 f66bffd3ec..1ecec2d296 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 @@ -27,6 +27,7 @@ import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import org.apache.doris.statistics.StatsDeriveResult; import com.google.common.base.Preconditions; @@ -283,6 +284,20 @@ public class Memo { * and the second element is a reference of node in Memo */ private CopyInResult doCopyIn(Plan plan, @Nullable Group targetGroup) { + // TODO: this is same with EliminateUnnecessaryProject, + // we need a infra to rewrite plan after every exploration job + if (plan instanceof LogicalProject) { + LogicalProject<Plan> logicalProject = (LogicalProject<Plan>) plan; + if (targetGroup != root) { + if (logicalProject.getOutputSet().equals(logicalProject.child().getOutputSet())) { + return doCopyIn(logicalProject.child(), targetGroup); + } + } else { + if (logicalProject.getOutput().equals(logicalProject.child().getOutput())) { + return doCopyIn(logicalProject.child(), targetGroup); + } + } + } // check logicalproperties, must same output in a Group. if (targetGroup != null && !plan.getLogicalProperties().equals(targetGroup.getLogicalProperties())) { throw new IllegalStateException("Insert a plan into targetGroup but differ in logicalproperties"); @@ -321,7 +336,7 @@ public class Memo { validateRewriteChildGroup(childGroup, targetGroup); childrenGroups.add(childGroup); } else { - childrenGroups.add(doRewrite(child, null).correspondingExpression.getOwnerGroup()); + childrenGroups.add(copyIn(child, null, true).correspondingExpression.getOwnerGroup()); } } return childrenGroups; 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 1735ecec1f..ef385bd37b 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 @@ -123,11 +123,12 @@ class MemoTest implements PatternMatchSupported { .transform( // swap join's children logicalJoin(logicalOlapScan(), logicalOlapScan()).then(joinBA -> + // this project eliminate when copy in, because it's output same with child. new LogicalProject<>(Lists.newArrayList(joinBA.getOutput()), new LogicalJoin<>(JoinType.INNER_JOIN, joinBA.right(), joinBA.left())) )) - .checkGroupNum(6) - .checkGroupExpressionNum(7) + .checkGroupNum(5) + .checkGroupExpressionNum(6) .checkMemo(memo -> { Group root = memo.getRoot(); Assertions.assertEquals(1, root.getLogicalExpressions().size()); @@ -135,8 +136,7 @@ class MemoTest implements PatternMatchSupported { Assertions.assertEquals(2, joinABC.child(0).getLogicalExpressions().size()); Assertions.assertEquals(1, joinABC.child(1).getLogicalExpressions().size()); GroupExpression joinAB = joinABC.child(0).getLogicalExpressions().get(0); - GroupExpression project = joinABC.child(0).getLogicalExpressions().get(1); - GroupExpression joinBA = project.child(0).getLogicalExpression(); + GroupExpression joinBA = joinABC.child(0).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/rules/exploration/join/SemiJoinSemiJoinTransposeProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTransposeProjectTest.java index 56d80933eb..58b816e329 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTransposeProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTransposeProjectTest.java @@ -38,16 +38,16 @@ public class SemiJoinSemiJoinTransposeProjectTest implements PatternMatchSupport @Test public void testSemiProjectSemiCommute() { /* - * t1.name=t3.name t1.id=t2.id + * t1.name=t3.name t1.id=t2.id * topJoin newTopJoin - * / \ / \ - * project t3 project t2 - * t1.name t1.name, t1.id - * | | - * t1.id=t2.id t1.name=t3.name - * bottomJoin --> newBottomJoin - * / \ / \ - * t1 t2 t1 t3 + * / \ / \ + * project t3 t1.name=t3.name t2 + * t1.name --> newBottomJoin + * | / \ + * t1.id=t2.id t1 t3 + * bottomJoin + * / \ + * t1 t2 */ LogicalPlan topJoin = new LogicalPlanBuilder(scan1) .hashJoinUsing(scan2, JoinType.LEFT_ANTI_JOIN, Pair.of(0, 0)) @@ -60,15 +60,10 @@ public class SemiJoinSemiJoinTransposeProjectTest implements PatternMatchSupport .matchesExploration( logicalProject( logicalJoin( - logicalProject( logicalJoin( logicalOlapScan().when(scan -> scan.getTable().getName().equals("t1")), logicalOlapScan().when(scan -> scan.getTable().getName().equals("t3")) - ).when(join -> join.getJoinType() == JoinType.LEFT_SEMI_JOIN) - ).when(project -> project.getProjects().size() == 2 - && project.getProjects().get(0).getName().equals("id") - && project.getProjects().get(1).getName().equals("name") - ), + ).when(join -> join.getJoinType() == JoinType.LEFT_SEMI_JOIN), logicalOlapScan().when(scan -> scan.getTable().getName().equals("t2")) ).when(join -> join.getJoinType() == JoinType.LEFT_ANTI_JOIN) ) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org