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 c816151731..4b227da3c5 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,6 +70,10 @@ public class Group { private Statistics statistics; + private PhysicalProperties chosenProperties; + + private int chosenGroupExpressionId = -1; + /** * Constructor for Group. * @@ -198,10 +202,17 @@ public class Group { * @return {@link Optional} of cost and {@link GroupExpression} of physical plan pair. */ public Optional> getLowestCostPlan(PhysicalProperties physicalProperties) { + chosenProperties = physicalProperties; if (physicalProperties == null || lowestCostPlans.isEmpty()) { + chosenGroupExpressionId = -1; return Optional.empty(); } - return Optional.ofNullable(lowestCostPlans.get(physicalProperties)); + Optional> costAndGroupExpression = + Optional.ofNullable(lowestCostPlans.get(physicalProperties)); + if (costAndGroupExpression.isPresent()) { + chosenGroupExpressionId = costAndGroupExpression.get().second.getId().asInt(); + } + return costAndGroupExpression; } public GroupExpression getBestPlan(PhysicalProperties properties) { @@ -431,6 +442,10 @@ public class Group { for (GroupExpression enforcer : enforcers) { str.append(" ").append(enforcer).append("\n"); } + if (chosenGroupExpressionId != -1) { + str.append(" chosen expression id: ").append(chosenGroupExpressionId).append("\n"); + str.append(" chosen properties: ").append(chosenProperties).append("\n"); + } return str.toString(); } 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 b0da8459f9..4d38176c77 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 @@ -340,4 +340,8 @@ public class GroupExpression { builder.append(" (plan=").append(plan.toString()).append(")"); return builder.toString(); } + + public ObjectId getId() { + return id; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java index 835d1425b7..59f2ffdb2d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputeLogicalPropertiesProcessor.java @@ -20,6 +20,7 @@ package org.apache.doris.nereids.processor.post; import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan; +import org.apache.doris.nereids.util.MutableState; /** * merge consecutive projects @@ -28,6 +29,8 @@ public class RecomputeLogicalPropertiesProcessor extends PlanPostProcessor { @Override public Plan visit(Plan plan, CascadesContext ctx) { PhysicalPlan physicalPlan = (PhysicalPlan) visitChildren(this, plan, ctx); - return physicalPlan.resetLogicalProperties(); + physicalPlan.resetLogicalProperties(); + physicalPlan.setMutableState(MutableState.KEY_GROUP, plan.getGroupIdAsString()); + return physicalPlan; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java index cdea20c74a..cfe4b31aaf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java @@ -209,23 +209,6 @@ public abstract class AbstractPlan extends AbstractTreeNode implements Pla this.mutableState = this.mutableState.set(key, state); } - /** - * used in treeString() - * - * @return "" if groupExpression is empty, o.w. string format of group id - */ - public String getGroupIdAsString() { - String groupId; - if (getGroupExpression().isPresent()) { - groupId = "@" + groupExpression.get().getOwnerGroup().getGroupId().asInt(); - } else if (getMutableState("group").isPresent()) { - groupId = "@" + getMutableState("group").get(); - } else { - groupId = ""; - } - return groupId; - } - @Override public boolean deepEquals(TreeNode o) { AbstractPlan that = (AbstractPlan) o; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java index abefbce492..cf390be1fe 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java @@ -26,6 +26,7 @@ import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.nereids.util.MutableState; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -40,7 +41,6 @@ import java.util.stream.Collectors; * Abstract class for all plan node. */ public interface Plan extends TreeNode { - PlanType getType(); // cache GroupExpression for fast exit from Memo.copyIn. @@ -165,4 +165,25 @@ public interface Plan extends TreeNode { default String shapeInfo() { return this.getClass().getSimpleName(); } + + /** + * used in treeString() + * + * @return "" if groupExpression is empty, o.w. string format of group id + */ + default String getGroupIdAsString() { + String groupId; + if (getGroupExpression().isPresent()) { + groupId = getGroupExpression().get().getOwnerGroup().getGroupId().asInt() + ""; + } else if (getMutableState(MutableState.KEY_GROUP).isPresent()) { + groupId = getMutableState(MutableState.KEY_GROUP).get().toString(); + } else { + groupId = ""; + } + return groupId; + } + + default String getGroupIdWithPrefix() { + return "@" + getGroupIdAsString(); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java index 88fb5394cb..0ebc1426fc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java @@ -70,7 +70,7 @@ public class PhysicalAssertNumRows extends PhysicalUnar @Override public String toString() { - return Utils.toSqlString("PhysicalAssertNumRows" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalAssertNumRows" + getGroupIdWithPrefix(), "assertNumRowsElement", assertNumRowsElement); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java index a3e9da5bf8..66b663ed62 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribute.java @@ -72,7 +72,7 @@ public class PhysicalDistribute extends PhysicalUnary extends PhysicalUnary extends PhysicalUnar @Override public String toString() { - return Utils.toSqlString("PhysicalHashAggregate[" + id.asInt() + "]" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalHashAggregate[" + id.asInt() + "]" + getGroupIdWithPrefix(), "aggPhase", aggregateParam.aggPhase, "aggMode", aggregateParam.aggMode, "maybeUseStreaming", maybeUsingStream, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java index 22f5cbd6ff..94e49a6889 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java @@ -36,6 +36,7 @@ import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.nereids.util.MutableState; import org.apache.doris.nereids.util.Utils; import org.apache.doris.planner.RuntimeFilterId; import org.apache.doris.statistics.Statistics; @@ -161,7 +162,7 @@ public class PhysicalHashJoin< args.add("runtimeFilters"); args.add(runtimeFilters.stream().map(rf -> rf.toString() + " ").collect(Collectors.toList())); } - return Utils.toSqlString("PhysicalHashJoin[" + id.asInt() + "]" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalHashJoin[" + id.asInt() + "]" + getGroupIdWithPrefix(), args.toArray()); } @@ -173,7 +174,7 @@ public class PhysicalHashJoin< Optional.empty(), getLogicalProperties(), physicalProperties, statistics, children.get(0), children.get(1)); if (groupExpression.isPresent()) { - newJoin.setMutableState("group", groupExpression.get().getOwnerGroup().getGroupId().asInt()); + newJoin.setMutableState(MutableState.KEY_GROUP, groupExpression.get().getOwnerGroup().getGroupId().asInt()); } return newJoin; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java index e218d3b235..b6cc19f81b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java @@ -156,7 +156,7 @@ public class PhysicalLimit extends PhysicalUnary extends PhysicalUnar @Override public String toString() { - return Utils.toSqlString("PhysicalPartitionTopN[" + id.asInt() + "]" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalPartitionTopN[" + id.asInt() + "]" + getGroupIdWithPrefix(), "function", function, "partitionKeys", partitionKeys, "orderKeys", orderKeys, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java index 6388a19457..2e3b11f526 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java @@ -77,7 +77,7 @@ public class PhysicalProject extends PhysicalUnary extends AbstractPhysical @Override public String toString() { - return Utils.toSqlString("PhysicalQuickSort[" + id.asInt() + "]" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalQuickSort[" + id.asInt() + "]" + getGroupIdWithPrefix(), "orderKeys", orderKeys, "phase", phase.toString() ); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java index e9b9c4a02e..3cb6f73006 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java @@ -97,7 +97,7 @@ public class PhysicalRepeat extends PhysicalUnary extends AbstractPhysicalSort< @Override public String toString() { - return Utils.toSqlString("PhysicalTopN[" + id.asInt() + "]" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalTopN[" + id.asInt() + "]" + getGroupIdWithPrefix(), "limit", limit, "offset", offset, "orderKeys", orderKeys, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java index 5ff387c3ba..a983932710 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalUnion.java @@ -84,7 +84,7 @@ public class PhysicalUnion extends PhysicalSetOperation implements Union { @Override public String toString() { - return Utils.toSqlString("PhysicalUnion" + getGroupIdAsString(), + return Utils.toSqlString("PhysicalUnion" + getGroupIdWithPrefix(), "qualifier", qualifier, "constantExprsList", constantExprsList, "stats", statistics); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java index 22a78ca887..5632e970a3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalWindow.java @@ -104,7 +104,7 @@ public class PhysicalWindow extends PhysicalUnary Optional get(String key); MutableState set(String key, Object value);