This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 7a1988e3bc2 [fix](nereids)PushdownFilterThroughGenerate rule can push 
part of predicates down #31057 (#31070)
7a1988e3bc2 is described below

commit 7a1988e3bc2e0a4f3320c9baf56744269c5bcad7
Author: starocean999 <[email protected]>
AuthorDate: Sun Feb 18 20:40:52 2024 +0800

    [fix](nereids)PushdownFilterThroughGenerate rule can push part of 
predicates down #31057 (#31070)
---
 .../rewrite/PushdownFilterThroughGenerate.java     | 27 +++++++++++++++++++---
 .../suites/nereids_syntax_p0/lateral_view.groovy   |  6 +++++
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java
index bae21640a42..e291a66e980 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java
@@ -19,8 +19,17 @@ package org.apache.doris.nereids.rules.rewrite;
 
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate;
+import org.apache.doris.nereids.util.PlanUtils;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+
+import java.util.Set;
 
 /**
  * Push the predicate down through generate.
@@ -35,11 +44,23 @@ public class PushdownFilterThroughGenerate extends 
OneRewriteRuleFactory {
     public Rule build() {
         return logicalFilter(logicalGenerate()).then(filter -> {
             LogicalGenerate<Plan> generate = filter.child();
-            if 
(generate.child().getOutputSet().containsAll(filter.getInputSlots())) {
-                return 
generate.withChildren(filter.withChildren(generate.children()));
-            } else {
+            Set<Slot> childOutputs = generate.child().getOutputSet();
+            Set<Expression> pushDownPredicates = Sets.newLinkedHashSet();
+            Set<Expression> remainPredicates = Sets.newLinkedHashSet();
+            filter.getConjuncts().forEach(conjunct -> {
+                Set<Slot> conjunctSlots = conjunct.getInputSlots();
+                if (!conjunctSlots.isEmpty() && 
childOutputs.containsAll(conjunctSlots)) {
+                    pushDownPredicates.add(conjunct);
+                } else {
+                    remainPredicates.add(conjunct);
+                }
+            });
+            if (pushDownPredicates.isEmpty()) {
                 return null;
             }
+            Plan bottomFilter = new LogicalFilter<>(pushDownPredicates, 
generate.child(0));
+            generate = generate.withChildren(ImmutableList.of(bottomFilter));
+            return PlanUtils.filterOrSelf(remainPredicates, generate);
         }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_GENERATE);
     }
 }
diff --git a/regression-test/suites/nereids_syntax_p0/lateral_view.groovy 
b/regression-test/suites/nereids_syntax_p0/lateral_view.groovy
index f8a3ab42aa8..1d3bbe03772 100644
--- a/regression-test/suites/nereids_syntax_p0/lateral_view.groovy
+++ b/regression-test/suites/nereids_syntax_p0/lateral_view.groovy
@@ -98,4 +98,10 @@ suite("nereids_lateral_view") {
        sql """ insert into test_explode_bitmap values(2, '22', 
bitmap_from_string("22,33,44"));"""
        qt_sql_explode_bitmap """ select dt, e1 from test_explode_bitmap 
lateral view explode_bitmap(user_id) tmp1 as e1 order by dt, e1;"""
 
+    explain {
+            sql("SELECT * FROM nlv_test LATERAL VIEW explode_numbers(c1) lv1 
AS clv1 where c1 < 10 and clv1 > 0;")
+            contains("PREDICATES: c1")
+            contains("PREDICATES: clv1")
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to