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