This is an automated email from the ASF dual-hosted git repository.
kxiao 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 e85dddf2ceb [enhancement](neredis)add PushDownFilterThroughGenerate
rule (#31057)
e85dddf2ceb is described below
commit e85dddf2ceb4e34e313212f816461d0515e39592
Author: starocean999 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]