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

morrysnow 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 6cde7bc8ad [feature](Nereids) just reserve logical expression in memo 
after do dphyp (#20843)
6cde7bc8ad is described below

commit 6cde7bc8ad1146564f60f77edefba4ac71f34f1f
Author: jakevin <[email protected]>
AuthorDate: Fri Jun 16 18:12:39 2023 +0800

    [feature](Nereids) just reserve logical expression in memo after do dphyp 
(#20843)
    
    After DPHyp, clear all physicalExpression and other,
    just keep logicalExpression as original plan as input of cascades optimize.
---
 .../org/apache/doris/nereids/StatementContext.java |  9 +++++++
 .../jobs/cascades/OptimizeGroupExpressionJob.java  |  7 ++++-
 .../doris/nereids/jobs/executor/Optimizer.java     | 30 +++++++++++++---------
 .../hypergraph/receiver/PlanReceiver.java          |  7 +----
 .../java/org/apache/doris/nereids/memo/Group.java  |  9 +++++++
 .../apache/doris/nereids/memo/GroupExpression.java |  4 +++
 .../java/org/apache/doris/nereids/memo/Memo.java   | 17 ++++++++++++
 .../org/apache/doris/nereids/rules/RuleSet.java    |  2 +-
 8 files changed, 65 insertions(+), 20 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
index 0d997021bd..a6e73b32fd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
@@ -47,6 +47,7 @@ public class StatementContext {
     private int maxNAryInnerJoin = 0;
 
     private boolean isDpHyp = false;
+    private boolean isOtherJoinReorder = false;
 
     private final IdGenerator<ExprId> exprIdGenerator = 
ExprId.createGenerator();
 
@@ -108,6 +109,14 @@ public class StatementContext {
         isDpHyp = dpHyp;
     }
 
+    public boolean isOtherJoinReorder() {
+        return isOtherJoinReorder;
+    }
+
+    public void setOtherJoinReorder(boolean otherJoinReorder) {
+        isOtherJoinReorder = otherJoinReorder;
+    }
+
     public ExprId getNextExprId() {
         return exprIdGenerator.getNextId();
     }
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 c9fba86d78..1c3247de91 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
@@ -61,12 +61,17 @@ public class OptimizeGroupExpressionJob extends Job {
                 || 
context.getCascadesContext().getMemo().getGroupExpressionsSize() > 
context.getCascadesContext()
                 
.getConnectContext().getSessionVariable().memoMaxGroupExpressionSize;
         boolean isDpHyp = 
context.getCascadesContext().getStatementContext().isDpHyp();
+        boolean isOtherJoinReorder = 
context.getCascadesContext().getStatementContext().isOtherJoinReorder();
         boolean isEnableBushyTree = 
context.getCascadesContext().getConnectContext().getSessionVariable()
                 .isEnableBushyTree();
         if (isDisableJoinReorder) {
             return Collections.emptyList();
         } else if (isDpHyp) {
-            return getRuleSet().getDPHypReorderRules();
+            if (isOtherJoinReorder) {
+                return getRuleSet().getDPHypReorderRules();
+            } else {
+                return Collections.emptyList();
+            }
         } else if (isEnableBushyTree) {
             return getRuleSet().getBushyTreeJoinReorder();
         } else if 
(context.getCascadesContext().getStatementContext().getMaxNAryInnerJoin() <= 5) 
{
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Optimizer.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Optimizer.java
index 00cca76a76..286336d526 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Optimizer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Optimizer.java
@@ -25,6 +25,7 @@ import org.apache.doris.nereids.jobs.joinorder.JoinOrderJob;
 import org.apache.doris.nereids.memo.Group;
 import org.apache.doris.nereids.minidump.MinidumpUtils;
 import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -51,25 +52,23 @@ public class Optimizer {
         // init memo
         cascadesContext.toMemo();
         // stats derive
-        cascadesContext.pushJob(
-                new 
DeriveStatsJob(cascadesContext.getMemo().getRoot().getLogicalExpression(),
-                        cascadesContext.getCurrentJobContext()));
+        cascadesContext.pushJob(new 
DeriveStatsJob(cascadesContext.getMemo().getRoot().getLogicalExpression(),
+                cascadesContext.getCurrentJobContext()));
         cascadesContext.getJobScheduler().executeJobPool(cascadesContext);
         serializeStatUsed(cascadesContext.getConnectContext());
-        // optimize
+        // DPHyp optimize
         StatementContext statementContext = 
cascadesContext.getStatementContext();
-        boolean isDpHyp = 
cascadesContext.getConnectContext().getSessionVariable().enableDPHypOptimizer
-                || statementContext.getMaxNAryInnerJoin() > 
statementContext.getConnectContext()
-                .getSessionVariable().getMaxTableCountUseCascadesJoinReorder();
+        boolean isDpHyp = getSessionVariable().enableDPHypOptimizer || 
statementContext.getMaxNAryInnerJoin()
+                > 
getSessionVariable().getMaxTableCountUseCascadesJoinReorder();
         cascadesContext.getStatementContext().setDpHyp(isDpHyp);
-        if 
(!statementContext.getConnectContext().getSessionVariable().isDisableJoinReorder()
 && isDpHyp) {
+        cascadesContext.getStatementContext().setOtherJoinReorder(false);
+        if (!getSessionVariable().isDisableJoinReorder() && isDpHyp) {
             dpHypOptimize();
         }
 
-        cascadesContext.pushJob(new OptimizeGroupJob(
-                cascadesContext.getMemo().getRoot(),
-                cascadesContext.getCurrentJobContext())
-        );
+        // Cascades optimize
+        cascadesContext.pushJob(
+                new OptimizeGroupJob(cascadesContext.getMemo().getRoot(), 
cascadesContext.getCurrentJobContext()));
         cascadesContext.getJobScheduler().executeJobPool(cascadesContext);
     }
 
@@ -79,6 +78,9 @@ public class Optimizer {
         // Due to EnsureProjectOnTopJoin, root group can't be Join Group, so 
DPHyp doesn't change the root group
         cascadesContext.pushJob(new JoinOrderJob(root, 
cascadesContext.getCurrentJobContext()));
         cascadesContext.getJobScheduler().executeJobPool(cascadesContext);
+        // after DPHyp just keep logical expression
+        cascadesContext.getMemo().removePhysicalExpression();
+        cascadesContext.getStatementContext().setOtherJoinReorder(true);
     }
 
     private void serializeStatUsed(ConnectContext connectContext) {
@@ -95,4 +97,8 @@ public class Optimizer {
                 cascadesContext.getConnectContext().getTotalHistogramMap());
         jsonObj.put("Histogram", histogramArray);
     }
+
+    private SessionVariable getSessionVariable() {
+        return cascadesContext.getConnectContext().getSessionVariable();
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
index 9436c10977..aa9d6f787b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
@@ -29,7 +29,6 @@ import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.memo.Memo;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.properties.PhysicalProperties;
-import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.trees.expressions.EqualTo;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
@@ -326,11 +325,7 @@ public class PlanReceiver implements AbstractReceiver {
             } else {
                 throw new RuntimeException("DPhyp can only handle join and 
project operator");
             }
-            // shadow all join order rule
-            CopyInResult copyInResult = 
jobContext.getCascadesContext().getMemo().copyIn(logicalPlan, root, false);
-            for (Rule rule : 
jobContext.getCascadesContext().getRuleSet().getImplementationRules()) {
-                copyInResult.correspondingExpression.setApplied(rule);
-            }
+            jobContext.getCascadesContext().getMemo().copyIn(logicalPlan, 
root, false);
         }
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
index 5bc32cb64f..3987047371 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
@@ -28,6 +28,7 @@ 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;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalDistribute;
+import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
 import org.apache.doris.nereids.util.TreeStringUtils;
 import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.statistics.Statistics;
@@ -180,6 +181,10 @@ public class Group {
         return move;
     }
 
+    public void clearLowestCostPlans() {
+        lowestCostPlans.clear();
+    }
+
     public double getCostLowerBound() {
         return -1D;
     }
@@ -291,6 +296,10 @@ public class Group {
         return parentExpressions.size();
     }
 
+    public void removeParentPhysicalExpressions() {
+        parentExpressions.entrySet().removeIf(entry -> 
entry.getKey().getPlan() instanceof PhysicalPlan);
+    }
+
     /**
      * move the ownerGroup to target group.
      *
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java
index b921c80000..1757cd7dac 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java
@@ -168,6 +168,10 @@ public class GroupExpression {
         toGroupExpression.ruleMasks.or(ruleMasks);
     }
 
+    public void clearApplied() {
+        ruleMasks.clear();
+    }
+
     public boolean isStatDerived() {
         return statDerived;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
index e10c39c323..d39b92d360 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
@@ -114,6 +114,23 @@ public class Memo {
         return groupExpressions.size();
     }
 
+    /** just keep LogicalExpression in Memo. */
+    public void removePhysicalExpression() {
+        groupExpressions.entrySet().removeIf(entry -> 
entry.getValue().getPlan() instanceof PhysicalPlan);
+
+        for (Group group : groups.values()) {
+            group.clearPhysicalExpressions();
+            group.clearLowestCostPlans();
+            group.removeParentPhysicalExpressions();
+            group.setExplored(false);
+        }
+
+        // logical groupExpression reset ruleMask
+        groupExpressions.values().stream()
+                .filter(groupExpression -> groupExpression.getPlan() 
instanceof LogicalPlan)
+                .forEach(GroupExpression::clearApplied);
+    }
+
     private Plan skipProject(Plan plan, Group targetGroup) {
         // Some top project can't be eliminated
         if (plan instanceof LogicalProject && ((LogicalProject<?>) 
plan).canEliminate()) {
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 2307f0b5c5..8e0a4c07e0 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
@@ -202,7 +202,7 @@ public class RuleSet {
             .build();
 
     public static final List<Rule> DPHYP_REORDER_RULES = 
ImmutableList.<Rule>builder()
-            .add(JoinCommute.NON_INNER.build())
+            .add(JoinCommute.BUSHY.build())
             .addAll(OTHER_REORDER_RULES)
             .build();
 


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

Reply via email to