From da182a8b6f5eb5a2615f51a03d70ae68c16e21ee Mon Sep 17 00:00:00 2001 From: minghong Date: Tue, 9 Jan 2024 16:15:59 +0800 Subject: [PATCH] [feature](nereids)print nereids node id in explain (#29238) * print nereids id in explain --- .../translator/PhysicalPlanTranslator.java | 82 ++++++++++++------- .../nereids/trees/plans/AbstractPlan.java | 9 +- .../doris/nereids/trees/plans/ObjectId.java | 5 -- .../plans/physical/PhysicalOlapScan.java | 7 +- .../org/apache/doris/planner/PlanNode.java | 12 ++- .../nereids_p0/expression/topn_to_max.groovy | 2 +- 6 files changed, 68 insertions(+), 49 deletions(-) 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 1e72200f15..0de4b9497a 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 @@ -283,7 +283,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor validOutputIds = distribute.getOutputExprIds(); if (distribute.child() instanceof PhysicalHashAggregate) { @@ -463,13 +463,13 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor tupleIds = new ArrayList<>(); tupleIds.add(tupleDescriptor.getId()); - EmptySetNode emptySetNode = new EmptySetNode(emptyRelation.translatePlanNodeId(), tupleIds); - + EmptySetNode emptySetNode = new EmptySetNode(context.nextPlanNodeId(), tupleIds); + emptySetNode.setNereidsId(emptyRelation.getId()); PlanFragment planFragment = createPlanFragment(emptySetNode, DataPartition.UNPARTITIONED, emptyRelation); context.addPlanFragment(planFragment); @@ -542,7 +542,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor slots = esScan.getOutput(); ExternalTable table = esScan.getTable(); TupleDescriptor tupleDescriptor = generateTupleDesc(slots, table, context); - EsScanNode esScanNode = new EsScanNode(esScan.translatePlanNodeId(), tupleDescriptor, true); + EsScanNode esScanNode = new EsScanNode(context.nextPlanNodeId(), tupleDescriptor, true); + esScanNode.setNereidsId(esScan.getId()); esScanNode.addConjuncts(translateToLegacyConjuncts(esScan.getConjuncts())); Utils.execWithUncheckedException(esScanNode::init); context.addScanNode(esScanNode); @@ -564,8 +565,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor slots = jdbcScan.getOutput(); TableIf table = jdbcScan.getTable(); TupleDescriptor tupleDescriptor = generateTupleDesc(slots, table, context); - JdbcScanNode jdbcScanNode = new JdbcScanNode(jdbcScan.translatePlanNodeId(), tupleDescriptor, + JdbcScanNode jdbcScanNode = new JdbcScanNode(context.nextPlanNodeId(), tupleDescriptor, table instanceof JdbcExternalTable); + jdbcScanNode.setNereidsId(jdbcScan.getId()); jdbcScanNode.addConjuncts(translateToLegacyConjuncts(jdbcScan.getConjuncts())); Utils.execWithUncheckedException(jdbcScanNode::init); context.addScanNode(jdbcScanNode); @@ -587,8 +589,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor slots = odbcScan.getOutput(); TableIf table = odbcScan.getTable(); TupleDescriptor tupleDescriptor = generateTupleDesc(slots, table, context); - OdbcScanNode odbcScanNode = new OdbcScanNode(odbcScan.translatePlanNodeId(), tupleDescriptor, + OdbcScanNode odbcScanNode = new OdbcScanNode(context.nextPlanNodeId(), tupleDescriptor, (OdbcTable) table); + odbcScanNode.setNereidsId(odbcScan.getId()); odbcScanNode.addConjuncts(translateToLegacyConjuncts(odbcScan.getConjuncts())); Utils.execWithUncheckedException(odbcScanNode::init); context.addScanNode(odbcScanNode); @@ -615,7 +618,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor()); @@ -746,10 +752,11 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor runtimeFilterGenerator.getContext().getTargetListByScan(schemaScan) @@ -771,7 +778,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor runtimeFilterGenerator.getContext().getTargetListByScan(tvfRelation) @@ -850,11 +858,12 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor> distributeExprLists = getDistributeExprs(assertNumRows.child()); // create assertNode - AssertNumRowsNode assertNumRowsNode = new AssertNumRowsNode(assertNumRows.translatePlanNodeId(), + AssertNumRowsNode assertNumRowsNode = new AssertNumRowsNode(context.nextPlanNodeId(), currentFragment.getPlanRoot(), ExpressionTranslator.translateAssert(assertNumRows.getAssertNumRowsElement())); assertNumRowsNode.setDistributeExprLists(distributeExprLists); + assertNumRowsNode.setNereidsId(assertNumRows.getId()); addPlanRoot(currentFragment, assertNumRowsNode, assertNumRows); return currentFragment; } @@ -1054,7 +1064,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor ExpressionTranslator.translate(e, context)) .collect(Collectors.toList()); - HashJoinNode hashJoinNode = new HashJoinNode(hashJoin.translatePlanNodeId(), leftPlanRoot, + HashJoinNode hashJoinNode = new HashJoinNode(context.nextPlanNodeId(), leftPlanRoot, rightPlanRoot, JoinType.toJoinOperator(joinType), execEqConjuncts, Lists.newArrayList(), null, null, null, hashJoin.isMarkJoin()); + hashJoinNode.setNereidsId(hashJoin.getId()); hashJoinNode.setDistributeExprLists(distributeExprLists); PlanFragment currentFragment = connectJoinNode(hashJoinNode, leftFragment, rightFragment, context, hashJoin); @@ -1415,9 +1428,11 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor o.stream() @@ -1983,9 +1999,10 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor implements Pla this.mutableState = this.mutableState.set(key, state); } - /** - * used for PhysicalPlanTranslator only - * @return PlanNodeId - */ - public PlanNodeId translatePlanNodeId() { - return id.toPlanNodeId(); + public int getId() { + return id.asInt(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/ObjectId.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/ObjectId.java index 12cfa4c337..1686ee257b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/ObjectId.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/ObjectId.java @@ -20,7 +20,6 @@ package org.apache.doris.nereids.trees.plans; import org.apache.doris.common.Id; import org.apache.doris.common.IdGenerator; import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator; -import org.apache.doris.planner.PlanNodeId; /** * relation id @@ -47,8 +46,4 @@ public class ObjectId extends Id { public String toString() { return "ObjectId#" + id; } - - public PlanNodeId toPlanNodeId() { - return new PlanNodeId(id); - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java index a4a2d7254b..8f461bc448 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java @@ -120,10 +120,9 @@ public class PhysicalOlapScan extends PhysicalCatalogRelation implements OlapSca @Override public String toString() { - return Utils.toSqlString("PhysicalOlapScan[" + id.asInt() + "]" + getGroupIdWithPrefix(), - "table", table.getName(), - "stats", statistics, - "fr", getMutableState(AbstractPlan.FRAGMENT_ID) + return Utils.toSqlString("PhysicalOlapScan[" + relationId.asInt() + "]" + getGroupIdWithPrefix(), + "qualified", Utils.qualifiedName(qualifier, table.getName()), + "stats", statistics, "fr", getMutableState(AbstractPlan.FRAGMENT_ID) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java index 6885862e09..4cc535be09 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java @@ -153,6 +153,8 @@ public abstract class PlanNode extends TreeNode implements PlanStats { protected List projectList; + protected int nereidsId = -1; + private List> distributeExprLists = new ArrayList<>(); protected PlanNode(PlanNodeId id, ArrayList tupleIds, String planNodeName, @@ -518,7 +520,11 @@ public abstract class PlanNode extends TreeNode implements PlanStats { // Print the current node // The plan node header line will be prefixed by rootPrefix and the remaining details // will be prefixed by detailPrefix. - expBuilder.append(rootPrefix + id.asInt() + ":" + planNodeName + "\n"); + expBuilder.append(rootPrefix + id.asInt() + ":" + planNodeName); + if (nereidsId != -1) { + expBuilder.append("(" + nereidsId + ")"); + } + expBuilder.append("\n"); expBuilder.append(getNodeExplainString(detailPrefix, detailLevel)); if (limit != -1) { expBuilder.append(detailPrefix + "limit: " + limit + "\n"); @@ -1205,4 +1211,8 @@ public abstract class PlanNode extends TreeNode implements PlanStats { public boolean pushDownAggNoGroupingCheckCol(FunctionCallExpr aggExpr, Column col) { return false; } + + public void setNereidsId(int nereidsId) { + this.nereidsId = nereidsId; + } } diff --git a/regression-test/suites/nereids_p0/expression/topn_to_max.groovy b/regression-test/suites/nereids_p0/expression/topn_to_max.groovy index 7bd7904a5a..4ed378144f 100644 --- a/regression-test/suites/nereids_p0/expression/topn_to_max.groovy +++ b/regression-test/suites/nereids_p0/expression/topn_to_max.groovy @@ -30,7 +30,7 @@ suite("test_topn_to_max") { from test_topn_to_max group by k1; ''' - res = sql ''' + def res = sql ''' explain rewritten plan select k1, topn(k2, 1) from test_topn_to_max group by k1;