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]