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

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

commit bb91c3a1cfd9ff5735a522733c17e372e1eea590
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Sun Feb 18 20:39:30 2024 +0800

    [enhancement](neredis)add PushDownFilterThroughGenerate rule (#31057)
---
 .../org/apache/doris/nereids/rules/RuleSet.java    |  2 +
 .../org/apache/doris/nereids/rules/RuleType.java   |  1 +
 .../rewrite/PushDownFilterThroughGenerate.java     | 66 ++++++++++++++++++++++
 .../suites/nereids_syntax_p0/lateral_view.groovy   |  6 +-
 4 files changed, 74 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
index de0f3d518fa..f2b5091fd37 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
@@ -93,6 +93,7 @@ import org.apache.doris.nereids.rules.rewrite.MergeProjects;
 import org.apache.doris.nereids.rules.rewrite.PushDownAliasThroughJoin;
 import 
org.apache.doris.nereids.rules.rewrite.PushDownExpressionsInHashCondition;
 import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughAggregation;
+import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughGenerate;
 import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughJoin;
 import 
org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughPartitionTopN;
 import org.apache.doris.nereids.rules.rewrite.PushDownFilterThroughProject;
@@ -141,6 +142,7 @@ public class RuleSet {
             new PushDownFilterThroughAggregation(),
             new PushDownFilterThroughRepeat(),
             new PushDownFilterThroughSetOperation(),
+            new PushDownFilterThroughGenerate(),
             new PushDownProjectThroughLimit(),
             new EliminateOuterJoin(),
             new ConvertOuterJoinToAntiJoin(),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index 106400ac197..653deb47bdf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -157,6 +157,7 @@ public enum RuleType {
     PUSH_DOWN_ALIAS_INTO_UNION_ALL(RuleTypeClass.REWRITE),
     PUSH_DOWN_FILTER_THROUGH_SET_OPERATION(RuleTypeClass.REWRITE),
     PUSH_DOWN_FILTER_THROUGH_SORT(RuleTypeClass.REWRITE),
+    PUSH_DOWN_FILTER_THROUGH_GENERATE(RuleTypeClass.REWRITE),
 
     PUSH_DOWN_FILTER_THROUGH_CTE(RuleTypeClass.REWRITE),
     PUSH_DOWN_FILTER_THROUGH_CTE_ANCHOR(RuleTypeClass.REWRITE),
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
new file mode 100644
index 00000000000..9e2c980acb5
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughGenerate.java
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+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.
+ */
+public class PushDownFilterThroughGenerate extends OneRewriteRuleFactory {
+    public static final PushDownFilterThroughGenerate INSTANCE = new 
PushDownFilterThroughGenerate();
+
+    /**
+     * filter-generate to generate->filter
+     */
+    @Override
+    public Rule build() {
+        return logicalFilter(logicalGenerate()).then(filter -> {
+            LogicalGenerate<Plan> generate = filter.child();
+            Set<Slot> childOutputs = generate.child().getOutputSet();
+            Set<Expression> pushDownPredicates = Sets.newHashSet();
+            Set<Expression> remainPredicates = Sets.newHashSet();
+            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..534c81945fe 100644
--- a/regression-test/suites/nereids_syntax_p0/lateral_view.groovy
+++ b/regression-test/suites/nereids_syntax_p0/lateral_view.groovy
@@ -97,5 +97,9 @@ suite("nereids_lateral_view") {
        sql """ insert into test_explode_bitmap values(1, '11', 
bitmap_from_string("1,2,3"));"""
        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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to