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 <41606806+sohardforan...@users.noreply.github.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to