This is an automated email from the ASF dual-hosted git repository. jakevin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new d8a31405c4 [refactor](Nereids): remove Penalty (#23321) d8a31405c4 is described below commit d8a31405c4060c4ce08c1c556150ee6556b6cb3b Author: jakevin <jakevin...@gmail.com> AuthorDate: Wed Aug 23 13:31:01 2023 +0800 [refactor](Nereids): remove Penalty (#23321) --- .../org/apache/doris/nereids/cost/CostModelV1.java | 12 +---- .../doris/nereids/rules/rewrite/MultiJoin.java | 2 +- .../apache/doris/nereids/stats/JoinEstimation.java | 12 ++--- .../doris/nereids/stats/StatsCalculator.java | 8 ++-- .../doris/nereids/trees/AbstractTreeNode.java | 12 +---- .../doris/nereids/trees/plans/AbstractPlan.java | 22 ++------- .../nereids/trees/plans/commands/Command.java | 6 ++- .../trees/plans/logical/AbstractLogicalPlan.java | 10 ++-- .../trees/plans/logical/LogicalSetOperation.java | 4 +- .../nereids/trees/plans/logical/LogicalUnary.java | 4 +- .../trees/plans/physical/AbstractPhysicalPlan.java | 2 +- .../apache/doris/statistics/ColumnStatistic.java | 22 ++------- .../org/apache/doris/statistics/Statistics.java | 54 +--------------------- .../apache/doris/statistics/StatisticsBuilder.java | 2 +- 14 files changed, 39 insertions(+), 133 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostModelV1.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostModelV1.java index 07a8e591ab..6b07b22fab 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostModelV1.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostModelV1.java @@ -287,17 +287,11 @@ class CostModelV1 extends PlanVisitor<Cost, PlanContext> { pattern2: (L join1 Agg1) join2 agg2 in pattern2, join1 and join2 takes more time, but Agg1 and agg2 can be processed in parallel. */ - double penalty = HEAVY_OPERATOR_PUNISH_FACTOR - * Math.min(probeStats.getPenalty(), buildStats.getPenalty()); - if (buildStats.getWidth() >= 2) { - //penalty for right deep tree - penalty += rightRowCount; - } if (physicalHashJoin.getJoinType().isCrossJoin()) { return CostV1.of(leftRowCount + rightRowCount + outputRowCount, 0, - leftRowCount + rightRowCount, - penalty); + leftRowCount + rightRowCount + ); } if (context.isBroadcastJoin()) { @@ -320,13 +314,11 @@ class CostModelV1 extends PlanVisitor<Cost, PlanContext> { // will refine this in next generation cost model. return CostV1.of(leftRowCount + rightRowCount * buildSideFactor + outputRowCount * probeSideFactor, rightRowCount, - 0, 0 ); } return CostV1.of(leftRowCount + rightRowCount + outputRowCount, rightRowCount, - 0, 0 ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java index 4255648c31..6f25e90320 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MultiJoin.java @@ -72,7 +72,7 @@ public class MultiJoin extends AbstractLogicalPlan { public MultiJoin(List<Plan> inputs, List<Expression> joinFilter, JoinType joinType, List<Expression> notInnerJoinConditions) { - super(PlanType.LOGICAL_MULTI_JOIN, inputs.toArray(new Plan[0])); + super(PlanType.LOGICAL_MULTI_JOIN, inputs); this.joinFilter = Objects.requireNonNull(joinFilter); this.joinType = joinType; this.notInnerJoinConditions = Objects.requireNonNull(notInnerJoinConditions); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java index 98084e6829..9443972262 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java @@ -120,7 +120,7 @@ public class JoinEstimation { .putColumnStatistics(rightStats.columnStatistics()) .build(); - double outputRowCount = 1; + double outputRowCount; if (!trustableConditions.isEmpty()) { List<Double> joinConditionSels = trustableConditions.stream() .map(expression -> estimateJoinConditionSel(crossJoinStats, expression)) @@ -129,21 +129,20 @@ public class JoinEstimation { double sel = 1.0; double denominator = 1.0; - for (int i = 0; i < joinConditionSels.size(); i++) { - sel *= Math.pow(joinConditionSels.get(i), 1 / denominator); + for (Double joinConditionSel : joinConditionSels) { + sel *= Math.pow(joinConditionSel, 1 / denominator); denominator *= 2; } outputRowCount = Math.max(1, crossJoinStats.getRowCount() * sel); outputRowCount = outputRowCount * Math.pow(0.9, unTrustableCondition.size()); - innerJoinStats = crossJoinStats.updateRowCountOnly(outputRowCount); } else { outputRowCount = Math.max(leftStats.getRowCount(), rightStats.getRowCount()); Optional<Double> ratio = unTrustEqualRatio.stream().max(Double::compareTo); if (ratio.isPresent()) { outputRowCount = Math.max(1, outputRowCount * ratio.get()); } - innerJoinStats = crossJoinStats.updateRowCountOnly(outputRowCount); } + innerJoinStats = crossJoinStats.updateRowCountOnly(outputRowCount); return innerJoinStats; } @@ -181,9 +180,6 @@ public class JoinEstimation { innerJoinStats = new StatisticsBuilder(innerJoinStats).setRowCount(1).build(); } } - - innerJoinStats.setWidth(leftStats.getWidth() + rightStats.getWidth()); - innerJoinStats.setPenalty(0); return innerJoinStats; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java index 380d34dd1d..10bb0b759b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java @@ -780,8 +780,7 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> { builder.setDataSize(rowCount * outputExpression.getDataType().width()); slotToColumnStats.put(outputExpression.toSlot(), columnStat); } - return new Statistics(rowCount, slotToColumnStats, childStats.getWidth(), - childStats.getPenalty() + childStats.getRowCount()); + return new Statistics(rowCount, slotToColumnStats); // TODO: Update ColumnStats properly, add new mapping from output slot to ColumnStats } @@ -800,8 +799,7 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> { .setDataSize(stats.dataSize < 0 ? stats.dataSize : stats.dataSize * groupingSetNum); return Pair.of(kv.getKey(), columnStatisticBuilder.build()); }).collect(Collectors.toMap(Pair::key, Pair::value)); - return new Statistics(rowCount < 0 ? rowCount : rowCount * groupingSetNum, columnStatisticMap, - childStats.getWidth(), childStats.getPenalty()); + return new Statistics(rowCount < 0 ? rowCount : rowCount * groupingSetNum, columnStatisticMap); } private Statistics computeProject(Project project) { @@ -811,7 +809,7 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> { ColumnStatistic columnStatistic = ExpressionEstimation.estimate(projection, childStats); return new SimpleEntry<>(projection.toSlot(), columnStatistic); }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (item1, item2) -> item1)); - return new Statistics(childStats.getRowCount(), columnsStats, childStats.getWidth(), childStats.getPenalty()); + return new Statistics(childStats.getRowCount(), columnsStats); } private Statistics computeOneRowRelation(List<NamedExpression> projects) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/AbstractTreeNode.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/AbstractTreeNode.java index 990c87bb8c..08bd198e44 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/AbstractTreeNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/AbstractTreeNode.java @@ -40,17 +40,7 @@ public abstract class AbstractTreeNode<NODE_TYPE extends TreeNode<NODE_TYPE>> // https://github.com/apache/doris/pull/9807#discussion_r884829067 public AbstractTreeNode(NODE_TYPE... children) { - this(Optional.empty(), children); - } - - /** - * Constructor for plan node. - * - * @param groupExpression group expression related to the plan of this node - * @param children children of this node - */ - public AbstractTreeNode(Optional<GroupExpression> groupExpression, NODE_TYPE... children) { - this.children = ImmutableList.copyOf(children); + this(Optional.empty(), ImmutableList.copyOf(children)); } public AbstractTreeNode(Optional<GroupExpression> groupExpression, List<NODE_TYPE> children) { 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 0f7ca0706f..86ae62e122 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 @@ -31,6 +31,7 @@ import org.apache.doris.statistics.Statistics; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; import org.json.JSONArray; import org.json.JSONObject; @@ -58,29 +59,14 @@ public abstract class AbstractPlan extends AbstractTreeNode<Plan> implements Pla // difficult to locate. private MutableState mutableState = EmptyMutableState.INSTANCE; - public AbstractPlan(PlanType type, Plan... children) { - this(type, Optional.empty(), Optional.empty(), null, children); + protected AbstractPlan(PlanType type, List<Plan> children) { + this(type, Optional.empty(), Optional.empty(), null, ImmutableList.copyOf(children)); } /** * all parameter constructor. */ - public AbstractPlan(PlanType type, Optional<GroupExpression> groupExpression, - Optional<LogicalProperties> optLogicalProperties, @Nullable Statistics statistics, - Plan... children) { - super(groupExpression, children); - this.type = Objects.requireNonNull(type, "type can not be null"); - this.groupExpression = Objects.requireNonNull(groupExpression, "groupExpression can not be null"); - Objects.requireNonNull(optLogicalProperties, "logicalProperties can not be null"); - this.logicalPropertiesSupplier = Suppliers.memoize(() -> optLogicalProperties.orElseGet( - this::computeLogicalProperties)); - this.statistics = statistics; - } - - /** - * all parameter constructor. - */ - public AbstractPlan(PlanType type, Optional<GroupExpression> groupExpression, + protected AbstractPlan(PlanType type, Optional<GroupExpression> groupExpression, Optional<LogicalProperties> optLogicalProperties, @Nullable Statistics statistics, List<Plan> children) { super(groupExpression, children); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/Command.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/Command.java index ac3a077821..af48fe3425 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/Command.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/Command.java @@ -28,6 +28,8 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.StmtExecutor; +import com.google.common.collect.ImmutableList; + import java.util.List; import java.util.Optional; @@ -36,8 +38,8 @@ import java.util.Optional; */ public abstract class Command extends AbstractPlan implements LogicalPlan { - public Command(PlanType type, Plan... children) { - super(type, children); + protected Command(PlanType type) { + super(type, ImmutableList.of()); } public void run(ConnectContext ctx, StmtExecutor executor) throws Exception { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java index 738486f448..e2a65770f5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/AbstractLogicalPlan.java @@ -25,6 +25,8 @@ import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.qe.ConnectContext; +import com.google.common.collect.ImmutableList; + import java.util.List; import java.util.Optional; @@ -32,16 +34,16 @@ import java.util.Optional; * Abstract class for all concrete logical plan. */ public abstract class AbstractLogicalPlan extends AbstractPlan implements LogicalPlan, Explainable { - public AbstractLogicalPlan(PlanType type, Plan... children) { + protected AbstractLogicalPlan(PlanType type, List<Plan> children) { super(type, children); } - public AbstractLogicalPlan(PlanType type, Optional<GroupExpression> groupExpression, + protected AbstractLogicalPlan(PlanType type, Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, Plan... children) { - super(type, groupExpression, logicalProperties, null, children); + super(type, groupExpression, logicalProperties, null, ImmutableList.copyOf(children)); } - public AbstractLogicalPlan(PlanType type, Optional<GroupExpression> groupExpression, + protected AbstractLogicalPlan(PlanType type, Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties, List<Plan> children) { super(type, groupExpression, logicalProperties, null, children); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java index 68088d8289..ade619b322 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java @@ -62,7 +62,7 @@ public abstract class LogicalSetOperation extends AbstractLogicalPlan implements protected final List<NamedExpression> outputs; public LogicalSetOperation(PlanType planType, Qualifier qualifier, List<Plan> inputs) { - super(planType, inputs.toArray(new Plan[0])); + super(planType, inputs); this.qualifier = qualifier; this.outputs = ImmutableList.of(); } @@ -70,7 +70,7 @@ public abstract class LogicalSetOperation extends AbstractLogicalPlan implements public LogicalSetOperation(PlanType planType, Qualifier qualifier, List<NamedExpression> outputs, List<Plan> inputs) { - super(planType, inputs.toArray(new Plan[0])); + super(planType, inputs); this.qualifier = qualifier; this.outputs = ImmutableList.copyOf(outputs); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnary.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnary.java index 3cf666dedf..70b5ec12bc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnary.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnary.java @@ -24,6 +24,8 @@ import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PlanType; import org.apache.doris.nereids.trees.plans.UnaryPlan; +import com.google.common.collect.ImmutableList; + import java.util.List; import java.util.Optional; @@ -35,7 +37,7 @@ public abstract class LogicalUnary<CHILD_TYPE extends Plan> implements UnaryPlan<CHILD_TYPE> { public LogicalUnary(PlanType type, CHILD_TYPE child) { - super(type, child); + super(type, ImmutableList.of(child)); } public LogicalUnary(PlanType type, Optional<GroupExpression> groupExpression, 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 d0b4391661..c00cd8c168 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 @@ -65,7 +65,7 @@ public abstract class AbstractPhysicalPlan extends AbstractPlan implements Physi Statistics statistics, Plan... children) { super(type, groupExpression, logicalProperties == null ? Optional.empty() : Optional.of(logicalProperties), - statistics, children); + statistics, ImmutableList.copyOf(children)); this.physicalProperties = physicalProperties == null ? PhysicalProperties.ANY : physicalProperties; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java index 44b048baa2..85965e9513 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/ColumnStatistic.java @@ -24,13 +24,13 @@ import org.apache.doris.catalog.Type; import org.apache.doris.statistics.util.StatisticsUtil; import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; import com.google.gson.annotations.SerializedName; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.json.JSONObject; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -55,22 +55,10 @@ public class ColumnStatistic { .setNumNulls(0).setCount(0).setMaxValue(Double.NaN).setMinValue(Double.NaN) .build(); - public static final Set<Type> UNSUPPORTED_TYPE = new HashSet<>(); - - static { - UNSUPPORTED_TYPE.add(Type.HLL); - UNSUPPORTED_TYPE.add(Type.BITMAP); - UNSUPPORTED_TYPE.add(Type.ARRAY); - UNSUPPORTED_TYPE.add(Type.STRUCT); - UNSUPPORTED_TYPE.add(Type.MAP); - UNSUPPORTED_TYPE.add(Type.QUANTILE_STATE); - UNSUPPORTED_TYPE.add(Type.AGG_STATE); - UNSUPPORTED_TYPE.add(Type.JSONB); - UNSUPPORTED_TYPE.add(Type.VARIANT); - UNSUPPORTED_TYPE.add(Type.TIME); - UNSUPPORTED_TYPE.add(Type.TIMEV2); - UNSUPPORTED_TYPE.add(Type.LAMBDA_FUNCTION); - } + public static final Set<Type> UNSUPPORTED_TYPE = Sets.newHashSet( + Type.HLL, Type.BITMAP, Type.ARRAY, Type.STRUCT, Type.MAP, Type.QUANTILE_STATE, Type.AGG_STATE, Type.JSONB, + Type.VARIANT, Type.TIME, Type.TIMEV2, Type.LAMBDA_FUNCTION + ); @SerializedName("count") public final double count; diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/Statistics.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/Statistics.java index daf566109a..3675c04e8c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/Statistics.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/Statistics.java @@ -17,7 +17,6 @@ package org.apache.doris.statistics; -import org.apache.doris.nereids.stats.ExpressionEstimation; import org.apache.doris.nereids.stats.StatsMathUtil; import org.apache.doris.nereids.trees.expressions.Expression; @@ -27,7 +26,7 @@ import java.util.Map; import java.util.Map.Entry; public class Statistics { - private static int K_BYTES = 1024; + private static final int K_BYTES = 1024; private final double rowCount; @@ -36,12 +35,6 @@ public class Statistics { // the byte size of one tuple private double tupleSize; - @Deprecated - private double width; - - @Deprecated - private double penalty; - /** * after filter, compute the new ndv of a column * @param ndv original ndv of column @@ -62,8 +55,6 @@ public class Statistics { this.rowCount = another.rowCount; this.expressionToColumnStats = new HashMap<>(another.expressionToColumnStats); this.tupleSize = another.tupleSize; - this.width = another.width; - this.penalty = another.penalty; } public Statistics(double rowCount, Map<Expression, ColumnStatistic> expressionToColumnStats) { @@ -71,14 +62,6 @@ public class Statistics { this.expressionToColumnStats = expressionToColumnStats; } - public Statistics(double rowCount, Map<Expression, ColumnStatistic> expressionToColumnStats, double width, - double penalty) { - this.rowCount = rowCount; - this.expressionToColumnStats = expressionToColumnStats; - this.width = width; - this.penalty = penalty; - } - public ColumnStatistic findColumnStatistics(Expression expression) { return expressionToColumnStats.get(expression); } @@ -98,7 +81,7 @@ public class Statistics { if (Double.isNaN(rowCount)) { return this; } - Statistics statistics = new Statistics(rowCount, new HashMap<>(expressionToColumnStats), width, penalty); + Statistics statistics = new Statistics(rowCount, new HashMap<>(expressionToColumnStats)); statistics.fix(rowCount, StatsMathUtil.nonZeroDivisor(this.rowCount)); return statistics; } @@ -183,22 +166,6 @@ public class Statistics { return format.format(rowCount); } - public void setWidth(double width) { - this.width = width; - } - - public void setPenalty(double penalty) { - this.penalty = penalty; - } - - public double getWidth() { - return width; - } - - public double getPenalty() { - return penalty; - } - public int getBENumber() { return 1; } @@ -211,25 +178,8 @@ public class Statistics { return zero; } - public boolean almostUniqueExpression(Expression expr) { - ExpressionEstimation estimator = new ExpressionEstimation(); - double ndvErrorThreshold = 0.9; - ColumnStatistic colStats = expr.accept(estimator, this); - if (colStats.ndv > colStats.count * ndvErrorThreshold) { - return true; - } - return false; - } - - public boolean isStatsUnknown(Expression expr) { - ExpressionEstimation estimator = new ExpressionEstimation(); - ColumnStatistic colStats = expr.accept(estimator, this); - return colStats.isUnKnown; - } - /** * merge this and other colStats.ndv, choose min - * @param other */ public void updateNdv(Statistics other) { for (Expression expr : expressionToColumnStats.keySet()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsBuilder.java index 3622006542..a0e75f7df3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsBuilder.java @@ -26,7 +26,7 @@ public class StatisticsBuilder { private double rowCount; - private Map<Expression, ColumnStatistic> expressionToColumnStats; + private final Map<Expression, ColumnStatistic> expressionToColumnStats; public StatisticsBuilder() { expressionToColumnStats = new HashMap<>(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org