From 36a47dfe16b05dc8f338d6ec78da50815424a9b7 Mon Sep 17 00:00:00 2001 From: jakevin Date: Mon, 31 Oct 2022 20:23:30 +0800 Subject: [PATCH] [enhancement](Nereids): use ImmutableList explicitly in Plan (#13817) --- .../rewrite/logical/ApplyPullFilterOnAgg.java | 3 ++- .../ApplyPullFilterOnProjectUnderAgg.java | 13 +++++++------ .../rewrite/logical/NormalizeAggregate.java | 12 ++++++------ .../trees/plans/logical/LogicalAggregate.java | 16 ++++++++-------- .../trees/plans/logical/LogicalApply.java | 2 +- .../plans/logical/LogicalEmptyRelation.java | 2 +- .../trees/plans/logical/LogicalJoin.java | 8 ++++---- .../trees/plans/logical/LogicalOlapScan.java | 15 ++++++--------- .../plans/logical/LogicalOneRowRelation.java | 2 +- .../trees/plans/logical/LogicalProject.java | 2 +- .../trees/plans/logical/LogicalRelation.java | 4 ++-- .../trees/plans/logical/LogicalSelectHint.java | 2 +- .../trees/plans/logical/LogicalSort.java | 4 ++-- .../trees/plans/logical/LogicalTopN.java | 4 ++-- .../plans/physical/AbstractPhysicalJoin.java | 13 +++++++------ .../plans/physical/AbstractPhysicalSort.java | 2 +- .../plans/physical/PhysicalAggregate.java | 18 +++++++++--------- .../trees/plans/physical/PhysicalBinary.java | 6 ------ .../plans/physical/PhysicalEmptyRelation.java | 2 +- .../trees/plans/physical/PhysicalHashJoin.java | 1 + .../trees/plans/physical/PhysicalLeaf.java | 5 ----- .../trees/plans/physical/PhysicalOlapScan.java | 16 +++++++++------- .../plans/physical/PhysicalOneRowRelation.java | 2 +- .../trees/plans/physical/PhysicalProject.java | 7 ++++--- .../trees/plans/physical/PhysicalRelation.java | 6 +++--- .../trees/plans/physical/RuntimeFilter.java | 4 ++-- .../org/apache/doris/nereids/util/Utils.java | 2 +- 27 files changed, 83 insertions(+), 90 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnAgg.java index e2be8d1524..cd1e6fbea4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnAgg.java @@ -41,7 +41,7 @@ import java.util.stream.Collectors; *

* Use the correlated column as the group by column of agg, * the output column is the correlated column and the input column. - *

+ *

  * before:
  *              apply
  *          /              \
@@ -55,6 +55,7 @@ import java.util.stream.Collectors;
  * Input(output:b)    agg(output:fn,this.f; group by:this.f)
  *                              |
  *                    Filter(Uncorrelated predicate)
+ * 
*/ public class ApplyPullFilterOnAgg extends OneRewriteRuleFactory { @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnProjectUnderAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnProjectUnderAgg.java index 0c5d8f29f6..77b8eef78c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnProjectUnderAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ApplyPullFilterOnProjectUnderAgg.java @@ -33,6 +33,7 @@ import java.util.List; /** * Swap the order of project and filter under agg in correlated subqueries. + *
  * before:
  *              apply
  *         /              \
@@ -54,6 +55,7 @@ import java.util.List;
  *                  Project(output:a,this.f, Unapply predicate(slots))
  *                          |
  *                         child
+ * 
*/ public class ApplyPullFilterOnProjectUnderAgg extends OneRewriteRuleFactory { @Override @@ -66,12 +68,11 @@ public class ApplyPullFilterOnProjectUnderAgg extends OneRewriteRuleFactory { LogicalFilter filter = project.child(); List newProjects = Lists.newArrayList(); newProjects.addAll(project.getProjects()); - filter.child().getOutput() - .stream().forEach(slot -> { - if (!newProjects.contains(slot)) { - newProjects.add(slot); - } - }); + filter.child().getOutput().forEach(slot -> { + if (!newProjects.contains(slot)) { + newProjects.add(slot); + } + }); LogicalProject newProject = new LogicalProject<>(newProjects, filter.child()); LogicalFilter newFilter = new LogicalFilter<>(filter.getPredicates(), newProject); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/NormalizeAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/NormalizeAggregate.java index e1a2a832d3..51ea90a47d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/NormalizeAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/NormalizeAggregate.java @@ -44,21 +44,21 @@ import java.util.stream.Collectors; * normalize aggregate's group keys and AggregateFunction's child to SlotReference * and generate a LogicalProject top on LogicalAggregate to hold to order of aggregate output, * since aggregate output's order could change when we do translate. - * + *

* Apply this rule could simplify the processing of enforce and translate. - * + *

  * Original Plan:
  * Aggregate(
  *   keys:[k1#1, K2#2 + 1],
  *   outputs:[k1#1, Alias(K2# + 1)#4, Alias(k1#1 + 1)#5, Alias(SUM(v1#3))#6,
  *            Alias(SUM(v1#3 + 1))#7, Alias(SUM(v1#3) + 1)#8])
- *
+ * 
* After rule: * Project(k1#1, Alias(SR#9)#4, Alias(k1#1 + 1)#5, Alias(SR#10))#6, Alias(SR#11))#7, Alias(SR#10 + 1)#8) * +-- Aggregate(keys:[k1#1, SR#9], outputs:[k1#1, SR#9, Alias(SUM(v1#3))#10, Alias(SUM(v1#3 + 1))#11]) - * +-- Project(k1#1, Alias(K2#2 + 1)#9, v1#3) - * - * More example could get from UT {@link NormalizeAggregateTest} + * +-- Project(k1#1, Alias(K2#2 + 1)#9, v1#3) + *

+ * More example could get from UT {NormalizeAggregateTest} */ public class NormalizeAggregate extends OneRewriteRuleFactory { @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java index 626c74dab9..4721289b97 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java @@ -56,10 +56,10 @@ public class LogicalAggregate extends LogicalUnary groupByExpressions; - private final List outputExpressions; + private final ImmutableList groupByExpressions; + private final ImmutableList outputExpressions; // TODO: we should decide partition expression according to cost. - private final Optional> partitionExpressions; + private final Optional> partitionExpressions; // use for scenes containing distinct agg // 1. If there is LOCAL only, LOCAL is the final phase @@ -121,7 +121,7 @@ public class LogicalAggregate extends LogicalUnary extends LogicalUnary withChildren(List children) { Preconditions.checkArgument(children.size() == 1); - return new LogicalAggregate<>(groupByExpressions, outputExpressions, partitionExpressions, + return new LogicalAggregate<>(groupByExpressions, outputExpressions, partitionExpressions.map(List.class::cast), disassembled, normalized, isFinalPhase, aggPhase, children.get(0)); } @Override public LogicalAggregate withGroupExpression(Optional groupExpression) { - return new LogicalAggregate<>(groupByExpressions, outputExpressions, partitionExpressions, + return new LogicalAggregate<>(groupByExpressions, outputExpressions, partitionExpressions.map(List.class::cast), disassembled, normalized, isFinalPhase, aggPhase, groupExpression, Optional.of(getLogicalProperties()), children.get(0)); } @Override public LogicalAggregate withLogicalProperties(Optional logicalProperties) { - return new LogicalAggregate<>(groupByExpressions, outputExpressions, partitionExpressions, + return new LogicalAggregate<>(groupByExpressions, outputExpressions, partitionExpressions.map(List.class::cast), disassembled, normalized, isFinalPhase, aggPhase, Optional.empty(), logicalProperties, children.get(0)); } public LogicalAggregate withGroupByAndOutput(List groupByExprList, List outputExpressionList) { - return new LogicalAggregate<>(groupByExprList, outputExpressionList, partitionExpressions, + return new LogicalAggregate<>(groupByExprList, outputExpressionList, partitionExpressions.map(List.class::cast), disassembled, normalized, isFinalPhase, aggPhase, child()); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java index 4bfd3f00de..4eda26ad00 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java @@ -45,7 +45,7 @@ import java.util.Optional; public class LogicalApply extends LogicalBinary { // correlation column - private final List correlationSlot; + private final ImmutableList correlationSlot; // original subquery private final SubqueryExpr subqueryExpr; // correlation Conjunction diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java index b8b185f7fb..ebbefe257f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java @@ -40,7 +40,7 @@ import java.util.Optional; * select * from tbl limit 0 */ public class LogicalEmptyRelation extends LogicalLeaf implements EmptyRelation { - private final List projects; + private final ImmutableList projects; public LogicalEmptyRelation(List projects) { this(projects, Optional.empty(), Optional.empty()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java index 2d844689f1..2904d1d7cd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java @@ -45,8 +45,8 @@ import java.util.stream.Collectors; public class LogicalJoin extends LogicalBinary implements Join { private final JoinType joinType; - private final List otherJoinConjuncts; - private final List hashJoinConjuncts; + private final ImmutableList otherJoinConjuncts; + private final ImmutableList hashJoinConjuncts; // Use for top-to-down join reorder private final JoinReorderContext joinReorderContext = new JoinReorderContext(); @@ -105,8 +105,8 @@ public class LogicalJoin getOtherJoinConjuncts() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java index 6e7be3703e..06007dda3e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java @@ -18,7 +18,6 @@ package org.apache.doris.nereids.trees.plans.logical; import org.apache.doris.catalog.OlapTable; -import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.Table; import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; @@ -32,7 +31,6 @@ import org.apache.doris.nereids.util.Utils; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import java.util.List; @@ -45,10 +43,10 @@ import java.util.Optional; public class LogicalOlapScan extends LogicalRelation { private final long selectedIndexId; - private final List selectedTabletId; + private final ImmutableList selectedTabletId; private final boolean partitionPruned; - private final List candidateIndexIds; + private final ImmutableList candidateIndexIds; private final boolean indexSelected; private final PreAggStatus preAggStatus; @@ -80,12 +78,11 @@ public class LogicalOlapScan extends LogicalRelation { // revisit this after rollup and materialized view selection are fully supported. this.selectedIndexId = CollectionUtils.isEmpty(candidateIndexIds) ? getTable().getBaseIndexId() : candidateIndexIds.get(0); - this.selectedTabletId = Lists.newArrayList(); - for (Partition partition : getTable().getAllPartitions()) { - selectedTabletId.addAll(partition.getBaseIndex().getTabletIdsInOrder()); - } + this.selectedTabletId = getTable().getAllPartitions().stream() + .flatMap(partition -> partition.getBaseIndex().getTabletIdsInOrder().stream()) + .collect(ImmutableList.toImmutableList()); this.partitionPruned = partitionPruned; - this.candidateIndexIds = candidateIndexIds; + this.candidateIndexIds = ImmutableList.copyOf(candidateIndexIds); this.indexSelected = indexSelected; this.preAggStatus = preAggStatus; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java index fe99d21f6f..5b26472e9a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java @@ -40,7 +40,7 @@ import java.util.Optional; * e.g. select 100, 'value' */ public class LogicalOneRowRelation extends LogicalLeaf implements OneRowRelation { - private final List projects; + private final ImmutableList projects; public LogicalOneRowRelation(List projects) { this(projects, Optional.empty(), Optional.empty()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java index debc456bc0..f49a27da2c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java @@ -40,7 +40,7 @@ import java.util.Optional; */ public class LogicalProject extends LogicalUnary implements Project { - private final List projects; + private final ImmutableList projects; public LogicalProject(List projects, CHILD_TYPE child) { this(projects, Optional.empty(), Optional.empty(), child); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java index 10a94bbc9e..f3fab310c4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java @@ -42,8 +42,8 @@ import java.util.Optional; public abstract class LogicalRelation extends LogicalLeaf implements Scan { protected final Table table; - protected final List qualifier; - protected final List selectedPartitionIds; + protected final ImmutableList qualifier; + protected final ImmutableList selectedPartitionIds; protected final RelationId id; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSelectHint.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSelectHint.java index aeda4ac403..93060ae4ef 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSelectHint.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSelectHint.java @@ -41,7 +41,7 @@ import java.util.stream.Collectors; * e.g. LogicalSelectHint (set_var(query_timeout='1800', exec_mem_limit='2147483648')) */ public class LogicalSelectHint extends LogicalUnary { - private final Map hints; + private final ImmutableMap hints; public LogicalSelectHint(Map hints, CHILD_TYPE child) { this(hints, Optional.empty(), Optional.empty(), child); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java index d55cb58e79..299b7ed86f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java @@ -44,7 +44,7 @@ import java.util.Optional; */ public class LogicalSort extends LogicalUnary implements Sort { - private final List orderKeys; + private final ImmutableList orderKeys; public LogicalSort(List orderKeys, CHILD_TYPE child) { this(orderKeys, Optional.empty(), Optional.empty(), child); @@ -56,7 +56,7 @@ public class LogicalSort extends LogicalUnary orderKeys, Optional groupExpression, Optional logicalProperties, CHILD_TYPE child) { super(PlanType.LOGICAL_SORT, groupExpression, logicalProperties, child); - this.orderKeys = Objects.requireNonNull(orderKeys, "orderKeys can not be null"); + this.orderKeys = ImmutableList.copyOf(Objects.requireNonNull(orderKeys, "orderKeys can not be null")); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java index aab24fc2d0..7e10cb52c6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java @@ -40,7 +40,7 @@ import java.util.Optional; */ public class LogicalTopN extends LogicalUnary implements TopN { - private final List orderKeys; + private final ImmutableList orderKeys; private final int limit; private final int offset; @@ -54,7 +54,7 @@ public class LogicalTopN extends LogicalUnary orderKeys, int limit, int offset, Optional groupExpression, Optional logicalProperties, CHILD_TYPE child) { super(PlanType.LOGICAL_TOP_N, groupExpression, logicalProperties, child); - this.orderKeys = Objects.requireNonNull(orderKeys, "orderKeys can not be null"); + this.orderKeys = ImmutableList.copyOf(Objects.requireNonNull(orderKeys, "orderKeys can not be null")); this.limit = limit; this.offset = offset; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java index 1aa4834d28..d8ffec7266 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalJoin.java @@ -28,6 +28,7 @@ import org.apache.doris.nereids.trees.plans.algebra.Join; import org.apache.doris.nereids.util.ExpressionUtils; import org.apache.doris.statistics.StatsDeriveResult; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import java.util.List; @@ -43,9 +44,9 @@ public abstract class AbstractPhysicalJoin< extends PhysicalBinary implements Join { protected final JoinType joinType; - protected final List hashJoinConjuncts; + protected final ImmutableList hashJoinConjuncts; - protected final List otherJoinConjuncts; + protected final ImmutableList otherJoinConjuncts; /** * Constructor of PhysicalJoin. @@ -55,8 +56,8 @@ public abstract class AbstractPhysicalJoin< LogicalProperties logicalProperties, LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild) { super(type, groupExpression, logicalProperties, leftChild, rightChild); this.joinType = Objects.requireNonNull(joinType, "joinType can not be null"); - this.hashJoinConjuncts = hashJoinConjuncts; - this.otherJoinConjuncts = Objects.requireNonNull(otherJoinConjuncts, "condition can not be null"); + this.hashJoinConjuncts = ImmutableList.copyOf(hashJoinConjuncts); + this.otherJoinConjuncts = ImmutableList.copyOf(otherJoinConjuncts); } /** @@ -68,8 +69,8 @@ public abstract class AbstractPhysicalJoin< StatsDeriveResult statsDeriveResult, LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild) { super(type, groupExpression, logicalProperties, physicalProperties, statsDeriveResult, leftChild, rightChild); this.joinType = Objects.requireNonNull(joinType, "joinType can not be null"); - this.hashJoinConjuncts = hashJoinConjuncts; - this.otherJoinConjuncts = Objects.requireNonNull(otherJoinConjuncts, "condition can not be null"); + this.hashJoinConjuncts = ImmutableList.copyOf(hashJoinConjuncts); + this.otherJoinConjuncts = ImmutableList.copyOf(otherJoinConjuncts); } public List getHashJoinConjuncts() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalSort.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalSort.java index 0ef4002699..82cf0a4238 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalSort.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/AbstractPhysicalSort.java @@ -38,7 +38,7 @@ import java.util.Optional; */ public abstract class AbstractPhysicalSort extends PhysicalUnary implements Sort { - protected final List orderKeys; + protected final ImmutableList orderKeys; /** * Constructor of AbstractPhysicalSort. diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java index f41ba9302f..b06af5431b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java @@ -43,11 +43,11 @@ import java.util.Optional; */ public class PhysicalAggregate extends PhysicalUnary implements Aggregate { - private final List groupByExpressions; + private final ImmutableList groupByExpressions; - private final List outputExpressions; + private final ImmutableList outputExpressions; - private final List partitionExpressions; + private final ImmutableList partitionExpressions; private final AggPhase aggPhase; @@ -80,10 +80,10 @@ public class PhysicalAggregate extends PhysicalUnary groupExpression, LogicalProperties logicalProperties, CHILD_TYPE child) { super(PlanType.PHYSICAL_AGGREGATE, groupExpression, logicalProperties, child); - this.groupByExpressions = groupByExpressions; - this.outputExpressions = outputExpressions; + this.groupByExpressions = ImmutableList.copyOf(groupByExpressions); + this.outputExpressions = ImmutableList.copyOf(outputExpressions); this.aggPhase = aggPhase; - this.partitionExpressions = partitionExpressions; + this.partitionExpressions = ImmutableList.copyOf(partitionExpressions); this.usingStream = usingStream; this.isFinalPhase = isFinalPhase; } @@ -102,10 +102,10 @@ public class PhysicalAggregate extends PhysicalUnary extends AbstractPhysicalPlan implements BinaryPlan { - - public PhysicalBinary(PlanType type, LogicalProperties logicalProperties, - LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild) { - super(type, logicalProperties, leftChild, rightChild); - } - public PhysicalBinary(PlanType type, Optional groupExpression, LogicalProperties logicalProperties, LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEmptyRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEmptyRelation.java index de883c2c19..89b6ceeaa1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEmptyRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEmptyRelation.java @@ -42,7 +42,7 @@ import java.util.Optional; * select * from tbl limit 0 */ public class PhysicalEmptyRelation extends PhysicalLeaf implements EmptyRelation { - private final List projects; + private final ImmutableList projects; public PhysicalEmptyRelation(List projects, LogicalProperties logicalProperties) { this(projects, Optional.empty(), logicalProperties, null, null); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java index 11a27566e9..8f38c06f8f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java @@ -44,6 +44,7 @@ public class PhysicalHashJoin< private boolean shouldTranslateOutput = true; + // TODO: What's purpose? it's alway empty. private final List filterConjuncts = Lists.newArrayList(); public PhysicalHashJoin(JoinType joinType, List hashJoinConjuncts, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLeaf.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLeaf.java index 0809d91f12..5ca0028d17 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLeaf.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLeaf.java @@ -31,11 +31,6 @@ import javax.annotation.Nullable; * Abstract class for all physical plan that have no child. */ public abstract class PhysicalLeaf extends AbstractPhysicalPlan implements LeafPlan { - - public PhysicalLeaf(PlanType type, LogicalProperties logicalProperties) { - super(type, logicalProperties); - } - public PhysicalLeaf(PlanType type, Optional groupExpression, LogicalProperties logicalProperties) { super(type, groupExpression, logicalProperties); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java index 97a8474b16..32323da0a1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java @@ -29,6 +29,8 @@ import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; import org.apache.doris.nereids.util.Utils; import org.apache.doris.statistics.StatsDeriveResult; +import com.google.common.collect.ImmutableList; + import java.util.List; import java.util.Objects; import java.util.Optional; @@ -40,8 +42,8 @@ public class PhysicalOlapScan extends PhysicalRelation { private final OlapTable olapTable; private final DistributionSpec distributionSpec; private final long selectedIndexId; - private final List selectedTabletIds; - private final List selectedPartitionIds; + private final ImmutableList selectedTabletIds; + private final ImmutableList selectedPartitionIds; private final PreAggStatus preAggStatus; /** @@ -53,8 +55,8 @@ public class PhysicalOlapScan extends PhysicalRelation { super(id, PlanType.PHYSICAL_OLAP_SCAN, qualifier, groupExpression, logicalProperties); this.olapTable = olapTable; this.selectedIndexId = selectedIndexId; - this.selectedTabletIds = selectedTabletIds; - this.selectedPartitionIds = selectedPartitionIds; + this.selectedTabletIds = ImmutableList.copyOf(selectedTabletIds); + this.selectedPartitionIds = ImmutableList.copyOf(selectedPartitionIds); this.distributionSpec = distributionSpec; this.preAggStatus = preAggStatus; } @@ -63,15 +65,15 @@ public class PhysicalOlapScan extends PhysicalRelation { * Constructor for PhysicalOlapScan. */ public PhysicalOlapScan(RelationId id, OlapTable olapTable, List qualifier, long selectedIndexId, - List selectedTabletId, List selectedPartitionId, DistributionSpec distributionSpec, + List selectedTabletIds, List selectedPartitionIds, DistributionSpec distributionSpec, PreAggStatus preAggStatus, Optional groupExpression, LogicalProperties logicalProperties, PhysicalProperties physicalProperties, StatsDeriveResult statsDeriveResult) { super(id, PlanType.PHYSICAL_OLAP_SCAN, qualifier, groupExpression, logicalProperties, physicalProperties, statsDeriveResult); this.olapTable = olapTable; this.selectedIndexId = selectedIndexId; - this.selectedTabletIds = selectedTabletId; - this.selectedPartitionIds = selectedPartitionId; + this.selectedTabletIds = ImmutableList.copyOf(selectedTabletIds); + this.selectedPartitionIds = ImmutableList.copyOf(selectedPartitionIds); this.distributionSpec = distributionSpec; this.preAggStatus = preAggStatus; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOneRowRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOneRowRelation.java index 8a593095c7..7f783a438c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOneRowRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOneRowRelation.java @@ -41,7 +41,7 @@ import java.util.Optional; * e.g. select 100, 'value' */ public class PhysicalOneRowRelation extends PhysicalLeaf implements OneRowRelation { - private final List projects; + private final ImmutableList projects; public PhysicalOneRowRelation(List projects, LogicalProperties logicalProperties) { this(projects, Optional.empty(), logicalProperties, null, null); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java index 04e457c1e7..6dfee166c3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java @@ -30,6 +30,7 @@ import org.apache.doris.nereids.util.Utils; import org.apache.doris.statistics.StatsDeriveResult; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Objects; @@ -40,7 +41,7 @@ import java.util.Optional; */ public class PhysicalProject extends PhysicalUnary implements Project { - private final List projects; + private final ImmutableList projects; public PhysicalProject(List projects, LogicalProperties logicalProperties, CHILD_TYPE child) { this(projects, Optional.empty(), logicalProperties, child); @@ -49,7 +50,7 @@ public class PhysicalProject extends PhysicalUnary projects, Optional groupExpression, LogicalProperties logicalProperties, CHILD_TYPE child) { super(PlanType.PHYSICAL_PROJECT, groupExpression, logicalProperties, child); - this.projects = Objects.requireNonNull(projects, "projects can not be null"); + this.projects = ImmutableList.copyOf(Objects.requireNonNull(projects, "projects can not be null")); } public PhysicalProject(List projects, Optional groupExpression, @@ -57,7 +58,7 @@ public class PhysicalProject extends PhysicalUnary getProjects() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRelation.java index eb458bf171..81006a73e0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRelation.java @@ -38,7 +38,7 @@ import java.util.Optional; */ public abstract class PhysicalRelation extends PhysicalLeaf implements Scan { - protected final List qualifier; + protected final ImmutableList qualifier; protected final RelationId id; @@ -48,7 +48,7 @@ public abstract class PhysicalRelation extends PhysicalLeaf implements Scan { public PhysicalRelation(RelationId id, PlanType type, List qualifier, Optional groupExpression, LogicalProperties logicalProperties) { super(type, groupExpression, logicalProperties); - this.qualifier = Objects.requireNonNull(qualifier, "qualifier can not be null"); + this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null")); this.id = id; } @@ -59,7 +59,7 @@ public abstract class PhysicalRelation extends PhysicalLeaf implements Scan { Optional groupExpression, LogicalProperties logicalProperties, PhysicalProperties physicalProperties, StatsDeriveResult statsDeriveResult) { super(type, groupExpression, logicalProperties, physicalProperties, statsDeriveResult); - this.qualifier = Objects.requireNonNull(qualifier, "qualifier can not be null"); + this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null")); this.id = id; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/RuntimeFilter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/RuntimeFilter.java index 8678fd92d0..8eeb6071d7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/RuntimeFilter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/RuntimeFilter.java @@ -82,8 +82,8 @@ public class RuntimeFilter { if (!expr.children().stream().allMatch(SlotReference.class::isInstance)) { return null; } - //current we assume that there are certainly different slot reference in equal to. - //they are not from the same relation. + // current we assume that there are certainly different slot reference in equal to. + // they are not from the same relation. int exchangeTag = join.child(0).getOutput().stream().anyMatch(slot -> slot.getExprId().equals( ((SlotReference) expr.child(1)).getExprId())) ? 1 : 0; return Pair.of(expr.child(exchangeTag), expr.child(1 ^ exchangeTag)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java index cf8cf9fe2c..b4c41bdf3f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java @@ -174,7 +174,7 @@ public class Utils { public static List getCorrelatedSlots(List correlatedPredicates, List correlatedSlots) { List slots = new ArrayList<>(); - correlatedPredicates.stream().forEach(predicate -> { + correlatedPredicates.forEach(predicate -> { if (!(predicate instanceof BinaryExpression)) { throw new AnalysisException("UnSupported expr type: " + correlatedPredicates); }