This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new be47a27013 [Fix](multi catalog, nereids)Fix FileQueryScanNode couldn't 
filter partition in nereids planner bug (#19564)
be47a27013 is described below

commit be47a270133021b726163de276754413313a48ee
Author: Jibing-Li <[email protected]>
AuthorDate: Wed May 17 21:39:59 2023 +0800

    [Fix](multi catalog, nereids)Fix FileQueryScanNode couldn't filter 
partition in nereids planner bug (#19564)
    
    Nereids planner add conjuncts to ScanNode after call finalize, this may 
cause external table scan node fail to filter
    useless partition, because external table do the partition prune in the 
finalize method.
    
    This pr is to fix this bug. In the rewrite stage, pass the conjuncts to 
LogicalFileScan object, and eventually pass to
    ScanNode while creating it. So that the ScanNode could use the conjuncts 
while doing finalize.
    
    Why not doing the partition prune in the LogicalFileScan like 
LogicalOlapScan doing?
    
    Because Iceberg api doesn't have the partition concept, it just accept a 
list of Conjuncts,
    so it's easier to pass the conjuncts to ScanNode (Hive, Icegerg, Hudi...) 
and doing the partition prune in there.
---
 .../glue/translator/PhysicalPlanTranslator.java    |  3 ++
 .../doris/nereids/jobs/batch/NereidsRewriter.java  |  4 +-
 .../org/apache/doris/nereids/rules/RuleType.java   |  1 +
 .../LogicalFileScanToPhysicalFileScan.java         |  3 +-
 .../rewrite/logical/PruneFileScanPartition.java    | 43 ++++++++++++++++++++++
 .../trees/plans/logical/LogicalFileScan.java       | 30 +++++++++++++--
 .../trees/plans/physical/PhysicalFileScan.java     | 21 ++++++++---
 7 files changed, 94 insertions(+), 11 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 87a3cc4318..1b151131db 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -672,6 +672,9 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
             scanNode = new IcebergScanNode(context.nextPlanNodeId(), 
tupleDescriptor, false);
         }
         Preconditions.checkNotNull(scanNode);
+        fileScan.getConjuncts().stream()
+            .map(e -> ExpressionTranslator.translate(e, context))
+            .forEach(scanNode::addConjunct);
         TableName tableName = new TableName(null, "", "");
         TableRef ref = new TableRef(tableName, null, null);
         BaseTableRef tableRef = new BaseTableRef(ref, table, tableName);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java
index 3302c6ff06..b09de54a85 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java
@@ -61,6 +61,7 @@ import 
org.apache.doris.nereids.rules.rewrite.logical.MergeProjects;
 import org.apache.doris.nereids.rules.rewrite.logical.MergeSetOperations;
 import org.apache.doris.nereids.rules.rewrite.logical.NormalizeAggregate;
 import org.apache.doris.nereids.rules.rewrite.logical.NormalizeSort;
+import org.apache.doris.nereids.rules.rewrite.logical.PruneFileScanPartition;
 import org.apache.doris.nereids.rules.rewrite.logical.PruneOlapScanPartition;
 import org.apache.doris.nereids.rules.rewrite.logical.PruneOlapScanTablet;
 import org.apache.doris.nereids.rules.rewrite.logical.PushFilterInsideJoin;
@@ -244,7 +245,8 @@ public class NereidsRewriter extends BatchRewriteJob {
                     //       generate one PhysicalLimit if current 
distribution is gather or two
                     //       PhysicalLimits with gather exchange
                     new SplitLimit(),
-                    new PruneOlapScanPartition()
+                    new PruneOlapScanPartition(),
+                    new PruneFileScanPartition()
                 )
             ),
 
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 c910eb4381..7037537f48 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
@@ -188,6 +188,7 @@ public enum RuleType {
     MATERIALIZED_INDEX_PROJECT_FILTER_SCAN(RuleTypeClass.REWRITE),
     MATERIALIZED_INDEX_FILTER_PROJECT_SCAN(RuleTypeClass.REWRITE),
     OLAP_SCAN_PARTITION_PRUNE(RuleTypeClass.REWRITE),
+    FILE_SCAN_PARTITION_PRUNE(RuleTypeClass.REWRITE),
     OLAP_SCAN_TABLET_PRUNE(RuleTypeClass.REWRITE),
     PUSH_AGGREGATE_TO_OLAP_SCAN(RuleTypeClass.REWRITE),
     EXTRACT_SINGLE_TABLE_EXPRESSION_FROM_DISJUNCTION(RuleTypeClass.REWRITE),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
index e277c6b7b1..08e9e9e503 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
@@ -37,7 +37,8 @@ public class LogicalFileScanToPhysicalFileScan extends 
OneImplementationRuleFact
                     fileScan.getQualifier(),
                     DistributionSpecAny.INSTANCE,
                     Optional.empty(),
-                    fileScan.getLogicalProperties())
+                    fileScan.getLogicalProperties(),
+                    fileScan.getConjuncts())
         ).toRule(RuleType.LOGICAL_FILE_SCAN_TO_PHYSICAL_FILE_SCAN_RULE);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFileScanPartition.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFileScanPartition.java
new file mode 100644
index 0000000000..9df916e1b5
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFileScanPartition.java
@@ -0,0 +1,43 @@
+// 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.logical;
+
+import org.apache.doris.nereids.rules.Rule;
+import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFileScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
+
+/**
+ * Used to prune partition of file scan. For different external tables, there 
is no unified partition prune method.
+ * For example, Hive is using hive meta store api to get partitions. Iceberg 
is using Iceberg api to get FileScanTask,
+ * which doesn't return a partition list. So, here we simply pass the conjucts 
to LogicalFileScan, so that different
+ * external file ScanNode could do the partition filter by themselves.
+ */
+public class PruneFileScanPartition extends OneRewriteRuleFactory {
+
+    @Override
+    public Rule build() {
+        return logicalFilter(logicalFileScan()).thenApply(ctx -> {
+            LogicalFilter<LogicalFileScan> filter = ctx.root;
+            LogicalFileScan scan = filter.child();
+            LogicalFileScan rewrittenScan = 
scan.withConjuncts(filter.getConjuncts());
+            return new LogicalFilter<>(filter.getConjuncts(), rewrittenScan);
+        }).toRule(RuleType.FILE_SCAN_PARTITION_PRUNE);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
index c8eb7b1da0..8d53a42cc7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
@@ -20,33 +20,41 @@ package org.apache.doris.nereids.trees.plans.logical;
 import org.apache.doris.catalog.external.ExternalTable;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
+import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.plans.ObjectId;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.Sets;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * Logical file scan for external catalog.
  */
 public class LogicalFileScan extends LogicalRelation {
 
+    private final Set<Expression> conjuncts;
+
     /**
      * Constructor for LogicalFileScan.
      */
     public LogicalFileScan(ObjectId id, ExternalTable table, List<String> 
qualifier,
                            Optional<GroupExpression> groupExpression,
-                           Optional<LogicalProperties> logicalProperties) {
+                           Optional<LogicalProperties> logicalProperties,
+                           Set<Expression> conjuncts) {
         super(id, PlanType.LOGICAL_FILE_SCAN, table, qualifier,
                 groupExpression, logicalProperties);
+        this.conjuncts = conjuncts;
     }
 
     public LogicalFileScan(ObjectId id, ExternalTable table, List<String> 
qualifier) {
-        this(id, table, qualifier, Optional.empty(), Optional.empty());
+        this(id, table, qualifier, Optional.empty(), Optional.empty(), 
Sets.newHashSet());
     }
 
     @Override
@@ -63,20 +71,34 @@ public class LogicalFileScan extends LogicalRelation {
         );
     }
 
+    @Override
+    public boolean equals(Object o) {
+        return super.equals(o) && Objects.equals(conjuncts, ((LogicalFileScan) 
o).conjuncts);
+    }
+
     @Override
     public LogicalFileScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
         return new LogicalFileScan(id, (ExternalTable) table, qualifier, 
groupExpression,
-                Optional.of(getLogicalProperties()));
+                Optional.of(getLogicalProperties()), conjuncts);
     }
 
     @Override
     public LogicalFileScan withLogicalProperties(Optional<LogicalProperties> 
logicalProperties) {
         return new LogicalFileScan(id, (ExternalTable) table, qualifier, 
groupExpression,
-            logicalProperties);
+            logicalProperties, conjuncts);
+    }
+
+    public LogicalFileScan withConjuncts(Set<Expression> conjuncts) {
+        return new LogicalFileScan(id, (ExternalTable) table, qualifier, 
groupExpression,
+            Optional.of(getLogicalProperties()), conjuncts);
     }
 
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalFileScan(this, context);
     }
+
+    public Set<Expression> getConjuncts() {
+        return this.conjuncts;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
index 536ef5d7da..5d05c011ad 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
@@ -22,6 +22,7 @@ import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.DistributionSpec;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
+import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.plans.ObjectId;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
@@ -31,6 +32,7 @@ import org.apache.doris.statistics.Statistics;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * Physical file scan for external catalog.
@@ -39,16 +41,18 @@ public class PhysicalFileScan extends PhysicalRelation {
 
     private final ExternalTable table;
     private final DistributionSpec distributionSpec;
+    private final Set<Expression> conjuncts;
 
     /**
      * Constructor for PhysicalFileScan.
      */
     public PhysicalFileScan(ObjectId id, ExternalTable table, List<String> 
qualifier,
                             DistributionSpec distributionSpec, 
Optional<GroupExpression> groupExpression,
-                            LogicalProperties logicalProperties) {
+                            LogicalProperties logicalProperties, 
Set<Expression> conjuncts) {
         super(id, PlanType.PHYSICAL_FILE_SCAN, qualifier, groupExpression, 
logicalProperties);
         this.table = table;
         this.distributionSpec = distributionSpec;
+        this.conjuncts = conjuncts;
     }
 
     /**
@@ -57,11 +61,12 @@ public class PhysicalFileScan extends PhysicalRelation {
     public PhysicalFileScan(ObjectId id, ExternalTable table, List<String> 
qualifier,
                             DistributionSpec distributionSpec, 
Optional<GroupExpression> groupExpression,
                             LogicalProperties logicalProperties, 
PhysicalProperties physicalProperties,
-                            Statistics statistics) {
+                            Statistics statistics, Set<Expression> conjuncts) {
         super(id, PlanType.PHYSICAL_FILE_SCAN, qualifier, groupExpression, 
logicalProperties,
                 physicalProperties, statistics);
         this.table = table;
         this.distributionSpec = distributionSpec;
+        this.conjuncts = conjuncts;
     }
 
     @Override
@@ -97,12 +102,14 @@ public class PhysicalFileScan extends PhysicalRelation {
 
     @Override
     public PhysicalFileScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
-        return new PhysicalFileScan(id, table, qualifier, distributionSpec, 
groupExpression, getLogicalProperties());
+        return new PhysicalFileScan(id, table, qualifier, distributionSpec,
+            groupExpression, getLogicalProperties(), conjuncts);
     }
 
     @Override
     public PhysicalFileScan withLogicalProperties(Optional<LogicalProperties> 
logicalProperties) {
-        return new PhysicalFileScan(id, table, qualifier, distributionSpec, 
groupExpression, logicalProperties.get());
+        return new PhysicalFileScan(id, table, qualifier, distributionSpec,
+            groupExpression, logicalProperties.get(), conjuncts);
     }
 
     @Override
@@ -114,6 +121,10 @@ public class PhysicalFileScan extends PhysicalRelation {
     public PhysicalFileScan withPhysicalPropertiesAndStats(PhysicalProperties 
physicalProperties,
                                                        Statistics statistics) {
         return new PhysicalFileScan(id, table, qualifier, distributionSpec, 
groupExpression, getLogicalProperties(),
-            physicalProperties, statistics);
+            physicalProperties, statistics, conjuncts);
+    }
+
+    public Set<Expression> getConjuncts() {
+        return this.conjuncts;
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to