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]

Reply via email to