Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,17 @@

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.
Expand All @@ -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);
}
}
6 changes: 6 additions & 0 deletions regression-test/suites/nereids_syntax_p0/lateral_view.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}

}