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

jakevin 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 cbcd5228b7 [enhance](nereids): polish code for mergeGroup(). (#16057)
cbcd5228b7 is described below

commit cbcd5228b7ffc396fc717606f9a927b60483c68c
Author: jakevin <[email protected]>
AuthorDate: Wed Jan 18 21:03:46 2023 +0800

    [enhance](nereids): polish code for mergeGroup(). (#16057)
---
 .../java/org/apache/doris/nereids/memo/Group.java     | 19 ++++++++++++-------
 .../apache/doris/nereids/memo/GroupExpression.java    |  2 ++
 .../main/java/org/apache/doris/nereids/memo/Memo.java |  6 ++++++
 .../properties/EnforceMissingPropertiesHelper.java    |  2 +-
 .../java/org/apache/doris/nereids/util/Utils.java     |  3 +++
 5 files changed, 24 insertions(+), 8 deletions(-)

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 445aaf8d29..7077f4d9d2 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
@@ -70,13 +70,8 @@ public class Group {
      */
     public Group(GroupId groupId, GroupExpression groupExpression, 
LogicalProperties logicalProperties) {
         this.groupId = groupId;
-        if (groupExpression.getPlan() instanceof LogicalPlan) {
-            this.logicalExpressions.add(groupExpression);
-        } else {
-            this.physicalExpressions.add(groupExpression);
-        }
+        addGroupExpression(groupExpression);
         this.logicalProperties = logicalProperties;
-        groupExpression.setOwnerGroup(this);
     }
 
     /**
@@ -111,6 +106,11 @@ public class Group {
         logicalExpressions.add(groupExpression);
     }
 
+    public void addPhysicalExpression(GroupExpression groupExpression) {
+        groupExpression.setOwnerGroup(this);
+        physicalExpressions.add(groupExpression);
+    }
+
     public List<GroupExpression> getLogicalExpressions() {
         return logicalExpressions;
     }
@@ -211,7 +211,7 @@ public class Group {
     /**
      * replace best plan with new properties
      */
-    public void replaceBestPlan(PhysicalProperties oldProperty, 
PhysicalProperties newProperty, double cost) {
+    public void replaceBestPlanProperty(PhysicalProperties oldProperty, 
PhysicalProperties newProperty, double cost) {
         Pair<Double, GroupExpression> pair = lowestCostPlans.get(oldProperty);
         GroupExpression lowestGroupExpr = pair.second;
         lowestGroupExpr.updateLowestCostTable(newProperty,
@@ -298,6 +298,11 @@ public class Group {
             }
         });
         lowestCostPlans.clear();
+
+        // If statistics is null, use other statistics
+        if (target.statistics == null) {
+            target.statistics = this.statistics;
+        }
     }
 
     public boolean isJoinGroup() {
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 d3b03db2ce..a6f3de8763 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
@@ -114,6 +114,7 @@ public class GroupExpression {
     }
 
     public void setChild(int i, Group group) {
+        child(i).removeParentExpression(this);
         children.set(i, group);
         group.addParentExpression(this);
     }
@@ -194,6 +195,7 @@ public class GroupExpression {
 
     /**
      * get the lowest cost when satisfy property
+     *
      * @param property property that needs to be satisfied
      * @return Lowest cost to satisfy that property
      */
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 c58b272586..b51e69318b 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
@@ -95,6 +95,10 @@ public class Memo {
         return ImmutableList.copyOf(groups.values());
     }
 
+    public Group getGroup(GroupId groupId) {
+        return groups.get(groupId);
+    }
+
     public Map<GroupExpression, GroupExpression> getGroupExpressions() {
         return groupExpressions;
     }
@@ -472,7 +476,9 @@ public class Memo {
      * Add enforcer expression into the target group.
      */
     public void addEnforcerPlan(GroupExpression groupExpression, Group group) {
+        Preconditions.checkArgument(groupExpression != null);
         groupExpression.setOwnerGroup(group);
+        // Don't add groupExpression into group's physicalExpressions, it will 
cause dead loop;
     }
 
     private CopyInResult rewriteByExistedPlan(Group targetGroup, Plan 
existedPlan) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/EnforceMissingPropertiesHelper.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/EnforceMissingPropertiesHelper.java
index b8e0fecc38..d17faa787d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/EnforceMissingPropertiesHelper.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/EnforceMissingPropertiesHelper.java
@@ -83,7 +83,7 @@ public class EnforceMissingPropertiesHelper {
      */
     private PhysicalProperties 
enforceDistributionButMeetSort(PhysicalProperties output, PhysicalProperties 
request) {
         groupExpression.getOwnerGroup()
-                .replaceBestPlan(output, PhysicalProperties.ANY, 
groupExpression.getCostByProperties(output));
+                .replaceBestPlanProperty(output, PhysicalProperties.ANY, 
groupExpression.getCostByProperties(output));
         return enforceSortAndDistribution(output, request);
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
index 0b2e12cd08..6609a2938a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
@@ -214,11 +214,14 @@ public class Utils {
      * Replace one item in a list with another item.
      */
     public static <T> void replaceList(List<T> list, T oldItem, T newItem) {
+        boolean result = false;
         for (int i = 0; i < list.size(); i++) {
             if (list.get(i).equals(oldItem)) {
                 list.set(i, newItem);
+                result = true;
             }
         }
+        Preconditions.checkState(result);
     }
 
     /**


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

Reply via email to