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

Reply via email to