This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 6254258357 [Feature](Nereids) eliminate project when child is empty
relation (#16210)
6254258357 is described below
commit 625425835740faa3e0d12a038908a8695d648e6e
Author: mch_ucchi <[email protected]>
AuthorDate: Mon Jan 30 11:28:07 2023 +0800
[Feature](Nereids) eliminate project when child is empty relation (#16210)
---
.../rewrite/logical/EliminateUnnecessaryProject.java | 9 ++++++++-
.../logical/EliminateUnnecessaryProjectTest.java | 18 ++++++++++++++++++
.../suites/nereids_syntax_p0/explain.groovy | 3 +++
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java
index 61e1f3c99a..0754e6b6ee 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java
@@ -21,6 +21,7 @@ import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory;
import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import com.google.common.collect.ImmutableList;
@@ -67,6 +68,12 @@ public class EliminateUnnecessaryProject implements
RewriteRuleFactory {
} else {
return project.child();
}
- })));
+ })
+ ),
+ RuleType.ELIMINATE_UNNECESSARY_PROJECT.build(
+ logicalProject(logicalEmptyRelation())
+ .then(project -> new
LogicalEmptyRelation(project.getProjects()))
+ )
+ );
}
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java
index 73369adfdc..4c440e68f8 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java
@@ -19,11 +19,14 @@ package org.apache.doris.nereids.rules.rewrite.logical;
import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.rules.Rule;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
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.nereids.types.IntegerType;
import org.apache.doris.nereids.util.LogicalPlanBuilder;
import org.apache.doris.nereids.util.MemoTestUtils;
import org.apache.doris.nereids.util.PlanConstructor;
@@ -98,6 +101,21 @@ public class EliminateUnnecessaryProjectTest extends
TestWithFeService {
Assertions.assertTrue(actual instanceof LogicalProject);
}
+ @Test
+ public void testEliminateProjectWhenEmptyRelationChild() {
+ LogicalPlan unnecessaryProject = new LogicalPlanBuilder(new
LogicalEmptyRelation(ImmutableList.of(
+ new SlotReference("k1", IntegerType.INSTANCE),
+ new SlotReference("k2", IntegerType.INSTANCE))))
+ .project(ImmutableList.of(1, 0))
+ .build();
+ CascadesContext cascadesContext =
MemoTestUtils.createCascadesContext(unnecessaryProject);
+ List<Rule> rules = Lists.newArrayList(new
EliminateUnnecessaryProject().buildRules());
+ cascadesContext.topDownRewrite(rules);
+
+ Plan actual = cascadesContext.getMemo().copyOut();
+ Assertions.assertTrue(actual instanceof LogicalEmptyRelation);
+ }
+
// TODO: uncomment this after the Elimination project rule is correctly
implemented
// @Test
// public void testEliminationForThoseNeitherDoPruneNorDoExprCalc() {
diff --git a/regression-test/suites/nereids_syntax_p0/explain.groovy
b/regression-test/suites/nereids_syntax_p0/explain.groovy
index 251b490b26..c30245edce 100644
--- a/regression-test/suites/nereids_syntax_p0/explain.groovy
+++ b/regression-test/suites/nereids_syntax_p0/explain.groovy
@@ -64,4 +64,7 @@ suite("nereids_explain") {
"""
contains "SlotDescriptor{id=0, col=null, colUniqueId=null, type=FLOAT,
nullable=false}"
}
+
+ def explainStr = sql("select sum(if(lo_tax=1,lo_tax,0)) from lineorder
where false").toString()
+ assertTrue(!explainStr.contains("projections"))
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]