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