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 extends ExprStats> 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 extends ExprStats> 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 extends ExprStats> 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);