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
commit f25adf6d03f5a0056c3f4f6189a9e7f2bf07cdfb Author: starocean999 <[email protected]> AuthorDate: Wed Oct 11 16:14:36 2023 +0800 [test](nereids)add more case in PushdownFilterThroughAggregationTest (#24927) --- .../PushdownFilterThroughAggregationTest.java | 58 ++++++++++++++++++++++ .../doris/nereids/util/LogicalPlanBuilder.java | 9 +++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java index c6fe1f64208..80f70f280d9 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregationTest.java @@ -30,6 +30,7 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.Max; import org.apache.doris.nereids.trees.expressions.literal.Literal; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; +import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat; import org.apache.doris.nereids.util.ExpressionUtils; import org.apache.doris.nereids.util.LogicalPlanBuilder; import org.apache.doris.nereids.util.MemoPatternMatchSupported; @@ -41,6 +42,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.junit.jupiter.api.Test; +import java.util.Optional; + public class PushdownFilterThroughAggregationTest implements MemoPatternMatchSupported { private final LogicalOlapScan scan = new LogicalOlapScan(StatementScopeIdGenerator.newRelationId(), PlanConstructor.student, ImmutableList.of("")); @@ -145,4 +148,59 @@ public class PushdownFilterThroughAggregationTest implements MemoPatternMatchSup ); } + @Test + public void pushDownPredicateGroupWithRepeatTest() { + Slot id = scan.getOutput().get(0); + Slot gender = scan.getOutput().get(1); + Slot name = scan.getOutput().get(2); + LogicalRepeat repeatPlan = new LogicalRepeat<>( + ImmutableList.of(ImmutableList.of(id, gender), ImmutableList.of(id)), + ImmutableList.of(id, gender, name), scan); + NamedExpression nameMax = new Alias(new Max(name), "nameMax"); + + final Expression filterPredicateId = new GreaterThan(id, Literal.of(1)); + LogicalPlan plan = new LogicalPlanBuilder(repeatPlan) + .aggGroupUsingIndexAndSourceRepeat(ImmutableList.of(0, 1), ImmutableList.of( + id, gender, nameMax), Optional.of(repeatPlan)) + .filter(filterPredicateId) + .project(ImmutableList.of(0)) + .build(); + + PlanChecker.from(MemoTestUtils.createConnectContext(), plan) + .applyTopDown(new PushdownFilterThroughAggregation()) + .printlnTree() + .matches( + logicalProject( + logicalAggregate( + logicalFilter( + logicalRepeat() + ).when(filter -> filter.getConjuncts().equals(ImmutableSet.of(filterPredicateId))) + ) + ) + ); + + repeatPlan = new LogicalRepeat<>( + ImmutableList.of(ImmutableList.of(id, gender), ImmutableList.of(gender)), + ImmutableList.of(id, gender, name), scan); + plan = new LogicalPlanBuilder(repeatPlan) + .aggGroupUsingIndexAndSourceRepeat(ImmutableList.of(0, 1), ImmutableList.of( + id, gender, nameMax), Optional.of(repeatPlan)) + .filter(filterPredicateId) + .project(ImmutableList.of(0)) + .build(); + + PlanChecker.from(MemoTestUtils.createConnectContext(), plan) + .applyTopDown(new PushdownFilterThroughAggregation()) + .printlnTree() + .matches( + logicalProject( + logicalFilter( + logicalAggregate( + logicalRepeat() + ) + ).when(filter -> filter.getConjuncts().equals(ImmutableSet.of(filterPredicateId))) + ) + ); + } + } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java index f6db183469e..cbe1d7eb980 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java @@ -37,6 +37,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalLimit; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; +import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat; import org.apache.doris.nereids.trees.plans.logical.LogicalSort; import com.google.common.base.Preconditions; @@ -170,13 +171,19 @@ public class LogicalPlanBuilder { public LogicalPlanBuilder aggGroupUsingIndex(List<Integer> groupByKeysIndex, List<NamedExpression> outputExprsList) { + return aggGroupUsingIndexAndSourceRepeat(groupByKeysIndex, outputExprsList, Optional.empty()); + } + + public LogicalPlanBuilder aggGroupUsingIndexAndSourceRepeat(List<Integer> groupByKeysIndex, + List<NamedExpression> outputExprsList, + Optional<LogicalRepeat<?>> sourceRepeat) { Builder<Expression> groupByBuilder = ImmutableList.builder(); for (Integer index : groupByKeysIndex) { groupByBuilder.add(this.plan.getOutput().get(index)); } ImmutableList<Expression> groupByKeys = groupByBuilder.build(); - LogicalAggregate<Plan> agg = new LogicalAggregate<>(groupByKeys, outputExprsList, this.plan); + LogicalAggregate<Plan> agg = new LogicalAggregate<>(groupByKeys, outputExprsList, sourceRepeat, this.plan); return from(agg); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
