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 4c751202e3 [fix](Es Catalog) Pushdown predicate of Es catalog query in 
nereids (#23345)
4c751202e3 is described below

commit 4c751202e3b19725e2ff8c7a41aa83e0f8f109b2
Author: Tiewei Fang <43782773+bepppo...@users.noreply.github.com>
AuthorDate: Wed Aug 23 18:03:39 2023 +0800

    [fix](Es Catalog) Pushdown predicate of Es catalog query in nereids (#23345)
---
 .../glue/translator/PhysicalPlanTranslator.java    |  1 +
 .../doris/nereids/jobs/executor/Rewriter.java      |  4 ++-
 .../org/apache/doris/nereids/rules/RuleType.java   |  1 +
 .../LogicalEsScanToPhysicalEsScan.java             |  3 ++-
 .../PushConjunctsIntoEsScan.java}                  | 28 +++++++++------------
 .../nereids/trees/plans/logical/LogicalEsScan.java | 29 +++++++++++++++++++---
 .../trees/plans/physical/PhysicalEsScan.java       | 23 +++++++++++++----
 7 files changed, 62 insertions(+), 27 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 5a83a7acf4..6613fd71a9 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
@@ -481,6 +481,7 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
         ExternalTable table = esScan.getTable();
         TupleDescriptor tupleDescriptor = generateTupleDesc(slots, table, 
context);
         EsScanNode esScanNode = new EsScanNode(context.nextPlanNodeId(), 
tupleDescriptor, true);
+        
esScanNode.addConjuncts(translateToLegacyConjuncts(esScan.getConjuncts()));
         Utils.execWithUncheckedException(esScanNode::init);
         context.addScanNode(esScanNode);
         context.getRuntimeTranslator().ifPresent(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index e134f9822d..07963987fc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -79,6 +79,7 @@ import 
org.apache.doris.nereids.rules.rewrite.PruneFileScanPartition;
 import org.apache.doris.nereids.rules.rewrite.PruneOlapScanPartition;
 import org.apache.doris.nereids.rules.rewrite.PruneOlapScanTablet;
 import org.apache.doris.nereids.rules.rewrite.PullUpCteAnchor;
+import org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoEsScan;
 import org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoJdbcScan;
 import org.apache.doris.nereids.rules.rewrite.PushFilterInsideJoin;
 import org.apache.doris.nereids.rules.rewrite.PushProjectIntoOneRowRelation;
@@ -271,7 +272,8 @@ public class Rewriter extends AbstractBatchJobExecutor {
                     topDown(
                             new PruneOlapScanPartition(),
                             new PruneFileScanPartition(),
-                            new PushConjunctsIntoJdbcScan()
+                            new PushConjunctsIntoJdbcScan(),
+                            new PushConjunctsIntoEsScan()
                     )
             ),
             topic("MV optimization",
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 5bc135ae49..baed7b53ea 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
@@ -221,6 +221,7 @@ public enum RuleType {
     OLAP_SCAN_PARTITION_PRUNE(RuleTypeClass.REWRITE),
     FILE_SCAN_PARTITION_PRUNE(RuleTypeClass.REWRITE),
     PUSH_CONJUNCTS_INTO_JDBC_SCAN(RuleTypeClass.REWRITE),
+    PUSH_CONJUNCTS_INTO_ES_SCAN(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/LogicalEsScanToPhysicalEsScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
index 1e4db2eba1..9e83fec2a1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
@@ -37,7 +37,8 @@ public class LogicalEsScanToPhysicalEsScan extends 
OneImplementationRuleFactory
                 esScan.getQualifier(),
                 DistributionSpecAny.INSTANCE,
                 Optional.empty(),
-                esScan.getLogicalProperties())
+                esScan.getLogicalProperties(),
+                esScan.getConjuncts())
         ).toRule(RuleType.LOGICAL_ES_SCAN_TO_PHYSICAL_ES_SCAN_RULE);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushConjunctsIntoEsScan.java
similarity index 55%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushConjunctsIntoEsScan.java
index 1e4db2eba1..9bd485716d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushConjunctsIntoEsScan.java
@@ -15,29 +15,25 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.rules.implementation;
+package org.apache.doris.nereids.rules.rewrite;
 
-import org.apache.doris.nereids.properties.DistributionSpecAny;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
-import org.apache.doris.nereids.trees.plans.physical.PhysicalEsScan;
-
-import java.util.Optional;
+import org.apache.doris.nereids.trees.plans.logical.LogicalEsScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 
 /**
- * Implementation rule that convert logical JdbcScan to physical JdbcScan.
+ * Rewrite es plan to set the conjuncts.
  */
-public class LogicalEsScanToPhysicalEsScan extends 
OneImplementationRuleFactory {
+public class PushConjunctsIntoEsScan extends OneRewriteRuleFactory {
+
     @Override
     public Rule build() {
-        return logicalEsScan().then(esScan ->
-            new PhysicalEsScan(
-                esScan.getRelationId(),
-                esScan.getTable(),
-                esScan.getQualifier(),
-                DistributionSpecAny.INSTANCE,
-                Optional.empty(),
-                esScan.getLogicalProperties())
-        ).toRule(RuleType.LOGICAL_ES_SCAN_TO_PHYSICAL_ES_SCAN_RULE);
+        return logicalFilter(logicalEsScan()).thenApply(ctx -> {
+            LogicalFilter<LogicalEsScan> filter = ctx.root;
+            LogicalEsScan scan = filter.child();
+            LogicalEsScan rewrittenScan = 
scan.withConjuncts(filter.getConjuncts());
+            return rewrittenScan;
+        }).toRule(RuleType.PUSH_CONJUNCTS_INTO_ES_SCAN);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
index d34f47266f..35c722083d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
@@ -20,6 +20,7 @@ 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.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
@@ -27,26 +28,32 @@ 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.ImmutableSet;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * Logical scan for external es catalog.
  */
 public class LogicalEsScan extends LogicalCatalogRelation {
 
+    private final Set<Expression> conjuncts;
+
     /**
      * Constructor for LogicalEsScan.
      */
     public LogicalEsScan(RelationId id, ExternalTable table, List<String> 
qualifier,
                            Optional<GroupExpression> groupExpression,
-                           Optional<LogicalProperties> logicalProperties) {
+                           Optional<LogicalProperties> logicalProperties, 
Set<Expression> conjuncts) {
         super(id, PlanType.LOGICAL_ES_SCAN, table, qualifier, groupExpression, 
logicalProperties);
+        this.conjuncts = ImmutableSet.copyOf(Objects.requireNonNull(conjuncts, 
"conjuncts should not be null"));
     }
 
     public LogicalEsScan(RelationId id, ExternalTable table, List<String> 
qualifier) {
-        this(id, table, qualifier, Optional.empty(), Optional.empty());
+        this(id, table, qualifier, Optional.empty(), Optional.empty(), 
ImmutableSet.of());
     }
 
     @Override
@@ -66,13 +73,19 @@ public class LogicalEsScan extends LogicalCatalogRelation {
     @Override
     public LogicalEsScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
         return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
groupExpression,
-            Optional.of(getLogicalProperties()));
+            Optional.of(getLogicalProperties()), conjuncts);
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
-        return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
groupExpression, logicalProperties);
+        return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
groupExpression, logicalProperties,
+                conjuncts);
+    }
+
+    public LogicalEsScan withConjuncts(Set<Expression> conjuncts) {
+        return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
groupExpression,
+                Optional.of(getLogicalProperties()), conjuncts);
     }
 
     @Override
@@ -80,4 +93,12 @@ public class LogicalEsScan extends LogicalCatalogRelation {
         return visitor.visitLogicalEsScan(this, context);
     }
 
+    @Override
+    public boolean equals(Object o) {
+        return super.equals(o) && Objects.equals(conjuncts, ((LogicalEsScan) 
o).conjuncts);
+    }
+
+    public Set<Expression> getConjuncts() {
+        return this.conjuncts;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEsScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEsScan.java
index 4ee49ca198..eaddff7a26 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEsScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEsScan.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.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
@@ -29,8 +30,12 @@ import 
org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.statistics.Statistics;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * Physical es scan for external catalog.
@@ -38,15 +43,17 @@ import java.util.Optional;
 public class PhysicalEsScan extends PhysicalCatalogRelation {
 
     private final DistributionSpec distributionSpec;
+    private final Set<Expression> conjuncts;
 
     /**
      * Constructor for PhysicalEsScan.
      */
     public PhysicalEsScan(RelationId id, ExternalTable table, List<String> 
qualifier,
             DistributionSpec distributionSpec, Optional<GroupExpression> 
groupExpression,
-            LogicalProperties logicalProperties) {
+            LogicalProperties logicalProperties, Set<Expression> conjuncts) {
         super(id, PlanType.PHYSICAL_ES_SCAN, table, qualifier, 
groupExpression, logicalProperties);
         this.distributionSpec = distributionSpec;
+        this.conjuncts = ImmutableSet.copyOf(Objects.requireNonNull(conjuncts, 
"conjuncts should not be null"));
     }
 
     /**
@@ -54,10 +61,12 @@ public class PhysicalEsScan extends PhysicalCatalogRelation 
{
      */
     public PhysicalEsScan(RelationId id, ExternalTable table, List<String> 
qualifier,
             DistributionSpec distributionSpec, Optional<GroupExpression> 
groupExpression,
-            LogicalProperties logicalProperties, PhysicalProperties 
physicalProperties, Statistics statistics) {
+            LogicalProperties logicalProperties, PhysicalProperties 
physicalProperties, Statistics statistics,
+            Set<Expression> conjuncts) {
         super(id, PlanType.PHYSICAL_ES_SCAN, table, qualifier, 
groupExpression, logicalProperties,
                 physicalProperties, statistics);
         this.distributionSpec = distributionSpec;
+        this.conjuncts = ImmutableSet.copyOf(Objects.requireNonNull(conjuncts, 
"conjuncts should not be null"));
     }
 
     @Override
@@ -77,14 +86,14 @@ public class PhysicalEsScan extends PhysicalCatalogRelation 
{
     @Override
     public PhysicalEsScan withGroupExpression(Optional<GroupExpression> 
groupExpression) {
         return new PhysicalEsScan(relationId, getTable(), qualifier, 
distributionSpec,
-                groupExpression, getLogicalProperties());
+                groupExpression, getLogicalProperties(), conjuncts);
     }
 
     @Override
     public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression> 
groupExpression,
             Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
         return new PhysicalEsScan(relationId, getTable(), qualifier, 
distributionSpec,
-                groupExpression, logicalProperties.get());
+                groupExpression, logicalProperties.get(), conjuncts);
     }
 
     @Override
@@ -96,6 +105,10 @@ public class PhysicalEsScan extends PhysicalCatalogRelation 
{
     public PhysicalEsScan withPhysicalPropertiesAndStats(PhysicalProperties 
physicalProperties,
                                                            Statistics 
statsDeriveResult) {
         return new PhysicalEsScan(relationId, getTable(), qualifier, 
distributionSpec,
-                groupExpression, getLogicalProperties(), physicalProperties, 
statsDeriveResult);
+                groupExpression, getLogicalProperties(), physicalProperties, 
statsDeriveResult, conjuncts);
+    }
+
+    public Set<Expression> getConjuncts() {
+        return this.conjuncts;
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to