This is an automated email from the ASF dual-hosted git repository. huajianlan pushed a commit to branch nested_column_prune in repository https://gitbox.apache.org/repos/asf/doris.git
commit 7297f64d937b8749c53a2bef385517b051fc40c0 Author: 924060929 <[email protected]> AuthorDate: Wed Oct 22 21:39:38 2025 +0800 push down project through window --- .../org/apache/doris/nereids/rules/RuleType.java | 1 + .../rules/rewrite/PushDownNestedColumn.java | 23 +++++++++++++++++++ .../rules/rewrite/PruneNestedColumnTest.java | 26 ++++++++++++++++++++++ 3 files changed, 50 insertions(+) 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 efdcc150b7b..0ca77df2f9c 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 @@ -197,6 +197,7 @@ public enum RuleType { // Pushdown nested column project PUSH_DOWN_NESTED_COLUMN_THROUGH_JOIN(RuleTypeClass.REWRITE), PUSH_DOWN_NESTED_COLUMN_THROUGH_UNION(RuleTypeClass.REWRITE), + PUSH_DOWN_NESTED_COLUMN_THROUGH_WINDOW(RuleTypeClass.REWRITE), // Pushdown filter PUSH_DOWN_FILTER_THROUGH_JOIN(RuleTypeClass.REWRITE), PUSH_DOWN_FILTER_THROUGH_LEFT_SEMI_JOIN(RuleTypeClass.REWRITE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownNestedColumn.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownNestedColumn.java index a6e790820a5..d728832d74c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownNestedColumn.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownNestedColumn.java @@ -34,6 +34,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalOneRowRelation; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import org.apache.doris.nereids.trees.plans.logical.LogicalUnion; +import org.apache.doris.nereids.trees.plans.logical.LogicalWindow; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableCollection; @@ -58,6 +59,9 @@ public class PushDownNestedColumn implements RewriteRuleFactory { RuleType.PUSH_DOWN_NESTED_COLUMN_THROUGH_JOIN.build( logicalProject(logicalJoin()).thenApply(this::pushThroughJoin) ), + RuleType.PUSH_DOWN_NESTED_COLUMN_THROUGH_WINDOW.build( + logicalProject(logicalWindow()).thenApply(this::pushThroughWindow) + ), RuleType.PUSH_DOWN_NESTED_COLUMN_THROUGH_UNION.build( logicalProject( logicalUnion().when(u -> u.getQualifier() == Qualifier.ALL) @@ -66,6 +70,25 @@ public class PushDownNestedColumn implements RewriteRuleFactory { ); } + private Plan pushThroughWindow(MatchingContext<LogicalProject<LogicalWindow<Plan>>> ctx) { + LogicalProject<LogicalWindow<Plan>> project = ctx.root; + LogicalWindow<Plan> window = project.child(); + PushdownProjectHelper pushdownProjectHelper + = new PushdownProjectHelper(ctx.statementContext, window); + + Pair<Boolean, List<NamedExpression>> pushProjects + = pushdownProjectHelper.pushDownExpressions(project.getProjects()); + + if (pushProjects.first) { + List<Plan> newWindowChildren = pushdownProjectHelper.buildNewChildren(); + return new LogicalProject<>( + pushProjects.second, + window.withChildren(newWindowChildren) + ); + } + return project; + } + private Plan pushThroughJoin(MatchingContext<LogicalProject<LogicalJoin<Plan, Plan>>> ctx) { LogicalProject<LogicalJoin<Plan, Plan>> project = ctx.root; LogicalJoin<Plan, Plan> join = project.child(); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java index 096839b2e57..080eb13eed1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java @@ -330,6 +330,32 @@ public class PruneNestedColumnTest extends TestWithFeService implements MemoPatt ); } + @Test + public void testPushDownThroughWindow() { + PlanChecker.from(connectContext) + .analyze("select struct_element(s, 'city'), r from (select s, rank() over(partition by id) r from tbl t)a") + .rewrite() + .matches( + logicalResultSink( + logicalProject( + logicalWindow( + logicalProject( + logicalOlapScan() + ).when(p -> { + Assertions.assertEquals(2, p.getProjects().size()); + Assertions.assertTrue(p.getProjects().stream() + .anyMatch(o -> o instanceof Alias && o.child(0) instanceof StructElement)); + return true; + }) + ) + ).when(p -> { + Assertions.assertTrue(p.getProjects().size() == 2 && p.getProjects().get(0) instanceof SlotReference); + return true; + }) + ) + ); + } + @Test public void testPushDownThroughUnion() { PlanChecker.from(connectContext) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
