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]