From 8531dcb885a40a08991c1f3c17381f8dfdca6098 Mon Sep 17 00:00:00 2001 From: Kikyou1997 <33112463+Kikyou1997@users.noreply.github.com> Date: Mon, 20 Jun 2022 15:16:06 +0800 Subject: [PATCH] [refactor](nereids) Abstract interface of statistics framework for new optimizer reuse (#10240) As the statistics framework could not be reused by new optmizer before, so I abstract some interface to make it reusable. 1. Make Slot extends the Id 2. Add new interface:ExprStats,PlanStats 3. Move definition of PlanNode.NodeType to statistics sub-directory --- .../java/org/apache/doris/analysis/Expr.java | 4 +- .../nereids/trees/expressions/ExprId.java | 38 ++++++++---- .../expressions/NamedExpressionUtil.java | 8 +-- .../nereids/trees/plans/AbstractPlan.java | 36 +++++++++++ .../nereids/trees/plans/PlaceHolderPlan.java | 34 +++++++++++ .../doris/nereids/trees/plans/Plan.java | 3 +- .../plans/physical/AbstractPhysicalPlan.java | 1 + .../apache/doris/planner/AggregationNode.java | 5 +- .../doris/planner/AnalyticEvalNode.java | 3 +- .../doris/planner/AssertNumRowsNode.java | 3 +- .../apache/doris/planner/BrokerScanNode.java | 7 ++- .../apache/doris/planner/CrossJoinNode.java | 3 +- .../apache/doris/planner/EmptySetNode.java | 3 +- .../org/apache/doris/planner/EsScanNode.java | 3 +- .../org/apache/doris/planner/ExceptNode.java | 3 +- .../apache/doris/planner/ExchangeNode.java | 3 +- .../apache/doris/planner/HashJoinNode.java | 5 +- .../apache/doris/planner/HiveScanNode.java | 3 +- .../apache/doris/planner/IcebergScanNode.java | 3 +- .../apache/doris/planner/LoadScanNode.java | 7 ++- .../apache/doris/planner/MysqlScanNode.java | 3 +- .../apache/doris/planner/OdbcScanNode.java | 3 +- .../apache/doris/planner/OlapScanNode.java | 3 +- .../org/apache/doris/planner/PlanNode.java | 61 +++++++------------ .../org/apache/doris/planner/RepeatNode.java | 5 +- .../org/apache/doris/planner/ScanNode.java | 5 +- .../apache/doris/planner/SchemaScanNode.java | 3 +- .../org/apache/doris/planner/SelectNode.java | 5 +- .../doris/planner/SetOperationNode.java | 13 ++-- .../org/apache/doris/planner/SortNode.java | 5 +- .../doris/planner/StreamLoadScanNode.java | 3 +- .../doris/planner/TableFunctionNode.java | 3 +- .../org/apache/doris/planner/UnionNode.java | 5 +- .../planner/external/ExternalScanNode.java | 5 +- .../doris/statistics/AggStatsDerive.java | 3 +- .../doris/statistics/BaseStatsDerive.java | 27 ++++---- .../doris/statistics/DeriveFactory.java | 6 +- .../apache/doris/statistics/ExprStats.java | 33 ++++++++++ .../doris/statistics/HashJoinStatsDerive.java | 3 +- .../doris/statistics/OlapScanStatsDerive.java | 13 ++-- .../apache/doris/statistics/PlanStats.java | 39 ++++++++++++ .../statistics/SlotStatsDeriveResult.java | 52 ++++++++++++++++ .../doris/statistics/StatisticalType.java | 47 ++++++++++++++ .../doris/statistics/StatsDeriveResult.java | 12 ++-- .../statistics/StatsRecursiveDerive.java | 3 +- 45 files changed, 395 insertions(+), 140 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/statistics/ExprStats.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/statistics/PlanStats.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/statistics/SlotStatsDeriveResult.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticalType.java diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java index 5c5a6d8c55..cb6c5d7f0e 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java @@ -31,6 +31,7 @@ import org.apache.doris.common.Config; import org.apache.doris.common.TreeNode; import org.apache.doris.common.io.Writable; import org.apache.doris.common.util.VectorizedUtil; +import org.apache.doris.statistics.ExprStats; import org.apache.doris.thrift.TExpr; import org.apache.doris.thrift.TExprNode; import org.apache.doris.thrift.TExprOpcode; @@ -60,7 +61,8 @@ import java.util.Set; /** * Root of the expr node hierarchy. */ -public abstract class Expr extends TreeNode implements ParseNode, Cloneable, Writable { +public abstract class Expr extends TreeNode implements ParseNode, Cloneable, Writable, ExprStats { + private static final Logger LOG = LogManager.getLogger(Expr.class); // Name of the function that needs to be implemented by every Expr that diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExprId.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExprId.java index 9be4db50b9..c900ea42a7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExprId.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExprId.java @@ -17,23 +17,18 @@ package org.apache.doris.nereids.trees.expressions; +import org.apache.doris.common.Id; +import org.apache.doris.common.IdGenerator; + import java.util.Objects; -import java.util.UUID; /** * UUID for Expression in Nereids. */ -public class ExprId { - private final long id; - private final UUID jvmId; +public class ExprId extends Id { - public ExprId(long id, UUID jvmId) { - this.id = id; - this.jvmId = jvmId; - } - - public long getId() { - return id; + public ExprId(int id) { + super(id); } @Override @@ -45,12 +40,29 @@ public class ExprId { return false; } ExprId exprId = (ExprId) o; - return id == exprId.id && jvmId.equals(exprId.jvmId); + return id == exprId.id; + } + + /** + * Should be only called by {@link org.apache.doris.nereids.trees.expressions.NamedExpressionUtil}. + */ + public static IdGenerator createGenerator() { + return new IdGenerator() { + @Override + public ExprId getNextId() { + return new ExprId(nextId++); + } + + @Override + public ExprId getMaxId() { + return new ExprId(nextId++); + } + }; } @Override public int hashCode() { - return Objects.hash(id, jvmId); + return Objects.hash(id); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java index 610a695475..87a873481a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java @@ -17,8 +17,7 @@ package org.apache.doris.nereids.trees.expressions; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicLong; +import org.apache.doris.common.IdGenerator; /** * The util of named expression. @@ -27,10 +26,9 @@ public class NamedExpressionUtil { /** * Tool class for generate next ExprId. */ - private static final UUID JVM_ID = UUID.randomUUID(); - private static final AtomicLong CURRENT_ID = new AtomicLong(); + private static IdGenerator idIdGenerator = ExprId.createGenerator(); public static ExprId newExprId() { - return new ExprId(CURRENT_ID.getAndIncrement(), JVM_ID); + return idIdGenerator.getNextId(); } } 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 b1f13694b9..d59d8258bf 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 @@ -22,10 +22,14 @@ import org.apache.doris.nereids.operators.plans.PlanOperator; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.trees.AbstractTreeNode; import org.apache.doris.nereids.trees.NodeType; +import org.apache.doris.statistics.ExprStats; +import org.apache.doris.statistics.StatisticalType; +import org.apache.doris.statistics.StatsDeriveResult; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -37,6 +41,8 @@ public abstract class AbstractPlan extends AbstractTreeNode implements Plan { public final OP_TYPE operator; + protected StatsDeriveResult statsDeriveResult; + protected long limit; protected final LogicalProperties logicalProperties; @@ -92,4 +98,34 @@ public abstract class AbstractPlan treeString(lines, depth + 1, newLasts, children.get(i)); } } + + @Override + public List getChildrenStats() { + return Collections.emptyList(); + } + + @Override + public StatsDeriveResult getStatsDeriveResult() { + return statsDeriveResult; + } + + @Override + public StatisticalType getStatisticalType() { + return null; + } + + @Override + public void setStatsDeriveResult(StatsDeriveResult result) { + this.statsDeriveResult = result; + } + + @Override + public long getLimit() { + return limit; + } + + @Override + public List getConjuncts() { + return Collections.emptyList(); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlaceHolderPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlaceHolderPlan.java index 24047896ed..d58e5a46d3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlaceHolderPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlaceHolderPlan.java @@ -24,6 +24,9 @@ import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.trees.NodeType; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.plans.logical.LogicalLeafPlan; +import org.apache.doris.statistics.ExprStats; +import org.apache.doris.statistics.StatisticalType; +import org.apache.doris.statistics.StatsDeriveResult; import com.google.common.base.Preconditions; @@ -81,4 +84,35 @@ public class PlaceHolderPlan extends LogicalLeafPlan getChildrenStats() { + throw new RuntimeException("Unsupported Method"); + } + + @Override + public StatsDeriveResult getStatsDeriveResult() { + throw new RuntimeException("Unsupported Method"); + } + + @Override + public StatisticalType getStatisticalType() { + throw new RuntimeException("Unsupported Method"); + } + + @Override + public void setStatsDeriveResult(StatsDeriveResult result) { + throw new RuntimeException("Unsupported Method"); + } + + @Override + public long getLimit() { + throw new RuntimeException("Unsupported Method"); + } + + @Override + public List getConjuncts() { + throw new RuntimeException("Unsupported Method"); + } + } 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 cb899d7257..1fa17d7a7e 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 @@ -21,13 +21,14 @@ import org.apache.doris.nereids.operators.plans.PlanOperator; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.trees.TreeNode; import org.apache.doris.nereids.trees.expressions.Slot; +import org.apache.doris.statistics.PlanStats; import java.util.List; /** * Abstract class for all plan node. */ -public interface Plan extends TreeNode { +public interface Plan extends TreeNode, PlanStats { PlanOperator getOperator(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java index 736b1d2196..409bb57881 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalPlan.java @@ -77,4 +77,5 @@ public abstract class AbstractPhysicalPlan public PhysicalProperties getPhysicalProperties() { return physicalProperties; } + } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java index ac7c7fee96..a83aedaa49 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java @@ -28,6 +28,7 @@ import org.apache.doris.analysis.SlotId; import org.apache.doris.common.NotImplementedException; import org.apache.doris.common.UserException; import org.apache.doris.common.util.VectorizedUtil; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TAggregationNode; import org.apache.doris.thrift.TExplainLevel; @@ -65,7 +66,7 @@ public class AggregationNode extends PlanNode { * isIntermediate is true if it is a slave node in a 2-part agg plan. */ public AggregationNode(PlanNodeId id, PlanNode input, AggregateInfo aggInfo) { - super(id, aggInfo.getOutputTupleId().asList(), "AGGREGATE", NodeType.AGG_NODE); + super(id, aggInfo.getOutputTupleId().asList(), "AGGREGATE", StatisticalType.AGG_NODE); this.aggInfo = aggInfo; this.children.add(input); this.needsFinalize = true; @@ -76,7 +77,7 @@ public class AggregationNode extends PlanNode { * Copy c'tor used in clone(). */ private AggregationNode(PlanNodeId id, AggregationNode src) { - super(id, src, "AGGREGATE", NodeType.AGG_NODE); + super(id, src, "AGGREGATE", StatisticalType.AGG_NODE); aggInfo = src.aggInfo; needsFinalize = src.needsFinalize; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java index 5e76b8c9b1..670cc4b288 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java @@ -27,6 +27,7 @@ import org.apache.doris.analysis.ExprSubstitutionMap; import org.apache.doris.analysis.OrderByElement; import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TAnalyticNode; import org.apache.doris.thrift.TExplainLevel; @@ -81,7 +82,7 @@ public class AnalyticEvalNode extends PlanNode { AnalyticWindow analyticWindow, TupleDescriptor intermediateTupleDesc, TupleDescriptor outputTupleDesc, ExprSubstitutionMap logicalToPhysicalSmap, Expr partitionByEq, Expr orderByEq, TupleDescriptor bufferedTupleDesc) { - super(id, input.getTupleIds(), "ANALYTIC", NodeType.ANALYTIC_EVAL_NODE); + super(id, input.getTupleIds(), "ANALYTIC", StatisticalType.ANALYTIC_EVAL_NODE); Preconditions.checkState(!tupleIds.contains(outputTupleDesc.getId())); // we're materializing the input row augmented with the analytic output tuple tupleIds.add(outputTupleDesc.getId()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java index 6b8ff8f8ef..969995e4b5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java @@ -20,6 +20,7 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.AssertNumRowsElement; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TAssertNumRowsNode; import org.apache.doris.thrift.TExplainLevel; @@ -43,7 +44,7 @@ public class AssertNumRowsNode extends PlanNode { private AssertNumRowsElement.Assertion assertion; public AssertNumRowsNode(PlanNodeId id, PlanNode input, AssertNumRowsElement assertNumRowsElement) { - super(id, "ASSERT NUMBER OF ROWS", NodeType.ASSERT_NUM_ROWS_NODE); + super(id, "ASSERT NUMBER OF ROWS", StatisticalType.ASSERT_NUM_ROWS_NODE); this.desiredNumOfRows = assertNumRowsElement.getDesiredNumOfRows(); this.subqueryString = assertNumRowsElement.getSubqueryString(); this.assertion = assertNumRowsElement.getAssertion(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/BrokerScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/BrokerScanNode.java index ad9fad055d..16f86de29f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/BrokerScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/BrokerScanNode.java @@ -45,6 +45,7 @@ import org.apache.doris.load.loadv2.LoadTask; import org.apache.doris.mysql.privilege.UserProperty; import org.apache.doris.qe.ConnectContext; import org.apache.doris.resource.Tag; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.system.Backend; import org.apache.doris.system.BeSelectionPolicy; import org.apache.doris.task.LoadTaskInfo; @@ -148,7 +149,7 @@ public class BrokerScanNode extends LoadScanNode { // For broker load and external broker table public BrokerScanNode(PlanNodeId id, TupleDescriptor destTupleDesc, String planNodeName, List> fileStatusesList, int filesAdded) { - super(id, destTupleDesc, planNodeName, NodeType.BROKER_SCAN_NODE); + super(id, destTupleDesc, planNodeName, StatisticalType.BROKER_SCAN_NODE); this.fileStatusesList = fileStatusesList; this.filesAdded = filesAdded; if (ConnectContext.get() != null) { @@ -158,8 +159,8 @@ public class BrokerScanNode extends LoadScanNode { // For hive and iceberg scan node public BrokerScanNode(PlanNodeId id, TupleDescriptor destTupleDesc, String planNodeName, - List> fileStatusesList, int filesAdded, NodeType nodeType) { - super(id, destTupleDesc, planNodeName, nodeType); + List> fileStatusesList, int filesAdded, StatisticalType statisticalType) { + super(id, destTupleDesc, planNodeName, statisticalType); this.fileStatusesList = fileStatusesList; this.filesAdded = filesAdded; if (ConnectContext.get() != null) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java index 59c4c15d61..ac8554c662 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java @@ -20,6 +20,7 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.TableRef; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TPlanNode; @@ -41,7 +42,7 @@ public class CrossJoinNode extends PlanNode { private final TableRef innerRef; public CrossJoinNode(PlanNodeId id, PlanNode outer, PlanNode inner, TableRef innerRef) { - super(id, "CROSS JOIN", NodeType.CROSS_JOIN_NODE); + super(id, "CROSS JOIN", StatisticalType.CROSS_JOIN_NODE); this.innerRef = innerRef; tupleIds.addAll(outer.getTupleIds()); tupleIds.addAll(inner.getTupleIds()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java index 07856fed1b..1b088d917f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java @@ -20,6 +20,7 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.TupleId; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TPlanNode; import org.apache.doris.thrift.TPlanNodeType; @@ -40,7 +41,7 @@ public class EmptySetNode extends PlanNode { private static final Logger LOG = LogManager.getLogger(EmptySetNode.class); public EmptySetNode(PlanNodeId id, ArrayList tupleIds) { - super(id, tupleIds, "EMPTYSET", NodeType.EMPTY_SET_NODE); + super(id, tupleIds, "EMPTYSET", StatisticalType.EMPTY_SET_NODE); Preconditions.checkArgument(tupleIds.size() > 0); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java index 9efacdf813..6306705753 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java @@ -30,6 +30,7 @@ import org.apache.doris.common.UserException; import org.apache.doris.external.elasticsearch.EsShardPartitions; import org.apache.doris.external.elasticsearch.EsShardRouting; import org.apache.doris.external.elasticsearch.EsTablePartitions; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.system.Backend; import org.apache.doris.thrift.TEsScanNode; import org.apache.doris.thrift.TEsScanRange; @@ -71,7 +72,7 @@ public class EsScanNode extends ScanNode { boolean isFinalized = false; public EsScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName) { - super(id, desc, planNodeName, NodeType.ES_SCAN_NODE); + super(id, desc, planNodeName, StatisticalType.ES_SCAN_NODE); table = (EsTable) (desc.getTable()); esTablePartitions = table.getEsTablePartitions(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java index 84911cad5b..c9fe36c41c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java @@ -19,6 +19,7 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.TupleId; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TPlanNode; import org.apache.doris.thrift.TPlanNodeType; @@ -31,7 +32,7 @@ public class ExceptNode extends SetOperationNode { protected ExceptNode(PlanNodeId id, TupleId tupleId, List setOpResultExprs, boolean isInSubplan) { - super(id, tupleId, "EXCEPT", setOpResultExprs, isInSubplan, NodeType.EXCEPT_NODE); + super(id, tupleId, "EXCEPT", setOpResultExprs, isInSubplan, StatisticalType.EXCEPT_NODE); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java index 0ce4dd5ba8..3f23deda1f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java @@ -26,6 +26,7 @@ import org.apache.doris.analysis.SortInfo; import org.apache.doris.analysis.TupleId; import org.apache.doris.common.UserException; import org.apache.doris.common.util.VectorizedUtil; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExchangeNode; import org.apache.doris.thrift.TPlanNode; @@ -71,7 +72,7 @@ public class ExchangeNode extends PlanNode { * need to compute the cardinality here. */ public ExchangeNode(PlanNodeId id, PlanNode inputNode, boolean copyConjuncts) { - super(id, inputNode, EXCHANGE_NODE, NodeType.EXCHANGE_NODE); + super(id, inputNode, EXCHANGE_NODE, StatisticalType.EXCHANGE_NODE); offset = 0; children.add(inputNode); if (!copyConjuncts) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java index 4d149e6cf2..38a9e88e3c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java @@ -38,6 +38,7 @@ import org.apache.doris.common.NotImplementedException; import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.common.util.VectorizedUtil; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TEqJoinCondition; import org.apache.doris.thrift.TExplainLevel; @@ -89,7 +90,7 @@ public class HashJoinNode extends PlanNode { */ public HashJoinNode(PlanNodeId id, PlanNode outer, PlanNode inner, TableRef innerRef, List eqJoinConjuncts, List otherJoinConjuncts) { - super(id, "HASH JOIN", NodeType.HASH_JOIN_NODE); + super(id, "HASH JOIN", StatisticalType.HASH_JOIN_NODE); Preconditions.checkArgument(eqJoinConjuncts != null && !eqJoinConjuncts.isEmpty()); Preconditions.checkArgument(otherJoinConjuncts != null); tblRefIds.addAll(outer.getTblRefIds()); @@ -148,7 +149,7 @@ public class HashJoinNode extends PlanNode { */ public HashJoinNode(PlanNodeId id, PlanNode outer, PlanNode inner, JoinOperator joinOp, List eqJoinConjuncts, List otherJoinConjuncts) { - super(id, "HASH JOIN", NodeType.HASH_JOIN_NODE); + super(id, "HASH JOIN", StatisticalType.HASH_JOIN_NODE); Preconditions.checkArgument(eqJoinConjuncts != null && !eqJoinConjuncts.isEmpty()); Preconditions.checkArgument(otherJoinConjuncts != null); tblRefIds.addAll(outer.getTblRefIds()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HiveScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HiveScanNode.java index 6902aa4c11..cb49ef9446 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/HiveScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HiveScanNode.java @@ -28,6 +28,7 @@ import org.apache.doris.catalog.HiveTable; import org.apache.doris.common.DdlException; import org.apache.doris.common.UserException; import org.apache.doris.load.BrokerFileGroup; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TBrokerFileStatus; import org.apache.doris.thrift.TExplainLevel; @@ -101,7 +102,7 @@ public class HiveScanNode extends BrokerScanNode { public HiveScanNode(PlanNodeId id, TupleDescriptor destTupleDesc, String planNodeName, List> fileStatusesList, int filesAdded) { - super(id, destTupleDesc, planNodeName, fileStatusesList, filesAdded, NodeType.HIVE_SCAN_NODE); + super(id, destTupleDesc, planNodeName, fileStatusesList, filesAdded, StatisticalType.HIVE_SCAN_NODE); this.hiveTable = (HiveTable) destTupleDesc.getTable(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/IcebergScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/IcebergScanNode.java index 3439631f0d..4afc4305bd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/IcebergScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/IcebergScanNode.java @@ -26,6 +26,7 @@ import org.apache.doris.catalog.IcebergTable; import org.apache.doris.common.UserException; import org.apache.doris.external.iceberg.util.IcebergUtils; import org.apache.doris.load.BrokerFileGroup; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TBrokerFileStatus; import org.apache.doris.thrift.TExplainLevel; @@ -46,7 +47,7 @@ public class IcebergScanNode extends BrokerScanNode { public IcebergScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, List> fileStatusesList, int filesAdded) { - super(id, desc, planNodeName, fileStatusesList, filesAdded, NodeType.ICEBERG_SCAN_NODE); + super(id, desc, planNodeName, fileStatusesList, filesAdded, StatisticalType.ICEBERG_SCAN_NODE); icebergTable = (IcebergTable) desc.getTable(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/LoadScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/LoadScanNode.java index 5be209db0a..360858486c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/LoadScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/LoadScanNode.java @@ -38,6 +38,7 @@ import org.apache.doris.common.Config; import org.apache.doris.common.UserException; import org.apache.doris.load.loadv2.LoadTask; import org.apache.doris.rewrite.ExprRewriter; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TBrokerScanNode; import org.apache.doris.thrift.TBrokerScanRangeParams; import org.apache.doris.thrift.TPlanNode; @@ -55,11 +56,11 @@ public abstract class LoadScanNode extends ScanNode { protected LoadTask.MergeType mergeType = LoadTask.MergeType.APPEND; public LoadScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName) { - super(id, desc, planNodeName, NodeType.LOAD_SCAN_NODE); + super(id, desc, planNodeName, StatisticalType.LOAD_SCAN_NODE); } - public LoadScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, NodeType nodeType) { - super(id, desc, planNodeName, nodeType); + public LoadScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, StatisticalType statisticalType) { + super(id, desc, planNodeName, statisticalType); } protected void initAndSetWhereExpr(Expr whereExpr, TupleDescriptor tupleDesc, diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/MysqlScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/MysqlScanNode.java index 82ea85da8e..ba9a247658 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/MysqlScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/MysqlScanNode.java @@ -26,6 +26,7 @@ import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.MysqlTable; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TMySQLScanNode; @@ -56,7 +57,7 @@ public class MysqlScanNode extends ScanNode { * Constructs node to scan given data files of table 'tbl'. */ public MysqlScanNode(PlanNodeId id, TupleDescriptor desc, MysqlTable tbl) { - super(id, desc, "SCAN MYSQL", NodeType.MYSQL_SCAN_NODE); + super(id, desc, "SCAN MYSQL", StatisticalType.MYSQL_SCAN_NODE); tblName = "`" + tbl.getMysqlTableName() + "`"; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java index cacbc48ad5..0ab7d915a4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java @@ -27,6 +27,7 @@ import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.OdbcTable; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TOdbcScanNode; @@ -73,7 +74,7 @@ public class OdbcScanNode extends ScanNode { * Constructs node to scan given data files of table 'tbl'. */ public OdbcScanNode(PlanNodeId id, TupleDescriptor desc, OdbcTable tbl) { - super(id, desc, "SCAN ODBC", NodeType.ODBC_SCAN_NODE); + super(id, desc, "SCAN ODBC", StatisticalType.ODBC_SCAN_NODE); connectString = tbl.getConnectString(); odbcType = tbl.getOdbcTableType(); tblName = OdbcTable.databaseProperName(odbcType, tbl.getOdbcTableName()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java index 82196efa9e..466e69a53c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java @@ -53,6 +53,7 @@ import org.apache.doris.common.util.Util; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.SessionVariable; import org.apache.doris.resource.Tag; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.system.Backend; import org.apache.doris.thrift.TExplainLevel; @@ -146,7 +147,7 @@ public class OlapScanNode extends ScanNode { // Constructs node to scan given data files of table 'tbl'. public OlapScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName) { - super(id, desc, planNodeName, NodeType.OLAP_SCAN_NODE); + super(id, desc, planNodeName, StatisticalType.OLAP_SCAN_NODE); olapTable = (OlapTable) desc.getTable(); } 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 6ddca7ac81..2a030fbf7c 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 @@ -36,6 +36,8 @@ import org.apache.doris.common.NotImplementedException; import org.apache.doris.common.TreeNode; import org.apache.doris.common.UserException; import org.apache.doris.common.util.VectorizedUtil; +import org.apache.doris.statistics.PlanStats; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsDeriveResult; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TFunctionBinaryType; @@ -71,7 +73,7 @@ import java.util.Set; * this node, ie, they only reference tuples materialized by this node or one of * its children (= are bound by tupleIds). */ -public abstract class PlanNode extends TreeNode { +public abstract class PlanNode extends TreeNode implements PlanStats { private static final Logger LOG = LogManager.getLogger(PlanNode.class); protected String planNodeName; @@ -137,10 +139,11 @@ public abstract class PlanNode extends TreeNode { protected List outputSlotIds; - protected NodeType nodeType = NodeType.DEFAULT; + protected StatisticalType statisticalType = StatisticalType.DEFAULT; protected StatsDeriveResult statsDeriveResult; - protected PlanNode(PlanNodeId id, ArrayList tupleIds, String planNodeName, NodeType nodeType) { + protected PlanNode(PlanNodeId id, ArrayList tupleIds, String planNodeName, + StatisticalType statisticalType) { this.id = id; this.limit = -1; // make a copy, just to be on the safe side @@ -149,10 +152,10 @@ public abstract class PlanNode extends TreeNode { this.cardinality = -1; this.planNodeName = VectorizedUtil.isVectorized() ? "V" + planNodeName : planNodeName; this.numInstances = 1; - this.nodeType = nodeType; + this.statisticalType = statisticalType; } - protected PlanNode(PlanNodeId id, String planNodeName, NodeType nodeType) { + protected PlanNode(PlanNodeId id, String planNodeName, StatisticalType statisticalType) { this.id = id; this.limit = -1; this.tupleIds = Lists.newArrayList(); @@ -160,13 +163,13 @@ public abstract class PlanNode extends TreeNode { this.cardinality = -1; this.planNodeName = VectorizedUtil.isVectorized() ? "V" + planNodeName : planNodeName; this.numInstances = 1; - this.nodeType = nodeType; + this.statisticalType = statisticalType; } /** * Copy ctor. Also passes in new id. */ - protected PlanNode(PlanNodeId id, PlanNode node, String planNodeName, NodeType nodeType) { + protected PlanNode(PlanNodeId id, PlanNode node, String planNodeName, StatisticalType statisticalType) { this.id = id; this.limit = node.limit; this.tupleIds = Lists.newArrayList(node.tupleIds); @@ -177,36 +180,7 @@ public abstract class PlanNode extends TreeNode { this.compactData = node.compactData; this.planNodeName = VectorizedUtil.isVectorized() ? "V" + planNodeName : planNodeName; this.numInstances = 1; - this.nodeType = nodeType; - } - - public enum NodeType { - DEFAULT, - AGG_NODE, - ANALYTIC_EVAL_NODE, - ASSERT_NUM_ROWS_NODE, - BROKER_SCAN_NODE, - CROSS_JOIN_NODE, - EMPTY_SET_NODE, - ES_SCAN_NODE, - EXCEPT_NODE, - EXCHANGE_NODE, - HASH_JOIN_NODE, - HIVE_SCAN_NODE, - ICEBERG_SCAN_NODE, - INTERSECT_NODE, - LOAD_SCAN_NODE, - MYSQL_SCAN_NODE, - ODBC_SCAN_NODE, - OLAP_SCAN_NODE, - REPEAT_NODE, - SELECT_NODE, - SET_OPERATION_NODE, - SCHEMA_SCAN_NODE, - SORT_NODE, - STREAM_LOAD_SCAN_NODE, - TABLE_FUNCTION_NODE, - UNION_NODE, + this.statisticalType = statisticalType; } public String getPlanNodeName() { @@ -217,8 +191,8 @@ public abstract class PlanNode extends TreeNode { return statsDeriveResult; } - public NodeType getNodeType() { - return nodeType; + public StatisticalType getStatisticalType() { + return statisticalType; } public void setStatsDeriveResult(StatsDeriveResult statsDeriveResult) { @@ -353,6 +327,15 @@ public abstract class PlanNode extends TreeNode { return conjuncts; } + @Override + public List getChildrenStats() { + List statsDeriveResultList = Lists.newArrayList(); + for (PlanNode child : children) { + statsDeriveResultList.add(child.getStatsDeriveResult()); + } + return statsDeriveResultList; + } + void initCompoundPredicate(Expr expr) { if (expr instanceof CompoundPredicate) { CompoundPredicate compoundPredicate = (CompoundPredicate) expr; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java index 82e3c82f97..47dbe46f32 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java @@ -30,6 +30,7 @@ import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.analysis.TupleId; import org.apache.doris.analysis.VirtualSlotRef; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TPlanNode; @@ -67,7 +68,7 @@ public class RepeatNode extends PlanNode { private GroupByClause groupByClause; protected RepeatNode(PlanNodeId id, PlanNode input, GroupingInfo groupingInfo, GroupByClause groupByClause) { - super(id, input.getTupleIds(), "REPEAT_NODE", NodeType.REPEAT_NODE); + super(id, input.getTupleIds(), "REPEAT_NODE", StatisticalType.REPEAT_NODE); this.children.add(input); this.groupingInfo = groupingInfo; this.input = input; @@ -78,7 +79,7 @@ public class RepeatNode extends PlanNode { // only for unittest protected RepeatNode(PlanNodeId id, PlanNode input, List> repeatSlotIdList, TupleDescriptor outputTupleDesc, List> groupingList) { - super(id, input.getTupleIds(), "REPEAT_NODE", NodeType.REPEAT_NODE); + super(id, input.getTupleIds(), "REPEAT_NODE", StatisticalType.REPEAT_NODE); this.children.add(input); this.repeatSlotIdList = buildIdSetList(repeatSlotIdList); this.groupingList = groupingList; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java index 2dea7d4c6b..90660e75ec 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java @@ -35,6 +35,7 @@ import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TNetworkAddress; import org.apache.doris.thrift.TScanRangeLocations; @@ -63,8 +64,8 @@ public abstract class ScanNode extends PlanNode { protected String sortColumn = null; protected Analyzer analyzer; - public ScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, NodeType nodeType) { - super(id, desc.getId().asList(), planNodeName, nodeType); + public ScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, StatisticalType statisticalType) { + super(id, desc.getId().asList(), planNodeName, statisticalType); this.desc = desc; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java index 6bea955cd5..db70e0c623 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SchemaScanNode.java @@ -25,6 +25,7 @@ import org.apache.doris.common.UserException; import org.apache.doris.common.util.Util; import org.apache.doris.qe.ConnectContext; import org.apache.doris.service.FrontendOptions; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TPlanNode; import org.apache.doris.thrift.TPlanNodeType; import org.apache.doris.thrift.TScanRangeLocations; @@ -56,7 +57,7 @@ public class SchemaScanNode extends ScanNode { * Constructs node to scan given data files of table 'tbl'. */ public SchemaScanNode(PlanNodeId id, TupleDescriptor desc) { - super(id, desc, "SCAN SCHEMA", NodeType.SCHEMA_SCAN_NODE); + super(id, desc, "SCAN SCHEMA", StatisticalType.SCHEMA_SCAN_NODE); this.tableName = desc.getTable().getName(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java index 284ad73a49..92736c2e51 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java @@ -23,6 +23,7 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.Expr; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TPlanNode; @@ -40,13 +41,13 @@ public class SelectNode extends PlanNode { private static final Logger LOG = LogManager.getLogger(SelectNode.class); protected SelectNode(PlanNodeId id, PlanNode child) { - super(id, child.getTupleIds(), "SELECT", NodeType.SELECT_NODE); + super(id, child.getTupleIds(), "SELECT", StatisticalType.SELECT_NODE); addChild(child); this.nullableTupleIds = child.nullableTupleIds; } protected SelectNode(PlanNodeId id, PlanNode child, List conjuncts) { - super(id, child.getTupleIds(), "SELECT", NodeType.SELECT_NODE); + super(id, child.getTupleIds(), "SELECT", StatisticalType.SELECT_NODE); addChild(child); this.tblRefIds = child.tblRefIds; this.nullableTupleIds = child.nullableTupleIds; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java index 7a91ca5b3c..95a13061e1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java @@ -26,6 +26,7 @@ import org.apache.doris.analysis.TupleId; import org.apache.doris.common.CheckedMath; import org.apache.doris.common.UserException; import org.apache.doris.common.util.VectorizedUtil; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TExceptNode; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TExpr; @@ -83,23 +84,23 @@ public abstract class SetOperationNode extends PlanNode { protected final TupleId tupleId; - protected SetOperationNode(PlanNodeId id, TupleId tupleId, String planNodeName, NodeType nodeType) { - super(id, tupleId.asList(), planNodeName, nodeType); + protected SetOperationNode(PlanNodeId id, TupleId tupleId, String planNodeName, StatisticalType statisticalType) { + super(id, tupleId.asList(), planNodeName, statisticalType); this.setOpResultExprs = Lists.newArrayList(); this.tupleId = tupleId; this.isInSubplan = false; } protected SetOperationNode(PlanNodeId id, TupleId tupleId, String planNodeName, - List setOpResultExprs, boolean isInSubplan, NodeType nodeType) { - super(id, tupleId.asList(), planNodeName, nodeType); + List setOpResultExprs, boolean isInSubplan, StatisticalType statisticalType) { + super(id, tupleId.asList(), planNodeName, statisticalType); this.setOpResultExprs = setOpResultExprs; this.tupleId = tupleId; this.isInSubplan = isInSubplan; } protected SetOperationNode(PlanNodeId id, TupleId tupleId, String planNodeName) { - super(id, tupleId.asList(), planNodeName, NodeType.SET_OPERATION_NODE); + super(id, tupleId.asList(), planNodeName, StatisticalType.SET_OPERATION_NODE); this.setOpResultExprs = Lists.newArrayList(); this.tupleId = tupleId; this.isInSubplan = false; @@ -107,7 +108,7 @@ public abstract class SetOperationNode extends PlanNode { protected SetOperationNode(PlanNodeId id, TupleId tupleId, String planNodeName, List setOpResultExprs, boolean isInSubplan) { - super(id, tupleId.asList(), planNodeName, NodeType.SET_OPERATION_NODE); + super(id, tupleId.asList(), planNodeName, StatisticalType.SET_OPERATION_NODE); this.setOpResultExprs = setOpResultExprs; this.tupleId = tupleId; this.isInSubplan = isInSubplan; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java index 02c0150104..2a7d3e7b29 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java @@ -29,6 +29,7 @@ import org.apache.doris.analysis.SlotRef; import org.apache.doris.analysis.SortInfo; import org.apache.doris.common.NotImplementedException; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TPlanNode; @@ -84,7 +85,7 @@ public class SortNode extends PlanNode { public SortNode(PlanNodeId id, PlanNode input, SortInfo info, boolean useTopN, boolean isDefaultLimit, long offset) { - super(id, useTopN ? "TOP-N" : "SORT", NodeType.SORT_NODE); + super(id, useTopN ? "TOP-N" : "SORT", StatisticalType.SORT_NODE); this.info = info; this.useTopN = useTopN; this.isDefaultLimit = isDefaultLimit; @@ -100,7 +101,7 @@ public class SortNode extends PlanNode { * Clone 'inputSortNode' for distributed Top-N */ public SortNode(PlanNodeId id, SortNode inputSortNode, PlanNode child) { - super(id, inputSortNode, inputSortNode.useTopN ? "TOP-N" : "SORT", NodeType.SORT_NODE); + super(id, inputSortNode, inputSortNode.useTopN ? "TOP-N" : "SORT", StatisticalType.SORT_NODE); this.info = inputSortNode.info; this.useTopN = inputSortNode.useTopN; this.isDefaultLimit = inputSortNode.isDefaultLimit; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadScanNode.java index 2391ab7e7b..f5e5aae77b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadScanNode.java @@ -30,6 +30,7 @@ import org.apache.doris.common.UserException; import org.apache.doris.common.util.VectorizedUtil; import org.apache.doris.load.Load; import org.apache.doris.load.loadv2.LoadTask; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.task.LoadTaskInfo; import org.apache.doris.thrift.TBrokerRangeDesc; import org.apache.doris.thrift.TBrokerScanRange; @@ -75,7 +76,7 @@ public class StreamLoadScanNode extends LoadScanNode { // used to construct for streaming loading public StreamLoadScanNode( TUniqueId loadId, PlanNodeId id, TupleDescriptor tupleDesc, Table dstTable, LoadTaskInfo taskInfo) { - super(id, tupleDesc, "StreamLoadScanNode", NodeType.STREAM_LOAD_SCAN_NODE); + super(id, tupleDesc, "StreamLoadScanNode", StatisticalType.STREAM_LOAD_SCAN_NODE); this.loadId = loadId; this.dstTable = dstTable; this.taskInfo = taskInfo; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java index ed61dd85eb..17cc72030d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java @@ -26,6 +26,7 @@ import org.apache.doris.analysis.SlotRef; import org.apache.doris.analysis.TupleId; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TPlanNode; @@ -51,7 +52,7 @@ public class TableFunctionNode extends PlanNode { private List outputSlotIds = Lists.newArrayList(); protected TableFunctionNode(PlanNodeId id, PlanNode inputNode, List lateralViewRefs) { - super(id, "TABLE FUNCTION NODE", NodeType.TABLE_FUNCTION_NODE); + super(id, "TABLE FUNCTION NODE", StatisticalType.TABLE_FUNCTION_NODE); tupleIds.addAll(inputNode.getTupleIds()); tblRefIds.addAll(inputNode.getTupleIds()); lateralViewTupleIds = lateralViewRefs.stream().map(e -> e.getDesc().getId()) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java index 1fcf125dd3..ef42258d71 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java @@ -22,6 +22,7 @@ package org.apache.doris.planner; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.TupleId; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TPlanNode; import org.apache.doris.thrift.TPlanNodeType; @@ -29,12 +30,12 @@ import java.util.List; public class UnionNode extends SetOperationNode { protected UnionNode(PlanNodeId id, TupleId tupleId) { - super(id, tupleId, "UNION", NodeType.UNION_NODE); + super(id, tupleId, "UNION", StatisticalType.UNION_NODE); } protected UnionNode(PlanNodeId id, TupleId tupleId, List setOpResultExprs, boolean isInSubplan) { - super(id, tupleId, "UNION", setOpResultExprs, isInSubplan, NodeType.UNION_NODE); + super(id, tupleId, "UNION", setOpResultExprs, isInSubplan, StatisticalType.UNION_NODE); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalScanNode.java index 1d4f4b983f..65594500ba 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalScanNode.java @@ -20,6 +20,7 @@ package org.apache.doris.planner.external; import org.apache.doris.analysis.TupleDescriptor; import org.apache.doris.planner.PlanNodeId; import org.apache.doris.planner.ScanNode; +import org.apache.doris.statistics.StatisticalType; import org.apache.doris.thrift.TPlanNode; import org.apache.doris.thrift.TScanRangeLocations; @@ -34,8 +35,8 @@ import java.util.List; */ public class ExternalScanNode extends ScanNode { - public ExternalScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, NodeType nodeType) { - super(id, desc, planNodeName, nodeType); + public ExternalScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, StatisticalType statisticalType) { + super(id, desc, planNodeName, statisticalType); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AggStatsDerive.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AggStatsDerive.java index 6d626ce21a..365c8e8f39 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AggStatsDerive.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AggStatsDerive.java @@ -20,7 +20,6 @@ package org.apache.doris.statistics; import org.apache.doris.analysis.Expr; import org.apache.doris.common.UserException; import org.apache.doris.planner.AggregationNode; -import org.apache.doris.planner.PlanNode; import com.google.common.base.Preconditions; import org.apache.logging.log4j.LogManager; @@ -37,7 +36,7 @@ public class AggStatsDerive extends BaseStatsDerive { List groupingExprs = new ArrayList<>(); @Override - public void init(PlanNode node) throws UserException { + public void init(PlanStats node) throws UserException { Preconditions.checkState(node instanceof AggregationNode); super.init(node); groupingExprs.addAll(((AggregationNode) node).getAggInfo().getGroupingExprs()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseStatsDerive.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseStatsDerive.java index d2f047c877..a26ae7b0b0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseStatsDerive.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseStatsDerive.java @@ -18,9 +18,8 @@ package org.apache.doris.statistics; import org.apache.doris.analysis.Expr; -import org.apache.doris.analysis.SlotId; +import org.apache.doris.common.Id; import org.apache.doris.common.UserException; -import org.apache.doris.planner.PlanNode; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; @@ -42,19 +41,17 @@ public class BaseStatsDerive { protected long rowCount = -1; protected long limit = -1; - protected List conjuncts = Lists.newArrayList(); + protected List conjuncts = Lists.newArrayList(); protected List childrenStatsResult = Lists.newArrayList(); - protected void init(PlanNode node) throws UserException { + protected void init(PlanStats node) throws UserException { limit = node.getLimit(); conjuncts.addAll(node.getConjuncts()); - for (PlanNode childNode : node.getChildren()) { - StatsDeriveResult result = childNode.getStatsDeriveResult(); + for (StatsDeriveResult result : node.getChildrenStats()) { if (result == null) { throw new UserException( - "childNode statsDeriveResult is null, childNodeType is " + childNode.getNodeType() - + "parentNodeType is " + node.getNodeType()); + "childNode statsDeriveResult is null."); } childrenStatsResult.add(result); } @@ -87,7 +84,7 @@ public class BaseStatsDerive { } protected double computeSelectivity() { - for (Expr expr : conjuncts) { + for (ExprStats expr : conjuncts) { expr.setSelectivity(); } return computeCombinedSelectivity(conjuncts); @@ -110,10 +107,10 @@ public class BaseStatsDerive { * * additional selectivity into the final result. *

*/ - protected double computeCombinedSelectivity(List conjuncts) { + protected double computeCombinedSelectivity(List conjuncts) { // Collect all estimated selectivities. List selectivities = new ArrayList<>(); - for (Expr e : conjuncts) { + for (ExprStats e : conjuncts) { if (e.hasSelectivity()) { selectivities.add(e.getSelectivity()); } @@ -155,16 +152,16 @@ public class BaseStatsDerive { } - protected HashMap deriveColumnToDataSize() { - HashMap columnToDataSize = new HashMap<>(); + protected HashMap deriveColumnToDataSize() { + HashMap columnToDataSize = new HashMap<>(); for (StatsDeriveResult child : childrenStatsResult) { columnToDataSize.putAll(child.getColumnToDataSize()); } return columnToDataSize; } - protected HashMap deriveColumnToNdv() { - HashMap columnToNdv = new HashMap<>(); + protected HashMap deriveColumnToNdv() { + HashMap columnToNdv = new HashMap<>(); for (StatsDeriveResult child : childrenStatsResult) { columnToNdv.putAll(child.getColumnToNdv()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/DeriveFactory.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/DeriveFactory.java index 7d694ee681..227ab74ee4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/DeriveFactory.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/DeriveFactory.java @@ -17,12 +17,10 @@ package org.apache.doris.statistics; -import org.apache.doris.planner.PlanNode; - public class DeriveFactory { - public BaseStatsDerive getStatsDerive(PlanNode.NodeType nodeType) { - switch (nodeType) { + public BaseStatsDerive getStatsDerive(StatisticalType statisticalType) { + switch (statisticalType) { case AGG_NODE: return new AggStatsDerive(); case ANALYTIC_EVAL_NODE: diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/ExprStats.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/ExprStats.java new file mode 100644 index 0000000000..bc7effe452 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/ExprStats.java @@ -0,0 +1,33 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.statistics; + +/** + * Used to abstract a common expression interface for statistics deduction to fit both optimizers. + */ +public interface ExprStats { + + boolean hasSelectivity(); + + double getSelectivity(); + + void setSelectivity(); + + long getNumDistinctValues(); + +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/HashJoinStatsDerive.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/HashJoinStatsDerive.java index 649fd1cc7e..24b9e102e4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/HashJoinStatsDerive.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/HashJoinStatsDerive.java @@ -26,7 +26,6 @@ import org.apache.doris.catalog.ColumnStats; import org.apache.doris.common.CheckedMath; import org.apache.doris.common.UserException; import org.apache.doris.planner.HashJoinNode; -import org.apache.doris.planner.PlanNode; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; @@ -42,7 +41,7 @@ public class HashJoinStatsDerive extends BaseStatsDerive { private List eqJoinConjuncts = Lists.newArrayList(); @Override - public void init(PlanNode node) throws UserException { + public void init(PlanStats node) throws UserException { Preconditions.checkState(node instanceof HashJoinNode); super.init(node); joinOp = ((HashJoinNode) node).getJoinOp(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java index efa1e1aafb..3be8fffcba 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java @@ -18,12 +18,11 @@ package org.apache.doris.statistics; import org.apache.doris.analysis.SlotDescriptor; -import org.apache.doris.analysis.SlotId; import org.apache.doris.catalog.Catalog; +import org.apache.doris.common.Id; import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.planner.OlapScanNode; -import org.apache.doris.planner.PlanNode; import com.google.common.base.Preconditions; @@ -40,12 +39,12 @@ public class OlapScanStatsDerive extends BaseStatsDerive { // The rowCount here is the number of rows. private long inputRowCount = -1; - private Map slotIdToDataSize; - private Map slotIdToNdv; - private Map> slotIdToTableIdAndColumnName; + private Map slotIdToDataSize; + private Map slotIdToNdv; + private Map> slotIdToTableIdAndColumnName; @Override - public void init(PlanNode node) throws UserException { + public void init(PlanStats node) throws UserException { Preconditions.checkState(node instanceof OlapScanNode); super.init(node); buildStructure((OlapScanNode) node); @@ -61,7 +60,7 @@ public class OlapScanStatsDerive extends BaseStatsDerive { * - So only an inaccurate cardinality can be calculated here. */ rowCount = inputRowCount; - for (Map.Entry> pairEntry : slotIdToTableIdAndColumnName.entrySet()) { + for (Map.Entry> pairEntry : slotIdToTableIdAndColumnName.entrySet()) { Pair ndvAndDataSize = getNdvAndDataSizeFromStatistics(pairEntry.getValue()); long ndv = ndvAndDataSize.first; float dataSize = ndvAndDataSize.second; diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/PlanStats.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/PlanStats.java new file mode 100644 index 0000000000..b8d69c53df --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/PlanStats.java @@ -0,0 +1,39 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.statistics; + +import java.util.List; + +/** + * Used to abstract a common operator interface for statistics deduction to fit both optimizers. + */ +public interface PlanStats { + + List getChildrenStats(); + + StatsDeriveResult getStatsDeriveResult(); + + StatisticalType getStatisticalType(); + + void setStatsDeriveResult(StatsDeriveResult result); + + long getLimit(); + + List getConjuncts(); + +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/SlotStatsDeriveResult.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/SlotStatsDeriveResult.java new file mode 100644 index 0000000000..c170aa1035 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/SlotStatsDeriveResult.java @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.statistics; + +import org.apache.doris.nereids.trees.expressions.Literal; + +public class SlotStatsDeriveResult { + + // number of distinct value + private long ndv; + private Literal max; + private Literal min; + + public long getNdv() { + return ndv; + } + + public void setNdv(long ndv) { + this.ndv = ndv; + } + + public Literal getMax() { + return max; + } + + public void setMax(Literal max) { + this.max = max; + } + + public Literal getMin() { + return min; + } + + public void setMin(Literal min) { + this.min = min; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticalType.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticalType.java new file mode 100644 index 0000000000..990b5042f3 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticalType.java @@ -0,0 +1,47 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.statistics; + +public enum StatisticalType { + DEFAULT, + AGG_NODE, + ANALYTIC_EVAL_NODE, + ASSERT_NUM_ROWS_NODE, + BROKER_SCAN_NODE, + CROSS_JOIN_NODE, + EMPTY_SET_NODE, + ES_SCAN_NODE, + EXCEPT_NODE, + EXCHANGE_NODE, + HASH_JOIN_NODE, + HIVE_SCAN_NODE, + ICEBERG_SCAN_NODE, + INTERSECT_NODE, + LOAD_SCAN_NODE, + MYSQL_SCAN_NODE, + ODBC_SCAN_NODE, + OLAP_SCAN_NODE, + REPEAT_NODE, + SELECT_NODE, + SET_OPERATION_NODE, + SCHEMA_SCAN_NODE, + SORT_NODE, + STREAM_LOAD_SCAN_NODE, + TABLE_FUNCTION_NODE, + UNION_NODE, +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsDeriveResult.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsDeriveResult.java index 2bf0a53f81..1888b3dd45 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsDeriveResult.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsDeriveResult.java @@ -17,7 +17,7 @@ package org.apache.doris.statistics; -import org.apache.doris.analysis.SlotId; +import org.apache.doris.common.Id; import com.google.common.collect.Maps; @@ -28,12 +28,12 @@ public class StatsDeriveResult { private long rowCount = -1; // The data size of the corresponding column in the operator // The actual key is slotId - private final Map columnToDataSize = Maps.newHashMap(); + private final Map columnToDataSize = Maps.newHashMap(); // The ndv of the corresponding column in the operator // The actual key is slotId - private final Map columnToNdv = Maps.newHashMap(); + private final Map columnToNdv = Maps.newHashMap(); - public StatsDeriveResult(long rowCount, Map columnToDataSize, Map columnToNdv) { + public StatsDeriveResult(long rowCount, Map columnToDataSize, Map columnToNdv) { this.rowCount = rowCount; this.columnToDataSize.putAll(columnToDataSize); this.columnToNdv.putAll(columnToNdv); @@ -47,11 +47,11 @@ public class StatsDeriveResult { return rowCount; } - public Map getColumnToNdv() { + public Map getColumnToNdv() { return columnToNdv; } - public Map getColumnToDataSize() { + public Map getColumnToDataSize() { return columnToDataSize; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsRecursiveDerive.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsRecursiveDerive.java index e6159a594d..e35af3e77d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsRecursiveDerive.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsRecursiveDerive.java @@ -20,7 +20,6 @@ package org.apache.doris.statistics; import org.apache.doris.common.UserException; import org.apache.doris.planner.PlanNode; - public class StatsRecursiveDerive { private StatsRecursiveDerive() {} @@ -48,7 +47,7 @@ public class StatsRecursiveDerive { } } DeriveFactory deriveFactory = new DeriveFactory(); - BaseStatsDerive deriveStats = deriveFactory.getStatsDerive(node.getNodeType()); + BaseStatsDerive deriveStats = deriveFactory.getStatsDerive(node.getStatisticalType()); deriveStats.init(node); StatsDeriveResult result = deriveStats.deriveStats(); node.setStatsDeriveResult(result);