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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]