This is an automated email from the ASF dual-hosted git repository. huajianlan 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 def6f5568e [feature](nereids): enable exploration job (#11867) def6f5568e is described below commit def6f5568e690221e01a8c176c1d5cdd322f6b62 Author: jakevin <jakevin...@gmail.com> AuthorDate: Mon Aug 22 23:38:17 2022 +0800 [feature](nereids): enable exploration job (#11867) Enable the exploration job, and fix related problem. correct the join reorder --- .../org/apache/doris/nereids/NereidsPlanner.java | 2 + .../apache/doris/nereids/cost/CostEstimate.java | 2 +- .../glue/translator/PhysicalPlanTranslator.java | 7 ++++ .../jobs/cascades/ExploreGroupExpressionJob.java | 5 +-- .../jobs/cascades/OptimizeGroupExpressionJob.java | 5 +-- .../org/apache/doris/nereids/rules/RuleSet.java | 2 +- .../rules/exploration/join/JoinCommute.java | 46 ++++++++++------------ .../nereids/trees/plans/logical/LogicalJoin.java | 16 ++++++-- 8 files changed, 47 insertions(+), 38 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index a0a24f9f66..5be733f91c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -121,6 +121,8 @@ public class NereidsPlanner extends Planner { // Get plan directly. Just for SSB. PhysicalPlan physicalPlan = getRoot().extractPlan(); + // TODO: remove above + // PhysicalPlan physicalPlan = chooseBestPlan(getRoot(), PhysicalProperties.ANY); // post-process physical plan out of memo, just for future use. return postprocess(physicalPlan); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostEstimate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostEstimate.java index da60840877..a25d725706 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostEstimate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostEstimate.java @@ -35,7 +35,7 @@ public final class CostEstimate { * Constructor of CostEstimate. */ public CostEstimate(double cpuCost, double memoryCost, double networkCost) { - // TODO: remove them after finish statistics. + // TODO: fix stats if (cpuCost < 0) { cpuCost = 0; } 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 f560adf8eb..56490dd0a0 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 @@ -45,6 +45,7 @@ import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.logical.LogicalSort; import org.apache.doris.nereids.trees.plans.physical.AbstractPhysicalSort; import org.apache.doris.nereids.trees.plans.physical.PhysicalAggregate; +import org.apache.doris.nereids.trees.plans.physical.PhysicalDistribution; import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter; import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin; import org.apache.doris.nereids.trees.plans.physical.PhysicalLimit; @@ -493,6 +494,12 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla return inputFragment; } + @Override + public PlanFragment visitPhysicalDistribution(PhysicalDistribution<Plan> distribution, + PlanTranslatorContext context) { + return distribution.child().accept(this, context); + } + private void extractExecSlot(Expr root, Set<Integer> slotRefList) { if (root instanceof SlotRef) { slotRefList.add(((SlotRef) root).getDesc().getId().asInt()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ExploreGroupExpressionJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ExploreGroupExpressionJob.java index a74b588ff7..6a7a5e59d0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ExploreGroupExpressionJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ExploreGroupExpressionJob.java @@ -25,8 +25,6 @@ import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.pattern.Pattern; import org.apache.doris.nereids.rules.Rule; -import com.google.common.collect.Lists; - import java.util.Comparator; import java.util.List; @@ -50,8 +48,7 @@ public class ExploreGroupExpressionJob extends Job { @Override public void execute() { // TODO: enable exploration job after we test it - // List<Rule<Plan>> explorationRules = getRuleSet().getExplorationRules(); - List<Rule> explorationRules = Lists.newArrayList(); + List<Rule> explorationRules = getRuleSet().getExplorationRules(); List<Rule> validRules = getValidRules(groupExpression, explorationRules); validRules.sort(Comparator.comparingInt(o -> o.getRulePromise().promise())); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java index 4a2a876452..89ae3114f6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java @@ -44,9 +44,8 @@ public class OptimizeGroupExpressionJob extends Job { public void execute() { List<Rule> validRules = new ArrayList<>(); List<Rule> implementationRules = getRuleSet().getImplementationRules(); - // TODO: enable exploration job after we test it - // List<Rule<Plan>> explorationRules = getRuleSet().getExplorationRules(); - // validRules.addAll(getValidRules(groupExpression, explorationRules)); + List<Rule> explorationRules = getRuleSet().getExplorationRules(); + validRules.addAll(getValidRules(groupExpression, explorationRules)); validRules.addAll(getValidRules(groupExpression, implementationRules)); validRules.sort(Comparator.comparingInt(o -> o.getRulePromise().promise())); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java index 692c50c3d4..91b487f934 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java @@ -39,7 +39,7 @@ import java.util.List; */ public class RuleSet { public static final List<Rule> EXPLORATION_RULES = planRuleFactories() - .add(new JoinCommute(true)) + .add(JoinCommute.SWAP_OUTER_SWAP_ZIG_ZAG) .build(); public static final List<Rule> REWRITE_RULES = planRuleFactories() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java index 19bf4491b9..99bac270e3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; /** @@ -32,6 +33,8 @@ public class JoinCommute extends OneExplorationRuleFactory { public static final JoinCommute SWAP_OUTER_COMMUTE_BOTTOM_JOIN = new JoinCommute(true, SwapType.BOTTOM_JOIN); + public static final JoinCommute SWAP_OUTER_SWAP_ZIG_ZAG = new JoinCommute(true, SwapType.ZIG_ZAG); + private final SwapType swapType; private final boolean swapOuter; @@ -51,25 +54,16 @@ public class JoinCommute extends OneExplorationRuleFactory { @Override public Rule build() { - return innerLogicalJoin(any(), any()).then(join -> { - if (!check(join)) { - return null; - } - boolean isBottomJoin = isBottomJoin(join); - if (swapType == SwapType.BOTTOM_JOIN && !isBottomJoin) { - return null; - } - + return innerLogicalJoin().when(this::check).then(join -> { LogicalJoin newJoin = new LogicalJoin( join.getJoinType(), join.getCondition(), join.right(), join.left(), - join.getJoinReorderContext() - ); + join.getJoinReorderContext()); newJoin.getJoinReorderContext().setHasCommute(true); - if (swapType == SwapType.ZIG_ZAG && !isBottomJoin) { - newJoin.getJoinReorderContext().setHasCommuteZigZag(true); - } + // if (swapType == SwapType.ZIG_ZAG && !isBottomJoin(join)) { + // newJoin.getJoinReorderContext().setHasCommuteZigZag(true); + // } return newJoin; }).toRule(RuleType.LOGICAL_JOIN_COMMUTATIVE); @@ -77,6 +71,14 @@ public class JoinCommute extends OneExplorationRuleFactory { private boolean check(LogicalJoin join) { + if (!(join.left() instanceof LogicalPlan) || !(join.right() instanceof LogicalPlan)) { + return false; + } + + if (swapType == SwapType.BOTTOM_JOIN && !isBottomJoin(join)) { + return false; + } + if (join.getJoinReorderContext().hasCommute() || join.getJoinReorderContext().hasExchange()) { return false; } @@ -84,18 +86,12 @@ public class JoinCommute extends OneExplorationRuleFactory { } private boolean isBottomJoin(LogicalJoin join) { - // TODO: wait for tree model of pattern-match. - if (join.left() instanceof LogicalProject) { - LogicalProject project = (LogicalProject) join.left(); - if (project.child() instanceof LogicalJoin) { - return false; - } + // TODO: filter need to be considered? + if (join.left() instanceof LogicalProject && ((LogicalProject) join.left()).child() instanceof LogicalJoin) { + return false; } - if (join.right() instanceof LogicalProject) { - LogicalProject project = (LogicalProject) join.left(); - if (project.child() instanceof LogicalJoin) { - return false; - } + if (join.right() instanceof LogicalProject && ((LogicalProject) join.right()).child() instanceof LogicalJoin) { + return false; } if (join.left() instanceof LogicalJoin || join.right() instanceof LogicalJoin) { return false; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java index 81fbafdde6..77e9bea685 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java @@ -71,7 +71,7 @@ public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends /** * Constructor for LogicalJoinPlan. * - * @param joinType logical type for join + * @param joinType logical type for join * @param condition on clause for join node */ public LogicalJoin(JoinType joinType, Optional<Expression> condition, @@ -82,6 +82,13 @@ public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends this.condition = Objects.requireNonNull(condition, "condition can not be null"); } + public LogicalJoin(JoinType joinType, Optional<Expression> condition, + Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, + LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild, JoinReorderContext joinReorderContext) { + this(joinType, condition, groupExpression, logicalProperties, leftChild, rightChild); + this.joinReorderContext.copyFrom(joinReorderContext); + } + public Optional<Expression> getCondition() { return condition; } @@ -170,17 +177,18 @@ public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends @Override public LogicalBinary<Plan, Plan> withChildren(List<Plan> children) { Preconditions.checkArgument(children.size() == 2); - return new LogicalJoin<>(joinType, condition, children.get(0), children.get(1)); + return new LogicalJoin<>(joinType, condition, children.get(0), children.get(1), joinReorderContext); } @Override public Plan withGroupExpression(Optional<GroupExpression> groupExpression) { return new LogicalJoin<>(joinType, condition, groupExpression, - Optional.of(logicalProperties), left(), right()); + Optional.of(logicalProperties), left(), right(), joinReorderContext); } @Override public Plan withLogicalProperties(Optional<LogicalProperties> logicalProperties) { - return new LogicalJoin<>(joinType, condition, Optional.empty(), logicalProperties, left(), right()); + return new LogicalJoin<>(joinType, condition, Optional.empty(), logicalProperties, left(), right(), + joinReorderContext); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org