You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/01/29 08:49:05 UTC

[doris] branch master updated: [refactor](Nereids) use immutable collections as far as possible (#16193)

This is an automated email from the ASF dual-hosted git repository.

morrysnow 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 1ad6ef939b [refactor](Nereids) use immutable collections as far as possible (#16193)
1ad6ef939b is described below

commit 1ad6ef939b46865706988465bd4c0b6ac6cfb59f
Author: morrySnow <10...@users.noreply.github.com>
AuthorDate: Sun Jan 29 16:48:58 2023 +0800

    [refactor](Nereids) use immutable collections as far as possible (#16193)
---
 .../org/apache/doris/catalog/FunctionRegistry.java |  3 +--
 .../doris/nereids/analyzer/UnboundFunction.java    |  2 +-
 .../doris/nereids/analyzer/UnboundRelation.java    |  9 +++-----
 .../apache/doris/nereids/analyzer/UnboundStar.java |  4 +++-
 .../glue/translator/PhysicalPlanTranslator.java    |  2 +-
 .../glue/translator/RuntimeFilterTranslator.java   |  1 -
 .../doris/nereids/metrics/EventSwitchParser.java   |  4 ++--
 .../doris/nereids/parser/LogicalPlanBuilder.java   | 24 +++++++++-----------
 .../nereids/properties/LogicalProperties.java      | 16 ++++++-------
 .../AdjustAggregateNullableForEmptySet.java        |  6 ++---
 .../rules/analysis/AvgDistinctToSumDivCount.java   | 10 ++++-----
 .../doris/nereids/rules/analysis/BindFunction.java | 11 +++++----
 .../doris/nereids/rules/analysis/BindRelation.java |  6 ++---
 .../nereids/rules/analysis/FillUpMissingSlots.java | 11 +++++----
 .../analysis/ReplaceExpressionByChildOutput.java   |  3 +--
 .../apache/doris/nereids/rules/analysis/Scope.java |  8 +++----
 .../expression/rewrite/ExpressionRewrite.java      | 26 ++++++++++++----------
 .../expression/rewrite/ExpressionRuleExecutor.java |  5 +++--
 .../rewrite/rules/ExtractCommonFactorRule.java     | 11 +++++----
 .../rules/rewrite/logical/AdjustNullable.java      | 11 ++++-----
 .../rewrite/logical/ApplyPullFilterOnAgg.java      |  6 +++--
 .../rewrite/logical/EliminateOrderByConstant.java  |  5 +++--
 .../logical/ExtractFilterFromCrossJoin.java        |  5 +++--
 .../nereids/rules/rewrite/logical/MultiJoin.java   |  7 +++---
 .../rewrite/logical/PruneAggChildColumns.java      |  3 +--
 .../rewrite/logical/PruneJoinChildrenColumns.java  |  8 +++----
 .../rewrite/logical/PruneRepeatChildColumns.java   |  3 +--
 .../rewrite/logical/PruneSortChildColumns.java     |  3 +--
 .../PushdownExpressionsInHashCondition.java        | 11 +++++----
 .../logical/PushdownFilterThroughSetOperation.java |  5 +++--
 .../org/apache/doris/nereids/trees/LeafNode.java   |  1 +
 .../trees/expressions/AggregateExpression.java     |  2 +-
 .../doris/nereids/trees/expressions/CaseWhen.java  | 15 ++++++-------
 .../trees/expressions/ExpressionEvaluator.java     |  1 +
 .../nereids/trees/expressions/SlotReference.java   |  2 +-
 .../expressions/functions/agg/IntersectCount.java  |  7 +++---
 .../functions/agg/MultiDistinctCount.java          |  7 +++---
 .../doris/nereids/trees/plans/GroupPlan.java       |  1 +
 .../apache/doris/nereids/trees/plans/LeafPlan.java |  1 +
 .../doris/nereids/trees/plans/PreAggStatus.java    |  1 +
 .../doris/nereids/trees/plans/RelationId.java      |  1 +
 .../doris/nereids/trees/plans/UnaryPlan.java       |  3 +--
 .../nereids/trees/plans/algebra/Aggregate.java     |  2 +-
 .../doris/nereids/trees/plans/algebra/Project.java |  9 ++++----
 .../trees/plans/logical/LogicalAggregate.java      |  3 ++-
 .../nereids/trees/plans/logical/LogicalApply.java  |  3 ++-
 .../trees/plans/logical/LogicalAssertNumRows.java  |  1 +
 .../nereids/trees/plans/logical/LogicalBinary.java |  9 --------
 .../nereids/trees/plans/logical/LogicalCTE.java    |  6 ++---
 .../trees/plans/logical/LogicalEmptyRelation.java  |  3 ++-
 .../trees/plans/logical/LogicalFileScan.java       |  5 -----
 .../nereids/trees/plans/logical/LogicalFilter.java |  4 ++--
 .../nereids/trees/plans/logical/LogicalJoin.java   |  6 ++---
 .../nereids/trees/plans/logical/LogicalLeaf.java   |  8 -------
 .../nereids/trees/plans/logical/LogicalLimit.java  |  5 ++---
 .../trees/plans/logical/LogicalOlapScan.java       |  7 +++---
 .../trees/plans/logical/LogicalOneRowRelation.java |  3 ++-
 .../trees/plans/logical/LogicalProject.java        |  5 ++---
 .../trees/plans/logical/LogicalRelation.java       |  9 +++-----
 .../nereids/trees/plans/logical/LogicalRepeat.java |  5 ++---
 .../trees/plans/logical/LogicalSchemaScan.java     | 11 ++++-----
 .../trees/plans/logical/LogicalSelectHint.java     |  3 ++-
 .../trees/plans/logical/LogicalSubQueryAlias.java  |  2 +-
 .../trees/plans/logical/LogicalTVFRelation.java    |  1 +
 .../nereids/trees/plans/logical/LogicalTopN.java   |  2 +-
 .../nereids/trees/plans/logical/LogicalUnion.java  |  1 +
 .../nereids/trees/plans/logical/RelationUtil.java  |  1 +
 .../nereids/trees/plans/logical/UsingJoin.java     |  5 ++---
 .../trees/plans/physical/AbstractPhysicalJoin.java | 11 +++++----
 .../trees/plans/physical/AbstractPhysicalSort.java |  2 +-
 .../plans/physical/PhysicalAssertNumRows.java      |  1 +
 .../trees/plans/physical/PhysicalBinary.java       |  5 ++---
 .../plans/physical/PhysicalEmptyRelation.java      |  3 ++-
 .../trees/plans/physical/PhysicalFilter.java       |  1 +
 .../trees/plans/physical/PhysicalHashJoin.java     |  1 +
 .../nereids/trees/plans/physical/PhysicalLeaf.java |  1 +
 .../trees/plans/physical/PhysicalLimit.java        |  2 +-
 .../trees/plans/physical/PhysicalOlapScan.java     |  1 +
 .../plans/physical/PhysicalOneRowRelation.java     |  3 ++-
 .../nereids/trees/plans/physical/PhysicalPlan.java |  1 +
 .../trees/plans/physical/PhysicalProject.java      |  2 +-
 .../trees/plans/physical/PhysicalRelation.java     |  7 +++---
 .../trees/plans/physical/PhysicalRepeat.java       |  4 ++--
 .../trees/plans/physical/PhysicalSetOperation.java |  1 +
 .../physical/PhysicalStorageLayerAggregate.java    |  1 +
 .../trees/plans/physical/PhysicalTVFRelation.java  |  1 +
 .../trees/plans/physical/RuntimeFilter.java        | 15 ++-----------
 .../org/apache/doris/nereids/util/JoinUtils.java   |  2 +-
 88 files changed, 211 insertions(+), 244 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionRegistry.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionRegistry.java
index 69ec50ae45..78dd1ccd01 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionRegistry.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionRegistry.java
@@ -58,7 +58,7 @@ public class FunctionRegistry {
     }
 
     // currently we only find function by name and arity
-    public FunctionBuilder findFunctionBuilder(String name, List<? extends Object> arguments) {
+    public FunctionBuilder findFunctionBuilder(String name, List<?> arguments) {
         int arity = arguments.size();
         List<FunctionBuilder> functionBuilders = name2Builders.get(name.toLowerCase());
         if (functionBuilders == null || functionBuilders.isEmpty()) {
@@ -78,7 +78,6 @@ public class FunctionRegistry {
         if (candidateBuilders.size() > 1) {
             String candidateHints = getCandidateHint(name, candidateBuilders);
             // NereidsPlanner not supported override function by the same arity, should we support it?
-
             throw new AnalysisException("Function '" + name + "' is ambiguous: " + candidateHints);
         }
         return candidateBuilders.get(0);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
index 5b8b22f85f..fa6e24722e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
@@ -42,7 +42,7 @@ public class UnboundFunction extends Function implements Unbound, PropagateNulla
     }
 
     public UnboundFunction(String name, boolean isDistinct, List<Expression> arguments) {
-        super(arguments.toArray(new Expression[0]));
+        super(arguments);
         this.name = Objects.requireNonNull(name, "name cannot be null");
         this.isDistinct = isDistinct;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
index e61ba7818c..f33009b982 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
@@ -34,7 +34,6 @@ import org.apache.doris.nereids.util.Utils;
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.StringUtils;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -48,8 +47,7 @@ public class UnboundRelation extends LogicalRelation implements Unbound {
     private final boolean isTempPart;
 
     public UnboundRelation(RelationId id, List<String> nameParts) {
-        this(id, nameParts, Optional.empty(), Optional.empty(),
-                Collections.emptyList(), false);
+        this(id, nameParts, Optional.empty(), Optional.empty(), ImmutableList.of(), false);
     }
 
     public UnboundRelation(RelationId id, List<String> nameParts, List<String> partNames, boolean isTempPart) {
@@ -59,7 +57,7 @@ public class UnboundRelation extends LogicalRelation implements Unbound {
     public UnboundRelation(RelationId id, List<String> nameParts, Optional<GroupExpression> groupExpression,
             Optional<LogicalProperties> logicalProperties, List<String> partNames, boolean isTempPart) {
         super(id, PlanType.LOGICAL_UNBOUND_RELATION, groupExpression, logicalProperties);
-        this.nameParts = nameParts;
+        this.nameParts = ImmutableList.copyOf(Objects.requireNonNull(nameParts, "nameParts should not null"));
         this.partNames = ImmutableList.copyOf(Objects.requireNonNull(partNames, "partNames should not null"));
         this.isTempPart = isTempPart;
     }
@@ -91,8 +89,7 @@ public class UnboundRelation extends LogicalRelation implements Unbound {
 
     @Override
     public Plan withLogicalProperties(Optional<LogicalProperties> logicalProperties) {
-        return new UnboundRelation(id, nameParts, Optional.empty(), logicalProperties, partNames,
-                isTempPart);
+        return new UnboundRelation(id, nameParts, Optional.empty(), logicalProperties, partNames, isTempPart);
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
index 44f29cd2ad..2ba1d593d0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
@@ -24,6 +24,8 @@ import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.util.Utils;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 import java.util.Objects;
 
@@ -34,7 +36,7 @@ public class UnboundStar extends NamedExpression implements LeafExpression, Unbo
     private final List<String> qualifier;
 
     public UnboundStar(List<String> qualifier) {
-        this.qualifier = Objects.requireNonNull(qualifier, "qualifier can not be null");
+        this.qualifier = Objects.requireNonNull(ImmutableList.copyOf(qualifier), "qualifier can not be null");
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 8e2894ddc1..581c2418a3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -1643,7 +1643,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 // and the original exprId should be retained at this time.
                 groupSlotList.add((SlotReference) e);
             } else {
-                groupSlotList.add(new SlotReference(e.toSql(), e.getDataType(), e.nullable(), Collections.emptyList()));
+                groupSlotList.add(new SlotReference(e.toSql(), e.getDataType(), e.nullable(), ImmutableList.of()));
             }
         }
         return groupSlotList;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/RuntimeFilterTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/RuntimeFilterTranslator.java
index 09dbb4115b..2195ff94ef 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/RuntimeFilterTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/RuntimeFilterTranslator.java
@@ -83,7 +83,6 @@ public class RuntimeFilterTranslator {
                 ImmutableMap.of(target.getDesc().getParent().getId(), ImmutableList.of(target.getSlotId())),
                 filter.getType(), context.getLimits());
         origFilter.setIsBroadcast(node.getDistributionMode() == DistributionMode.BROADCAST);
-        filter.setFinalized();
         OlapScanNode scanNode = context.getScanNodeOfLegacyRuntimeFilterTarget().get(filter.getTargetExpr());
         origFilter.addTarget(new RuntimeFilterTarget(
                 scanNode,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/metrics/EventSwitchParser.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/metrics/EventSwitchParser.java
index 2bd5287b0e..48620afc52 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/metrics/EventSwitchParser.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/metrics/EventSwitchParser.java
@@ -25,6 +25,7 @@ import org.apache.doris.nereids.metrics.event.GroupMergeEvent;
 import org.apache.doris.nereids.metrics.event.StatsStateEvent;
 import org.apache.doris.nereids.metrics.event.TransformEvent;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
@@ -33,7 +34,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * parser
@@ -76,7 +76,7 @@ public class EventSwitchParser {
     public static List<String> checkEventModeStringAndSplit(String eventTypeMode) {
         List<String> strings = Arrays.stream(eventTypeMode.toLowerCase().split("[\\s+,]"))
                 .map(String::trim)
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
         if (strings.size() == 0) {
             return null;
         } else if ("all".equals(strings.get(0))) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 7bcd6be9a6..575f20c994 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -247,7 +247,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Build a logical plan tree with unbounded nodes.
@@ -320,7 +319,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
         String functionName = ctx.functionName.getText();
         List<Expression> arguments = ctx.expression().stream()
                 .<Expression>map(this::typedVisit)
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
         Function unboundFunction = new UnboundFunction(functionName, arguments);
         return new LogicalGenerate<>(ImmutableList.of(unboundFunction),
                 ImmutableList.of(new UnboundSlot(generateName, columnName)), plan);
@@ -516,7 +515,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
                         .map(RuleContext::getText)
                         .collect(ImmutableList.toImmutableList());
             } else {
-                target = Collections.emptyList();
+                target = ImmutableList.of();
             }
             return new UnboundStar(target);
         });
@@ -884,7 +883,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
         Expression e = getExpression(context.value);
         List<WhenClause> whenClauses = context.whenClause().stream()
                 .map(w -> new WhenClause(new EqualTo(e, getExpression(w.condition)), getExpression(w.result)))
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
         if (context.elseExpression == null) {
             return new CaseWhen(whenClauses);
         }
@@ -907,7 +906,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
     public Expression visitSearchedCase(DorisParser.SearchedCaseContext context) {
         List<WhenClause> whenClauses = context.whenClause().stream()
                 .map(w -> new WhenClause(getExpression(w.condition), getExpression(w.result)))
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
         if (context.elseExpression == null) {
             return new CaseWhen(whenClauses);
         }
@@ -1296,11 +1295,11 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
                     if (!expressions.stream().allMatch(UnboundSlot.class::isInstance)) {
                         throw new ParseException("only column name is supported in except clause", selectColumnCtx);
                     }
-                    project = new LogicalProject<>(ImmutableList.of(new UnboundStar(Collections.emptyList())),
+                    project = new LogicalProject<>(ImmutableList.of(new UnboundStar(ImmutableList.of())),
                         expressions, aggregate, isDistinct);
                 } else {
                     List<NamedExpression> projects = getNamedExpressions(selectColumnCtx.namedExpressionSeq());
-                    project = new LogicalProject<>(projects, Collections.emptyList(), aggregate, isDistinct);
+                    project = new LogicalProject<>(projects, ImmutableList.of(), aggregate, isDistinct);
                 }
                 return new LogicalHaving<>(ExpressionUtils.extractConjunctionToSet(
                         getExpression((havingClause.get().booleanExpression()))), project);
@@ -1365,8 +1364,8 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
                     condition = Optional.ofNullable(getExpression(joinCriteria.booleanExpression()));
                 } else if (joinCriteria.USING() != null) {
                     ids = visitIdentifierList(joinCriteria.identifierList())
-                                    .stream().map(UnboundSlot::quoted).collect(
-                                            Collectors.toList());
+                            .stream().map(UnboundSlot::quoted)
+                            .collect(ImmutableList.toImmutableList());
                 }
             } else {
                 // keep same with original planner, allow cross/inner join
@@ -1382,8 +1381,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
                         last,
                         plan(join.relationPrimary()));
             } else {
-                last = new UsingJoin(joinType, last,
-                        plan(join.relationPrimary()), Collections.emptyList(), ids, joinHint);
+                last = new UsingJoin(joinType, last, plan(join.relationPrimary()), ImmutableList.of(), ids, joinHint);
             }
         }
         return last;
@@ -1436,11 +1434,11 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
                     if (!expressions.stream().allMatch(UnboundSlot.class::isInstance)) {
                         throw new ParseException("only column name is supported in except clause", selectCtx);
                     }
-                    return new LogicalProject<>(ImmutableList.of(new UnboundStar(Collections.emptyList())),
+                    return new LogicalProject<>(ImmutableList.of(new UnboundStar(ImmutableList.of())),
                             expressions, input, isDistinct);
                 } else {
                     List<NamedExpression> projects = getNamedExpressions(selectCtx.namedExpressionSeq());
-                    return new LogicalProject<>(projects, Collections.emptyList(), input, isDistinct);
+                    return new LogicalProject<>(projects, ImmutableList.of(), input, isDistinct);
                 }
             }
         });
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/LogicalProperties.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/LogicalProperties.java
index de47654382..913d565ac9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/LogicalProperties.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/LogicalProperties.java
@@ -25,14 +25,13 @@ import org.apache.doris.nereids.trees.expressions.Slot;
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * Logical properties used for analysis and optimize in Nereids.
@@ -65,17 +64,18 @@ public class LogicalProperties {
         );
         this.outputExprIdsSupplier = Suppliers.memoize(
                 () -> this.outputSupplier.get().stream().map(NamedExpression::getExprId).map(Id.class::cast)
-                        .collect(Collectors.toList())
+                        .collect(ImmutableList.toImmutableList())
         );
         this.outputSetSupplier = Suppliers.memoize(
-                () -> Sets.newHashSet(this.outputSupplier.get())
+                () -> ImmutableSet.copyOf(this.outputSupplier.get())
         );
         this.outputMapSupplier = Suppliers.memoize(
-                () -> this.outputSetSupplier.get().stream().collect(Collectors.toMap(s -> s, s -> s))
+                () -> this.outputSetSupplier.get().stream().collect(ImmutableMap.toImmutableMap(s -> s, s -> s))
         );
         this.outputExprIdSetSupplier = Suppliers.memoize(
-                () -> this.outputSupplier.get().stream().map(NamedExpression::getExprId)
-                        .collect(Collectors.toCollection(HashSet::new))
+                () -> this.outputSupplier.get().stream()
+                        .map(NamedExpression::getExprId)
+                        .collect(ImmutableSet.toImmutableSet())
         );
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AdjustAggregateNullableForEmptySet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AdjustAggregateNullableForEmptySet.java
index b913c6ac45..41c68a3292 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AdjustAggregateNullableForEmptySet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AdjustAggregateNullableForEmptySet.java
@@ -27,10 +27,10 @@ import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewri
 import org.apache.doris.nereids.trees.plans.logical.LogicalHaving;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * adjust aggregate nullable when: group expr list is empty and function is NullableAggregateFunction,
@@ -46,7 +46,7 @@ public class AdjustAggregateNullableForEmptySet implements RewriteRuleFactory {
                                     List<NamedExpression> output = agg.getOutputExpressions().stream()
                                             .map(ne -> ((NamedExpression) FunctionReplacer.INSTANCE.replace(ne,
                                                     agg.getGroupByExpressions().isEmpty())))
-                                            .collect(Collectors.toList());
+                                            .collect(ImmutableList.toImmutableList());
                                     return agg.withAggOutput(output);
                                 })
                 ),
@@ -56,7 +56,7 @@ public class AdjustAggregateNullableForEmptySet implements RewriteRuleFactory {
                                     Set<Expression> newConjuncts = having.getConjuncts().stream()
                                             .map(ne -> FunctionReplacer.INSTANCE.replace(ne,
                                                     having.child().getGroupByExpressions().isEmpty()))
-                                            .collect(Collectors.toSet());
+                                            .collect(ImmutableSet.toImmutableSet());
                                     return new LogicalHaving<>(newConjuncts, having.child());
                                 })
                 )
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AvgDistinctToSumDivCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AvgDistinctToSumDivCount.java
index 8813d6fec5..f72e4bc5cd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AvgDistinctToSumDivCount.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AvgDistinctToSumDivCount.java
@@ -29,11 +29,11 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.Sum;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * AvgDistinctToSumDivCount.
@@ -51,15 +51,13 @@ public class AvgDistinctToSumDivCount extends OneAnalysisRuleFactory {
                             .collect(ImmutableMap.toImmutableMap(function -> function, function -> {
                                 Sum sum = new Sum(true, ((Avg) function).child());
                                 Count count = new Count(true, ((Avg) function).child());
-                                Divide divide = new Divide(sum, count);
-                                return divide;
+                                return new Divide(sum, count);
                             }));
                     if (!avgToSumDivCount.isEmpty()) {
                         List<NamedExpression> newOutput = agg.getOutputExpressions().stream()
                                 .map(expr -> (NamedExpression) ExpressionUtils.replace(expr, avgToSumDivCount))
-                                .collect(Collectors.toList());
-                        return new LogicalAggregate<>(agg.getGroupByExpressions(), newOutput,
-                                agg.child());
+                                .collect(ImmutableList.toImmutableList());
+                        return new LogicalAggregate<>(agg.getGroupByExpressions(), newOutput, agg.child());
                     } else {
                         return agg;
                     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java
index cffdc9c96e..0bb4e17296 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java
@@ -53,11 +53,11 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalTVFRelation;
 import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * BindFunction.
@@ -163,7 +163,7 @@ public class BindFunction implements AnalysisRuleFactory {
         ExpressionRewriteContext rewriteContext = new ExpressionRewriteContext(ctx);
         return exprList.stream()
             .map(expr -> bindAndTypeCoercion(expr, ctx.getEnv(), rewriteContext))
-            .collect(Collectors.toList());
+            .collect(ImmutableList.toImmutableList());
     }
 
     private <E extends Expression> E bindAndTypeCoercion(E expr, Env env, ExpressionRewriteContext ctx) {
@@ -177,7 +177,7 @@ public class BindFunction implements AnalysisRuleFactory {
         ExpressionRewriteContext rewriteContext = new ExpressionRewriteContext(ctx);
         return exprSet.stream()
                 .map(expr -> bindAndTypeCoercion(expr, ctx.getEnv(), rewriteContext))
-                .collect(Collectors.toSet());
+                .collect(ImmutableSet.toImmutableSet());
     }
 
     /**
@@ -216,12 +216,11 @@ public class BindFunction implements AnalysisRuleFactory {
             Env env = statementContext.getConnectContext().getEnv();
             List<Expression> boundArguments = unboundFunction.getArguments().stream()
                     .map(e -> INSTANCE.bind(e, env))
-                    .collect(Collectors.toList());
+                    .collect(ImmutableList.toImmutableList());
             FunctionRegistry functionRegistry = env.getFunctionRegistry();
 
             String functionName = unboundFunction.getName();
-            FunctionBuilder functionBuilder = functionRegistry.findFunctionBuilder(
-                    functionName, boundArguments);
+            FunctionBuilder functionBuilder = functionRegistry.findFunctionBuilder(functionName, boundArguments);
             BoundFunction function = functionBuilder.build(functionName, boundArguments);
             if (!(function instanceof TableGeneratingFunction)) {
                 throw new AnalysisException(function.toSql() + " is not a TableGeneratingFunction");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
index 6093817a66..fce1228a6c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
@@ -55,10 +55,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.commons.collections.CollectionUtils;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Rule to bind relations in query plan.
@@ -217,7 +215,7 @@ public class BindRelation extends OneAnalysisRuleFactory {
     private List<Long> getPartitionIds(TableIf t, UnboundRelation unboundRelation) {
         List<String> parts = unboundRelation.getPartNames();
         if (CollectionUtils.isEmpty(parts)) {
-            return Collections.emptyList();
+            return ImmutableList.of();
         }
         if (!t.getType().equals(TableIf.TableType.OLAP)) {
             throw new IllegalStateException(String.format(
@@ -230,6 +228,6 @@ public class BindRelation extends OneAnalysisRuleFactory {
                 throw new IllegalStateException(String.format("Partition: %s is not exists", name));
             }
             return part.getId();
-        }).collect(Collectors.toList());
+        }).collect(ImmutableList.toImmutableList());
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
index 4d0e640fbf..045ac37aed 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
@@ -243,13 +243,12 @@ public class FillUpMissingSlots implements AnalysisRuleFactory {
         Plan apply(Resolver resolver, Aggregate aggregate);
     }
 
-    private Plan createPlan(Resolver resolver, Aggregate<? extends Plan> aggregate,
-            PlanGenerator planGenerator) {
+    private Plan createPlan(Resolver resolver, Aggregate<? extends Plan> aggregate, PlanGenerator planGenerator) {
         List<NamedExpression> projections = aggregate.getOutputExpressions().stream()
-                .map(NamedExpression::toSlot).collect(Collectors.toList());
-        List<NamedExpression> newOutputExpressions = Streams.concat(
-                aggregate.getOutputExpressions().stream(), resolver.getNewOutputSlots().stream()
-        ).collect(Collectors.toList());
+                .map(NamedExpression::toSlot).collect(ImmutableList.toImmutableList());
+        List<NamedExpression> newOutputExpressions = Streams
+                .concat(aggregate.getOutputExpressions().stream(), resolver.getNewOutputSlots().stream())
+                .collect(ImmutableList.toImmutableList());
         Aggregate newAggregate = aggregate.withAggOutput(newOutputExpressions);
         Plan plan = planGenerator.apply(resolver, newAggregate);
         return new LogicalProject<>(projections, plan);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ReplaceExpressionByChildOutput.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ReplaceExpressionByChildOutput.java
index fb04a9c8de..ba953307eb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ReplaceExpressionByChildOutput.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ReplaceExpressionByChildOutput.java
@@ -36,7 +36,6 @@ import com.google.common.collect.Maps;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.stream.Collectors;
 
 /**
  * replace.
@@ -89,7 +88,7 @@ public class ReplaceExpressionByChildOutput implements AnalysisRuleFactory {
                 changed.set(true);
             }
             return new OrderKey(newExpr, k.isAsc(), k.isNullFirst());
-        }).collect(Collectors.toList());
+        }).collect(ImmutableList.toImmutableList());
         if (changed.get()) {
             return new LogicalSort<>(newKeys, sort.child());
         } else {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/Scope.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/Scope.java
index 918392f9a5..1c0db90f8a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/Scope.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/Scope.java
@@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableList.Builder;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 /**
@@ -60,16 +61,13 @@ public class Scope {
 
     public Scope(Optional<Scope> outerScope, List<Slot> slots, Optional<SubqueryExpr> subqueryExpr) {
         this.outerScope = outerScope;
-        this.slots = slots;
+        this.slots = ImmutableList.copyOf(Objects.requireNonNull(slots, "slots can not be null"));
         this.ownerSubquery = subqueryExpr;
         this.correlatedSlots = new ArrayList<>();
     }
 
     public Scope(List<Slot> slots) {
-        this.outerScope = Optional.empty();
-        this.slots = slots;
-        this.ownerSubquery = Optional.empty();
-        this.correlatedSlots = new ArrayList<>();
+        this(Optional.empty(), slots, Optional.empty());
     }
 
     public List<Slot> getSlots() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
index 5a54c4aa71..d4e033cb35 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java
@@ -41,7 +41,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * expression of plan rewrite rule.
@@ -82,7 +81,7 @@ public class ExpressionRewrite implements RewriteRuleFactory {
                 List<Function> generators = generate.getGenerators();
                 List<Function> newGenerators = generators.stream()
                         .map(func -> (Function) rewriter.rewrite(func))
-                        .collect(Collectors.toList());
+                        .collect(ImmutableList.toImmutableList());
                 if (generators.equals(newGenerators)) {
                     return generate;
                 }
@@ -99,7 +98,7 @@ public class ExpressionRewrite implements RewriteRuleFactory {
                 List<NamedExpression> newProjects = projects
                         .stream()
                         .map(expr -> (NamedExpression) rewriter.rewrite(expr))
-                        .collect(Collectors.toList());
+                        .collect(ImmutableList.toImmutableList());
                 if (projects.equals(newProjects)) {
                     return oneRowRelation;
                 }
@@ -114,8 +113,8 @@ public class ExpressionRewrite implements RewriteRuleFactory {
             return logicalProject().then(project -> {
                 List<NamedExpression> projects = project.getProjects();
                 List<NamedExpression> newProjects = projects.stream()
-                        .map(expr -> (NamedExpression) rewriter.rewrite(expr)).collect(Collectors.toList());
-                if (projects.containsAll(newProjects)) {
+                        .map(expr -> (NamedExpression) rewriter.rewrite(expr)).collect(ImmutableList.toImmutableList());
+                if (projects.equals(newProjects)) {
                     return project;
                 }
                 return new LogicalProject<>(newProjects, project.child());
@@ -146,8 +145,8 @@ public class ExpressionRewrite implements RewriteRuleFactory {
 
                 List<NamedExpression> outputExpressions = agg.getOutputExpressions();
                 List<NamedExpression> newOutputExpressions = outputExpressions.stream()
-                        .map(expr -> (NamedExpression) rewriter.rewrite(expr)).collect(Collectors.toList());
-                if (outputExpressions.containsAll(newOutputExpressions) && groupByExprs.containsAll(newGroupByExprs)) {
+                        .map(expr -> (NamedExpression) rewriter.rewrite(expr)).collect(ImmutableList.toImmutableList());
+                if (outputExpressions.equals(newOutputExpressions)) {
                     return agg;
                 }
                 return new LogicalAggregate<>(newGroupByExprs, newOutputExpressions,
@@ -223,13 +222,16 @@ public class ExpressionRewrite implements RewriteRuleFactory {
         @Override
         public Rule build() {
             return logicalRepeat().then(r -> {
-                List<List<Expression>> groupingExprs = new ArrayList<>();
+                ImmutableList.Builder<List<Expression>> groupingExprs = ImmutableList.builder();
                 for (List<Expression> expressions : r.getGroupingSets()) {
-                    groupingExprs.add(expressions.stream().map(rewriter::rewrite).collect(Collectors.toList()));
+                    groupingExprs.add(expressions.stream().map(rewriter::rewrite)
+                            .collect(ImmutableList.toImmutableList()));
                 }
-                return r.withGroupSetsAndOutput(groupingExprs,
-                        r.getOutputExpressions().stream().map(rewriter::rewrite).map(e -> (NamedExpression) e)
-                                .collect(Collectors.toList()));
+                return r.withGroupSetsAndOutput(groupingExprs.build(),
+                        r.getOutputExpressions().stream()
+                                .map(rewriter::rewrite)
+                                .map(e -> (NamedExpression) e)
+                                .collect(ImmutableList.toImmutableList()));
             }).toRule(RuleType.REWRITE_REPEAT_EXPRESSION);
         }
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java
index d8da2617cc..fdcb0ba497 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java
@@ -21,9 +21,10 @@ import org.apache.doris.nereids.rules.expression.rewrite.rules.NormalizeBinaryPr
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.qe.ConnectContext;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Expression rewrite entry, which contains all rewrite rules.
@@ -43,7 +44,7 @@ public class ExpressionRuleExecutor {
     }
 
     public List<Expression> rewrite(List<Expression> exprs) {
-        return exprs.stream().map(this::rewrite).collect(Collectors.toList());
+        return exprs.stream().map(this::rewrite).collect(ImmutableList.toImmutableList());
     }
 
     /**
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/ExtractCommonFactorRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/ExtractCommonFactorRule.java
index 5f011fe178..d02a0da2d6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/ExtractCommonFactorRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/ExtractCommonFactorRule.java
@@ -24,10 +24,12 @@ import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -47,8 +49,7 @@ public class ExtractCommonFactorRule extends AbstractExpressionRewriteRule {
     public Expression visitCompoundPredicate(CompoundPredicate expr, ExpressionRewriteContext context) {
 
         Expression rewrittenChildren = ExpressionUtils.combine(expr.getClass(), ExpressionUtils.extract(expr).stream()
-                .map(predicate -> rewrite(predicate, context)).collect(Collectors.toList()));
-
+                .map(predicate -> rewrite(predicate, context)).collect(ImmutableList.toImmutableList()));
         if (!(rewrittenChildren instanceof CompoundPredicate)) {
             return rewrittenChildren;
         }
@@ -59,8 +60,10 @@ public class ExtractCommonFactorRule extends AbstractExpressionRewriteRule {
                 .map(predicate -> predicate instanceof CompoundPredicate ? ExpressionUtils.extract(
                         (CompoundPredicate) predicate) : Lists.newArrayList(predicate)).collect(Collectors.toList());
 
-        Set<Expression> commons = partitions.stream().map(predicates -> predicates.stream().collect(Collectors.toSet()))
-                .reduce(Sets::intersection).orElse(Collections.emptySet());
+        Set<Expression> commons = partitions.stream()
+                .<Set<Expression>>map(HashSet::new)
+                .reduce(Sets::intersection)
+                .orElse(Collections.emptySet());
 
         List<List<Expression>> uncorrelated = partitions.stream()
                 .map(predicates -> predicates.stream().filter(p -> !commons.contains(p)).collect(Collectors.toList()))
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AdjustNullable.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AdjustNullable.java
index 3caaf01759..3f9ff0d215 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AdjustNullable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AdjustNullable.java
@@ -34,6 +34,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 
 import java.util.List;
@@ -88,7 +89,7 @@ public class AdjustNullable implements RewriteRuleFactory {
                     List<NamedExpression> newOutputs = updateExpressions(repeat.getOutputExpressions(), exprIdSlotMap);
                     List<List<Expression>> newGroupingSets = repeat.getGroupingSets().stream()
                             .map(l -> updateExpressions(l, exprIdSlotMap))
-                            .collect(Collectors.toList());
+                            .collect(ImmutableList.toImmutableList());
                     return repeat.withGroupSetsAndOutput(newGroupingSets, newOutputs).recomputeLogicalProperties();
                 })),
                 RuleType.ADJUST_NULLABLE_ON_SET_OPERATION.build(logicalSetOperation().then(setOperation -> {
@@ -117,14 +118,14 @@ public class AdjustNullable implements RewriteRuleFactory {
                     Map<ExprId, Slot> exprIdSlotMap = collectChildrenOutputMap(sort);
                     List<OrderKey> newKeys = sort.getOrderKeys().stream()
                             .map(old -> old.withExpression(updateExpression(old.getExpr(), exprIdSlotMap)))
-                            .collect(Collectors.toList());
+                            .collect(ImmutableList.toImmutableList());
                     return sort.withOrderKeys(newKeys).recomputeLogicalProperties();
                 })),
                 RuleType.ADJUST_NULLABLE_ON_TOP_N.build(logicalTopN().then(topN -> {
                     Map<ExprId, Slot> exprIdSlotMap = collectChildrenOutputMap(topN);
                     List<OrderKey> newKeys = topN.getOrderKeys().stream()
                             .map(old -> old.withExpression(updateExpression(old.getExpr(), exprIdSlotMap)))
-                            .collect(Collectors.toList());
+                            .collect(ImmutableList.toImmutableList());
                     return topN.withOrderKeys(newKeys).recomputeLogicalProperties();
                 }))
         );
@@ -135,11 +136,11 @@ public class AdjustNullable implements RewriteRuleFactory {
     }
 
     private <T extends Expression> List<T> updateExpressions(List<T> inputs, Map<ExprId, Slot> exprIdSlotMap) {
-        return inputs.stream().map(i -> updateExpression(i, exprIdSlotMap)).collect(Collectors.toList());
+        return inputs.stream().map(i -> updateExpression(i, exprIdSlotMap)).collect(ImmutableList.toImmutableList());
     }
 
     private <T extends Expression> Set<T> updateExpressions(Set<T> inputs, Map<ExprId, Slot> exprIdSlotMap) {
-        return inputs.stream().map(i -> updateExpression(i, exprIdSlotMap)).collect(Collectors.toSet());
+        return inputs.stream().map(i -> updateExpression(i, exprIdSlotMap)).collect(ImmutableSet.toImmutableSet());
     }
 
     private Map<ExprId, Slot> collectChildrenOutputMap(LogicalPlan plan) {
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 fd31a14bdf..8998ba6afe 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
@@ -30,12 +30,12 @@ import org.apache.doris.nereids.util.ExpressionUtils;
 import org.apache.doris.nereids.util.PlanUtils;
 import org.apache.doris.nereids.util.Utils;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * Merge the correlated predicate and agg in the filter under apply.
@@ -79,7 +79,9 @@ public class ApplyPullFilterOnAgg extends OneRewriteRuleFactory {
             List<Expression> newGroupby = Utils.getCorrelatedSlots(correlatedPredicate,
                     apply.getCorrelationSlot());
             newGroupby.addAll(agg.getGroupByExpressions());
-            newAggOutput.addAll(newGroupby.stream().map(NamedExpression.class::cast).collect(Collectors.toList()));
+            newAggOutput.addAll(newGroupby.stream()
+                    .map(NamedExpression.class::cast)
+                    .collect(ImmutableList.toImmutableList()));
             LogicalAggregate newAgg = new LogicalAggregate<>(
                     newGroupby, newAggOutput,
                     PlanUtils.filterOrSelf(ImmutableSet.copyOf(unCorrelatedPredicate), filter.child()));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateOrderByConstant.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateOrderByConstant.java
index 6ab3455192..59cb04abe6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateOrderByConstant.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateOrderByConstant.java
@@ -22,8 +22,9 @@ import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * SELECT * FROM lineorder ORDER BY 'f' -> SELECT * FROM lineorder
@@ -37,7 +38,7 @@ public class EliminateOrderByConstant extends OneRewriteRuleFactory {
                     .getOrderKeys()
                     .stream()
                     .filter(k -> !(k.getExpr().isConstant()))
-                    .collect(Collectors.toList());
+                    .collect(ImmutableList.toImmutableList());
             if (orderKeysWithoutConst.isEmpty()) {
                 return sort.child();
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractFilterFromCrossJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractFilterFromCrossJoin.java
index 6b82bac2d0..f0adb815a4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractFilterFromCrossJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ExtractFilterFromCrossJoin.java
@@ -27,8 +27,9 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.util.ExpressionUtils;
 import org.apache.doris.nereids.util.PlanUtils;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.util.Set;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
@@ -44,7 +45,7 @@ public class ExtractFilterFromCrossJoin extends OneRewriteRuleFactory {
                             join.left(), join.right());
                     Set<Expression> predicates = Stream.concat(join.getHashJoinConjuncts().stream(),
                                     join.getOtherJoinConjuncts().stream())
-                            .collect(Collectors.toSet());
+                            .collect(ImmutableSet.toImmutableSet());
                     return PlanUtils.filterOrSelf(predicates, newJoin);
                 }).toRule(RuleType.EXTRACT_FILTER_FROM_JOIN);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MultiJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MultiJoin.java
index 9d1ecf84ab..3615827e07 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MultiJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/MultiJoin.java
@@ -34,7 +34,6 @@ import com.google.common.collect.ImmutableList.Builder;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * A MultiJoin represents a join of N inputs (NAry-Join).
@@ -113,7 +112,7 @@ public class MultiJoin extends AbstractLogicalPlan {
             for (Plan child : children) {
                 builder.addAll(child.getOutput().stream()
                         .map(o -> o.withNullable(true))
-                        .collect(Collectors.toList()));
+                        .collect(ImmutableList.toImmutableList()));
             }
             return builder.build();
         }
@@ -124,7 +123,7 @@ public class MultiJoin extends AbstractLogicalPlan {
             if (joinType.isRightOuterJoin()) {
                 builder.addAll(children.get(0).getOutput().stream()
                         .map(o -> o.withNullable(true))
-                        .collect(Collectors.toList()));
+                        .collect(ImmutableList.toImmutableList()));
             }
             for (int i = 1; i < children.size(); i++) {
                 builder.addAll(children.get(i).getOutput());
@@ -142,7 +141,7 @@ public class MultiJoin extends AbstractLogicalPlan {
             if (joinType.isLeftOuterJoin()) {
                 builder.addAll(children.get(arity() - 1).getOutput().stream()
                         .map(o -> o.withNullable(true))
-                        .collect(Collectors.toList()));
+                        .collect(ImmutableList.toImmutableList()));
             }
 
             return builder.build();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneAggChildColumns.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneAggChildColumns.java
index 53667f1dec..d8a31543fa 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneAggChildColumns.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneAggChildColumns.java
@@ -32,7 +32,6 @@ import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * prune its child output according to agg.
@@ -65,7 +64,7 @@ public class PruneAggChildColumns extends OneRewriteRuleFactory {
             }
             Set<Slot> aggInputSlots = agg.getInputSlots();
             List<NamedExpression> prunedOutputs = childOutput.stream().filter(aggInputSlots::contains)
-                    .collect(Collectors.toList());
+                    .collect(ImmutableList.toImmutableList());
             if (prunedOutputs.size() == agg.child().getOutput().size()) {
                 return agg;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneJoinChildrenColumns.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneJoinChildrenColumns.java
index 33dbc63057..f05271d32d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneJoinChildrenColumns.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneJoinChildrenColumns.java
@@ -73,15 +73,15 @@ public class PruneJoinChildrenColumns
                 .collect(Collectors.toSet());
 
         List<NamedExpression> leftInputs = joinPlan.left().getOutput().stream()
-                .filter(r -> exprIds.contains(r.getExprId())).collect(Collectors.toList());
+                .filter(r -> exprIds.contains(r.getExprId())).collect(ImmutableList.toImmutableList());
         List<NamedExpression> rightInputs = joinPlan.right().getOutput().stream()
-                .filter(r -> exprIds.contains(r.getExprId())).collect(Collectors.toList());
+                .filter(r -> exprIds.contains(r.getExprId())).collect(ImmutableList.toImmutableList());
 
         if (leftInputs.isEmpty()) {
-            leftInputs.add(ExpressionUtils.selectMinimumColumn(joinPlan.left().getOutput()));
+            leftInputs = ImmutableList.of(ExpressionUtils.selectMinimumColumn(joinPlan.left().getOutput()));
         }
         if (rightInputs.isEmpty()) {
-            rightInputs.add(ExpressionUtils.selectMinimumColumn(joinPlan.right().getOutput()));
+            rightInputs = ImmutableList.of(ExpressionUtils.selectMinimumColumn(joinPlan.right().getOutput()));
         }
 
         Plan leftPlan = joinPlan.left();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneRepeatChildColumns.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneRepeatChildColumns.java
index 47631ea16d..02d3ef12af 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneRepeatChildColumns.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneRepeatChildColumns.java
@@ -28,7 +28,6 @@ import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * prune its child output according to repeat.
@@ -54,7 +53,7 @@ public class PruneRepeatChildColumns extends OneRewriteRuleFactory {
             List<Slot> childOutput = repeat.child().getOutput();
             Set<Slot> groupByInputSlots = repeat.getInputSlots();
             List<NamedExpression> prunedOutputs = childOutput.stream().filter(groupByInputSlots::contains)
-                    .collect(Collectors.toList());
+                    .collect(ImmutableList.toImmutableList());
             if (prunedOutputs.size() == repeat.child().getOutput().size()) {
                 return repeat;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortChildColumns.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortChildColumns.java
index d7210196d1..372d03f8d0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortChildColumns.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneSortChildColumns.java
@@ -25,7 +25,6 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -50,7 +49,7 @@ public class PruneSortChildColumns extends AbstractPushDownProjectRule<LogicalSo
             return sortPlan;
         }
         return sortPlan.withChildren(
-            ImmutableList.of(new LogicalProject<>(Lists.newArrayList(required), sortPlan.child()))
+            ImmutableList.of(new LogicalProject<>(ImmutableList.copyOf(required), sortPlan.child()))
         );
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownExpressionsInHashCondition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownExpressionsInHashCondition.java
index e02d2dea6d..9a1d1fc392 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownExpressionsInHashCondition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownExpressionsInHashCondition.java
@@ -40,7 +40,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * push down expression which is not slot reference
@@ -86,14 +85,14 @@ public class PushdownExpressionsInHashCondition extends OneRewriteRuleFactory {
                             join.getHashJoinConjuncts().stream()
                                     .map(equalTo -> equalTo.withChildren(equalTo.children()
                                             .stream().map(expr -> exprMap.get(expr).toSlot())
-                                            .collect(Collectors.toList())))
-                                    .collect(Collectors.toList()),
+                                            .collect(ImmutableList.toImmutableList())))
+                                    .collect(ImmutableList.toImmutableList()),
                             join.children().stream().map(
                                     plan -> new LogicalProject<>(new ImmutableList.Builder<NamedExpression>()
-                                            .addAll(iter.next().stream().map(expr -> exprMap.get(expr))
-                                                    .collect(Collectors.toList()))
+                                            .addAll(iter.next().stream().map(exprMap::get)
+                                                    .collect(ImmutableList.toImmutableList()))
                                             .addAll(getOutput(plan, join)).build(), plan))
-                                    .collect(Collectors.toList()));
+                                    .collect(ImmutableList.toImmutableList()));
                 }).toRule(RuleType.PUSHDOWN_EXPRESSIONS_IN_HASH_CONDITIONS);
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughSetOperation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughSetOperation.java
index a5af6c93e2..69ba69136f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughSetOperation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughSetOperation.java
@@ -29,12 +29,13 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalSetOperation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalUnion;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * Convert the expression in the filter into the output column corresponding to the child node and push it down.
@@ -59,7 +60,7 @@ public class PushdownFilterThroughSetOperation extends OneRewriteRuleFactory {
                 }
 
                 Set<Expression> newFilterPredicates = filter.getConjuncts().stream().map(conjunct ->
-                        ExpressionUtils.replace(conjunct, replaceMap)).collect(Collectors.toSet());
+                        ExpressionUtils.replace(conjunct, replaceMap)).collect(ImmutableSet.toImmutableSet());
                 newChildren.add(new LogicalFilter<>(newFilterPredicates, child));
             }
             if (setOperation instanceof LogicalUnion && setOperation.getQualifier() == Qualifier.DISTINCT) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/LeafNode.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/LeafNode.java
index a40dffe14f..1b25f6fce2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/LeafNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/LeafNode.java
@@ -21,6 +21,7 @@ package org.apache.doris.nereids.trees;
  * Abstract class for all tree node that have no child.
  */
 public interface LeafNode<NODE_TYPE extends TreeNode<NODE_TYPE>> extends TreeNode<NODE_TYPE> {
+
     @Override
     default int arity() {
         return 0;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AggregateExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AggregateExpression.java
index b88ff0d8bf..cfe647ed5f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AggregateExpression.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AggregateExpression.java
@@ -38,8 +38,8 @@ import java.util.Objects;
  * aggregate.
  */
 public class AggregateExpression extends Expression implements UnaryExpression {
-    private final AggregateFunction function;
 
+    private final AggregateFunction function;
     private final AggregateParam aggregateParam;
 
     /** local aggregate */
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java
index 2ebdc5cecd..0615b182be 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CaseWhen.java
@@ -18,6 +18,7 @@
 package org.apache.doris.nereids.trees.expressions;
 
 import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.util.TypeCoercionUtils;
@@ -29,7 +30,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * The internal representation of
@@ -44,7 +45,7 @@ public class CaseWhen extends Expression {
     private final Optional<Expression> defaultValue;
 
     public CaseWhen(List<WhenClause> whenClauses) {
-        super(whenClauses.toArray(new Expression[0]));
+        super((List) whenClauses);
         this.whenClauses = ImmutableList.copyOf(Objects.requireNonNull(whenClauses));
         defaultValue = Optional.empty();
     }
@@ -66,11 +67,9 @@ public class CaseWhen extends Expression {
     }
 
     public List<DataType> dataTypesForCoercion() {
-        List<DataType> result = whenClauses.stream().map(WhenClause::getDataType).collect(Collectors.toList());
-        if (defaultValue.isPresent()) {
-            result.add(defaultValue.get().getDataType());
-        }
-        return result;
+        return Stream.concat(whenClauses.stream(), defaultValue.map(Stream::of).orElseGet(Stream::empty))
+                .map(ExpressionTrait::getDataType)
+                .collect(ImmutableList.toImmutableList());
     }
 
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
@@ -83,7 +82,7 @@ public class CaseWhen extends Expression {
         for (Expression child : children) {
             DataType tempType = outputType;
             outputType = TypeCoercionUtils.findTightestCommonType(null,
-                            outputType, child.getDataType()).orElseGet(() -> tempType);
+                    outputType, child.getDataType()).orElse(tempType);
         }
         return outputType;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
index ef452e7d68..0eb013614a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
@@ -38,6 +38,7 @@ import java.util.List;
  */
 public enum ExpressionEvaluator {
     INSTANCE;
+
     private ImmutableMultimap<String, FunctionInvoker> functions;
 
     ExpressionEvaluator() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
index 108bc481cd..e378b580ee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
@@ -73,7 +73,7 @@ public class SlotReference extends Slot {
         this.exprId = exprId;
         this.name = name;
         this.dataType = dataType;
-        this.qualifier = qualifier;
+        this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null"));
         this.nullable = nullable;
         this.column = column;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java
index 4f83b6cdaf..fcb4ae3609 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java
@@ -29,9 +29,9 @@ import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * AggregateFunction 'intersect_count'. This class is generated by GenerateFunction.
@@ -39,10 +39,9 @@ import java.util.stream.Collectors;
 public class IntersectCount extends AggregateFunction
         implements ExplicitlyCastableSignature, AlwaysNotNullable, BitmapIntersectFunction {
 
-    public static final List<FunctionSignature> SIGNATURES = DataType.nonNullNonCharTypes()
-            .stream()
+    public static final List<FunctionSignature> SIGNATURES = DataType.nonNullNonCharTypes().stream()
             .map(type -> FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BitmapType.INSTANCE, type, type))
-            .collect(Collectors.toList());
+            .collect(ImmutableList.toImmutableList());
 
     /**
      * constructor with 3 or more arguments.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java
index 151ec4f3a8..72a26d288e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java
@@ -32,7 +32,6 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /** MultiDistinctCount */
 public class MultiDistinctCount extends AggregateFunction
@@ -48,13 +47,13 @@ public class MultiDistinctCount extends AggregateFunction
     public MultiDistinctCount(Expression arg0, Expression... varArgs) {
         super("multi_distinct_count", true, ExpressionUtils.mergeArguments(arg0, varArgs).stream()
                 .map(arg -> arg.getDataType() instanceof DateLikeType ? new Cast(arg, BigIntType.INSTANCE) : arg)
-                .collect(Collectors.toList()));
+                .collect(ImmutableList.toImmutableList()));
     }
 
     public MultiDistinctCount(boolean distinct, Expression arg0, Expression... varArgs) {
-        super("multi_distinct_count", true, ExpressionUtils.mergeArguments(arg0, varArgs).stream()
+        super("multi_distinct_count", distinct, ExpressionUtils.mergeArguments(arg0, varArgs).stream()
                 .map(arg -> arg.getDataType() instanceof DateLikeType ? new Cast(arg, BigIntType.INSTANCE) : arg)
-                .collect(Collectors.toList()));
+                .collect(ImmutableList.toImmutableList()));
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/GroupPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/GroupPlan.java
index 481b292e03..8967891521 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/GroupPlan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/GroupPlan.java
@@ -36,6 +36,7 @@ import java.util.Optional;
  * as a place-holder when do match root.
  */
 public class GroupPlan extends LogicalLeaf {
+
     private final Group group;
 
     public GroupPlan(Group group) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/LeafPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/LeafPlan.java
index f07bd6a556..64cec035cd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/LeafPlan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/LeafPlan.java
@@ -27,6 +27,7 @@ import java.util.List;
  * Abstract class for all plan node that have no child.
  */
 public interface LeafPlan extends Plan, LeafNode<Plan> {
+
     @Override
     default Plan withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.isEmpty());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PreAggStatus.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PreAggStatus.java
index 4676666987..70d2a90db9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PreAggStatus.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PreAggStatus.java
@@ -23,6 +23,7 @@ import java.util.function.Supplier;
  * Pre-aggregate status for OLAP scan table.
  */
 public class PreAggStatus {
+
     private enum Status {
         ON, OFF
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/RelationId.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/RelationId.java
index 834bc19e48..ac2ab3233b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/RelationId.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/RelationId.java
@@ -26,6 +26,7 @@ import java.util.Objects;
  * relation id
  */
 public class RelationId extends Id<RelationId> {
+
     public RelationId(int id) {
         super(id);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/UnaryPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/UnaryPlan.java
index a392a5ff1a..cbb7686b62 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/UnaryPlan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/UnaryPlan.java
@@ -22,6 +22,5 @@ import org.apache.doris.nereids.trees.UnaryNode;
 /**
  * interface for all plan node that have one child.
  */
-public interface UnaryPlan<CHILD_TYPE extends Plan>
-        extends Plan, UnaryNode<Plan, CHILD_TYPE> {
+public interface UnaryPlan<CHILD_TYPE extends Plan> extends Plan, UnaryNode<Plan, CHILD_TYPE> {
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Aggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Aggregate.java
index 7163d86106..f5e3e14772 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Aggregate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Aggregate.java
@@ -38,7 +38,7 @@ public interface Aggregate<CHILD_TYPE extends Plan> extends UnaryPlan<CHILD_TYPE
 
     List<NamedExpression> getOutputExpressions();
 
-    Aggregate withAggOutput(List<NamedExpression> newOutput);
+    Aggregate<CHILD_TYPE> withAggOutput(List<NamedExpression> newOutput);
 
     @Override
     Aggregate<Plan> withChildren(List<Plan> children);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java
index 5ee0370134..9724d0e8ca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java
@@ -30,7 +30,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -84,7 +83,7 @@ public interface Project {
         return thisProjectExpressions.stream()
                 .map(e -> ExpressionReplacer.INSTANCE.replace(e, bottomAliasMap))
                 .map(NamedExpression.class::cast)
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
     }
 
     /**
@@ -130,7 +129,7 @@ public interface Project {
 
         public Expression replace(Expression expr, Map<Expression, Expression> substitutionMap) {
             if (expr instanceof SlotReference) {
-                Slot ref = ((SlotReference) expr).withQualifier(Collections.emptyList());
+                Slot ref = ((SlotReference) expr).withQualifier(ImmutableList.of());
                 return substitutionMap.getOrDefault(ref, expr);
             }
             return visit(expr, substitutionMap);
@@ -155,13 +154,13 @@ public interface Project {
                 // case 1:
                 Expression c = expr.child(0);
                 // Alias doesn't contain qualifier
-                Slot ref = ((SlotReference) c).withQualifier(Collections.emptyList());
+                Slot ref = ((SlotReference) c).withQualifier(ImmutableList.of());
                 if (substitutionMap.containsKey(ref)) {
                     return expr.withChildren(substitutionMap.get(ref).children());
                 }
             } else if (expr instanceof SlotReference) {
                 // case 2:
-                Slot ref = ((SlotReference) expr).withQualifier(Collections.emptyList());
+                Slot ref = ((SlotReference) expr).withQualifier(ImmutableList.of());
                 if (substitutionMap.containsKey(ref)) {
                     Alias res = (Alias) substitutionMap.get(ref);
                     return res.child();
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 8aeb5df235..b844c7eafa 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
@@ -50,7 +50,8 @@ import java.util.Optional;
  * Note: In general, the output of agg is a subset of the group by column plus aggregate column.
  * In special cases. this relationship does not hold. for example, select k1+1, sum(v1) from table group by k1.
  */
-public class LogicalAggregate<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE>
+public class LogicalAggregate<CHILD_TYPE extends Plan>
+        extends LogicalUnary<CHILD_TYPE>
         implements Aggregate<CHILD_TYPE> {
 
     private final boolean normalized;
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 939e21a428..0452ae29dc 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
@@ -44,8 +44,9 @@ import java.util.Optional;
  */
 public class LogicalApply<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends Plan>
         extends LogicalBinary<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> {
+
     // correlation column
-    private final ImmutableList<Expression> correlationSlot;
+    private final List<Expression> 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/LogicalAssertNumRows.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
index 8babd612bf..117ea9423d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
@@ -41,6 +41,7 @@ import java.util.Optional;
  * The cancelled reason will be reported by Backend and displayed back to the user.
  */
 public class LogicalAssertNumRows<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> {
+
     private final AssertNumRowsElement assertNumRowsElement;
 
     public LogicalAssertNumRows(AssertNumRowsElement assertNumRowsElement, CHILD_TYPE child) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalBinary.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalBinary.java
index 827c3c9020..2e79b453e6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalBinary.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalBinary.java
@@ -36,15 +36,6 @@ public abstract class LogicalBinary<
         extends AbstractLogicalPlan
         implements BinaryPlan<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> {
 
-    public LogicalBinary(PlanType type, LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild) {
-        super(type, Optional.empty(), leftChild, rightChild);
-    }
-
-    public LogicalBinary(PlanType type, Optional<LogicalProperties> logicalProperties,
-                             LEFT_CHILD_TYPE leftChild, RIGHT_CHILD_TYPE rightChild) {
-        super(type, logicalProperties, leftChild, rightChild);
-    }
-
     public LogicalBinary(PlanType type, Optional<GroupExpression> groupExpression,
                              Optional<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/logical/LogicalCTE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTE.java
index f5976c0091..505cd7114c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTE.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTE.java
@@ -27,8 +27,8 @@ import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -47,7 +47,7 @@ public class LogicalCTE<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE
     public LogicalCTE(List<LogicalSubQueryAlias<Plan>> aliasQueries, Optional<GroupExpression> groupExpression,
                                 Optional<LogicalProperties> logicalProperties, CHILD_TYPE child) {
         super(PlanType.LOGICAL_CTE, groupExpression, logicalProperties, child);
-        this.aliasQueries = aliasQueries;
+        this.aliasQueries = ImmutableList.copyOf(Objects.requireNonNull(aliasQueries, "aliasQueries can not be null"));
     }
 
     public List<LogicalSubQueryAlias<Plan>> getAliasQueries() {
@@ -111,7 +111,7 @@ public class LogicalCTE<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE
 
     @Override
     public List<Expression> getExpressions() {
-        return Collections.emptyList();
+        return ImmutableList.of();
     }
 
     @Override
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 ebbefe257f..e686cbe475 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,8 @@ import java.util.Optional;
  * select * from tbl limit 0
  */
 public class LogicalEmptyRelation extends LogicalLeaf implements EmptyRelation {
-    private final ImmutableList<? extends NamedExpression> projects;
+
+    private final List<? extends NamedExpression> projects;
 
     public LogicalEmptyRelation(List<? extends NamedExpression> projects) {
         this(projects, Optional.empty(), Optional.empty());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
index 43152b9fd6..a7bf18eb88 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
@@ -26,7 +26,6 @@ import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 import java.util.Optional;
@@ -46,10 +45,6 @@ public class LogicalFileScan extends LogicalRelation {
                 groupExpression, logicalProperties);
     }
 
-    public LogicalFileScan(RelationId id, ExternalTable table) {
-        this(id, table, ImmutableList.of());
-    }
-
     public LogicalFileScan(RelationId id, ExternalTable table, List<String> qualifier) {
         this(id, table, qualifier, Optional.empty(), Optional.empty());
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
index 1c6525377e..e0f312f65b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
@@ -33,7 +33,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -45,6 +44,7 @@ import java.util.stream.Stream;
  * Logical filter plan.
  */
 public class LogicalFilter<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> implements Filter {
+
     private final Set<Expression> conjuncts;
 
     private final boolean singleTableExpressionExtracted;
@@ -94,7 +94,7 @@ public class LogicalFilter<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_T
                         }
                     }).collect(Collectors.toList());
         }
-        return Collections.emptyList();
+        return ImmutableList.of();
     }
 
     @Override
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 2897fa6402..aa01206638 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
@@ -39,13 +39,13 @@ import com.google.common.collect.Lists;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Logical join plan.
  */
 public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends Plan>
         extends LogicalBinary<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> implements Join {
+
     private final JoinType joinType;
     private final List<Expression> otherJoinConjuncts;
     private final List<Expression> hashJoinConjuncts;
@@ -154,10 +154,10 @@ public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends
     public List<Slot> computeOutput() {
 
         List<Slot> newLeftOutput = left().getOutput().stream().map(o -> o.withNullable(true))
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
 
         List<Slot> newRightOutput = right().getOutput().stream().map(o -> o.withNullable(true))
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
 
         switch (joinType) {
             case LEFT_SEMI_JOIN:
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLeaf.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLeaf.java
index 56a0301735..56101773ee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLeaf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLeaf.java
@@ -31,14 +31,6 @@ import java.util.Optional;
  */
 public abstract class LogicalLeaf extends AbstractLogicalPlan implements LeafPlan {
 
-    public LogicalLeaf(PlanType nodeType) {
-        super(nodeType);
-    }
-
-    public LogicalLeaf(PlanType nodeType, Optional<LogicalProperties> logicalProperties) {
-        super(nodeType, logicalProperties);
-    }
-
     public LogicalLeaf(PlanType nodeType, Optional<GroupExpression> groupExpression,
                            Optional<LogicalProperties> logicalProperties) {
         super(nodeType, groupExpression, logicalProperties);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
index 48f94727d7..75ff5f1ea9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
@@ -43,9 +43,8 @@ import java.util.Optional;
  * limit: 10
  * offset 100
  */
-public class LogicalLimit<CHILD_TYPE extends Plan>
-        extends LogicalUnary<CHILD_TYPE>
-        implements Limit {
+public class LogicalLimit<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> implements Limit {
+
     private final long limit;
     private final long offset;
 
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 59b8ef5315..577ff807cc 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
@@ -42,7 +42,6 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -81,7 +80,7 @@ public class LogicalOlapScan extends LogicalRelation implements CatalogRelation,
     /**
      * Selected tablet ids to read data from.
      */
-    private final ImmutableList<Long> selectedTabletIds;
+    private final List<Long> selectedTabletIds;
 
     /**
      * Status to indicate tablets are pruned or not.
@@ -98,7 +97,7 @@ public class LogicalOlapScan extends LogicalRelation implements CatalogRelation,
     private final boolean partitionPruned;
     private final List<Long> manuallySpecifiedPartitions;
 
-    private final ImmutableList<Long> selectedPartitionIds;
+    private final List<Long> selectedPartitionIds;
 
     public LogicalOlapScan(RelationId id, OlapTable table) {
         this(id, table, ImmutableList.of());
@@ -108,7 +107,7 @@ public class LogicalOlapScan extends LogicalRelation implements CatalogRelation,
         this(id, table, qualifier, Optional.empty(), Optional.empty(),
                 table.getPartitionIds(), false,
                 ImmutableList.of(), false,
-                -1, false, PreAggStatus.on(), Collections.emptyList());
+                -1, false, PreAggStatus.on(), ImmutableList.of());
     }
 
     public LogicalOlapScan(RelationId id, OlapTable table, List<String> qualifier, List<Long> specifiedPartitions) {
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 8f01428d8a..3380288e98 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,8 @@ import java.util.Optional;
  * e.g. select 100, 'value'
  */
 public class LogicalOneRowRelation extends LogicalLeaf implements OneRowRelation {
-    private final ImmutableList<NamedExpression> projects;
+
+    private final List<NamedExpression> projects;
     private final boolean buildUnionNode;
 
     public LogicalOneRowRelation(List<NamedExpression> projects) {
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 c5cc6c248f..e643b640e4 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
@@ -33,7 +33,6 @@ import org.apache.doris.nereids.util.Utils;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -52,7 +51,7 @@ public class LogicalProject<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_
     private final boolean isDistinct;
 
     public LogicalProject(List<NamedExpression> projects, CHILD_TYPE child) {
-        this(projects, Collections.emptyList(), true, child, false);
+        this(projects, ImmutableList.of(), true, child, false);
     }
 
     public LogicalProject(List<NamedExpression> projects, List<NamedExpression> excepts, CHILD_TYPE child) {
@@ -65,7 +64,7 @@ public class LogicalProject<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_
     }
 
     public LogicalProject(List<NamedExpression> projects, CHILD_TYPE child, boolean isDistinct) {
-        this(projects, Collections.emptyList(), true, child, isDistinct);
+        this(projects, ImmutableList.of(), true, child, isDistinct);
     }
 
     public LogicalProject(List<NamedExpression> projects, List<NamedExpression> excepts, CHILD_TYPE 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 f959ecca42..2b68913e4f 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
@@ -32,7 +32,6 @@ import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.collect.ImmutableList;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -42,19 +41,17 @@ import java.util.Optional;
  */
 public abstract class LogicalRelation extends LogicalLeaf implements Scan {
 
+    protected final RelationId id;
     protected final TableIf table;
     protected final ImmutableList<String> qualifier;
 
-    protected final RelationId id;
-
     public LogicalRelation(RelationId id, PlanType type, TableIf table, List<String> qualifier) {
         this(id, type, table, qualifier, Optional.empty(), Optional.empty());
     }
 
     public LogicalRelation(RelationId id, PlanType type, Optional<GroupExpression> groupExpression,
             Optional<LogicalProperties> logicalProperties) {
-        this(id, type, new OlapTable(), Collections.emptyList(), groupExpression,
-                logicalProperties);
+        this(id, type, new OlapTable(), ImmutableList.of(), groupExpression, logicalProperties);
     }
 
     /**
@@ -66,9 +63,9 @@ public abstract class LogicalRelation extends LogicalLeaf implements Scan {
     public LogicalRelation(RelationId id, PlanType type, TableIf table, List<String> qualifier,
             Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties) {
         super(type, groupExpression, logicalProperties);
+        this.id = id;
         this.table = Objects.requireNonNull(table, "table can not be null");
         this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null"));
-        this.id = id;
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
index bc4f18d83f..00344dddbe 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
@@ -40,8 +40,7 @@ import java.util.Optional;
 /**
  * LogicalRepeat.
  */
-public class LogicalRepeat<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE>
-        implements Repeat<CHILD_TYPE> {
+public class LogicalRepeat<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> implements Repeat<CHILD_TYPE> {
 
     // max num of distinct sets in grouping sets clause
     public static final int MAX_GROUPING_SETS_NUM = 64;
@@ -68,7 +67,7 @@ public class LogicalRepeat<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_T
         super(PlanType.LOGICAL_REPEAT, groupExpression, logicalProperties, child);
         this.groupingSets = Objects.requireNonNull(groupingSets, "groupingSets can not be null")
                 .stream()
-                .map(groupingSet -> ImmutableList.copyOf(groupingSet))
+                .map(ImmutableList::copyOf)
                 .collect(ImmutableList.toImmutableList());
         this.outputExpressions = ImmutableList.copyOf(
                 Objects.requireNonNull(outputExpressions, "outputExpressions can not be null"));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
index 402da0da48..c373f66aa2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
@@ -39,16 +39,13 @@ import java.util.Optional;
  * LogicalSchemaScan.
  */
 public class LogicalSchemaScan extends LogicalRelation implements Scan {
-    public LogicalSchemaScan(RelationId id,
-            TableIf table,
-            List<String> qualifier) {
+
+    public LogicalSchemaScan(RelationId id, TableIf table, List<String> qualifier) {
         super(id, PlanType.LOGICAL_SCHEMA_SCAN, table, qualifier);
     }
 
-    public LogicalSchemaScan(RelationId id,
-            TableIf table,
-            List<String> qualifier, Optional<GroupExpression> groupExpression,
-            Optional<LogicalProperties> logicalProperties) {
+    public LogicalSchemaScan(RelationId id, TableIf table, List<String> qualifier,
+            Optional<GroupExpression> groupExpression, Optional<LogicalProperties> logicalProperties) {
         super(id, PlanType.LOGICAL_SCHEMA_SCAN, table, qualifier, groupExpression, logicalProperties);
     }
 
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 93060ae4ef..db2c3694b0 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,8 @@ import java.util.stream.Collectors;
  * e.g. LogicalSelectHint (set_var(query_timeout='1800', exec_mem_limit='2147483648'))
  */
 public class LogicalSelectHint<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> {
-    private final ImmutableMap<String, SelectHint> hints;
+
+    private final Map<String, SelectHint> hints;
 
     public LogicalSelectHint(Map<String, SelectHint> 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/LogicalSubQueryAlias.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
index 30b4fc5df5..1a9cbe0dad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
@@ -40,8 +40,8 @@ import java.util.Optional;
  * @param <CHILD_TYPE> param
  */
 public class LogicalSubQueryAlias<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> {
-    private final List<String> qualifier;
 
+    private final List<String> qualifier;
     private final Optional<List<String>> columnAliases;
 
     public LogicalSubQueryAlias(String tableAlias, CHILD_TYPE child) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
index 8d89fcf159..905df45dc5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
@@ -33,6 +33,7 @@ import java.util.Optional;
 
 /** LogicalTableValuedFunctionRelation */
 public class LogicalTVFRelation extends LogicalRelation implements TVFRelation {
+
     private final TableValuedFunction function;
 
     public LogicalTVFRelation(RelationId id, TableValuedFunction function) {
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 b3d28d591e..da78e27cef 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<CHILD_TYPE extends Plan> extends LogicalUnary<CHILD_TYPE> implements TopN {
 
-    private final ImmutableList<OrderKey> orderKeys;
+    private final List<OrderKey> orderKeys;
     private final int limit;
     private final int offset;
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnion.java
index 7d27b63608..aa9a9db21e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnion.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalUnion.java
@@ -33,6 +33,7 @@ import java.util.Optional;
  * Logical Union.
  */
 public class LogicalUnion extends LogicalSetOperation {
+
     // When the union is DISTINCT, an additional LogicalAggregation needs to be created,
     // so add this flag to judge whether agg has been created to avoid repeated creation
     private final boolean hasBuildAgg;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/RelationUtil.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/RelationUtil.java
index 6e23637659..223aa4f24b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/RelationUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/RelationUtil.java
@@ -27,6 +27,7 @@ import com.google.common.annotations.VisibleForTesting;
  * relation util
  */
 public class RelationUtil {
+
     // for test only
     private static StatementContext statementContext = new StatementContext();
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/UsingJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/UsingJoin.java
index 8a9d7af752..a7c1484e4c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/UsingJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/UsingJoin.java
@@ -35,7 +35,6 @@ import org.apache.commons.collections.CollectionUtils;
 
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * select col1 from t1 join t2 using(col1);
@@ -70,10 +69,10 @@ public class UsingJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends Pl
     public List<Slot> computeOutput() {
 
         List<Slot> newLeftOutput = left().getOutput().stream().map(o -> o.withNullable(true))
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
 
         List<Slot> newRightOutput = right().getOutput().stream().map(o -> o.withNullable(true))
-                .collect(Collectors.toList());
+                .collect(ImmutableList.toImmutableList());
 
         switch (joinType) {
             case LEFT_SEMI_JOIN:
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 38bad41ce4..d1127a4647 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
@@ -45,16 +45,15 @@ public abstract class AbstractPhysicalJoin<
         LEFT_CHILD_TYPE extends Plan,
         RIGHT_CHILD_TYPE extends Plan>
         extends PhysicalBinary<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> implements Join {
-    protected final JoinType joinType;
-
-    protected final ImmutableList<Expression> hashJoinConjuncts;
-
-    protected final ImmutableList<Expression> otherJoinConjuncts;
 
-    protected boolean shouldTranslateOutput = true;
+    protected final JoinType joinType;
+    protected final List<Expression> hashJoinConjuncts;
+    protected final List<Expression> otherJoinConjuncts;
     protected final JoinHint hint;
 
+    // use for translate only
     protected final List<Expression> filterConjuncts = Lists.newArrayList();
+    protected boolean shouldTranslateOutput = true;
 
     /**
      * Constructor of PhysicalJoin.
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 82cf0a4238..0ef4002699 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<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_TYPE> implements Sort {
 
-    protected final ImmutableList<OrderKey> orderKeys;
+    protected final List<OrderKey> orderKeys;
 
     /**
      * Constructor of AbstractPhysicalSort.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java
index 15eb6b2def..e9f435c225 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAssertNumRows.java
@@ -40,6 +40,7 @@ import java.util.Optional;
  * Physical assertNumRows.
  */
 public class PhysicalAssertNumRows<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_TYPE> {
+
     private final AssertNumRowsElement assertNumRowsElement;
 
     public PhysicalAssertNumRows(AssertNumRowsElement assertNumRowsElement,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalBinary.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalBinary.java
index 03e5719bef..cefa39c1c6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalBinary.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalBinary.java
@@ -31,11 +31,10 @@ import javax.annotation.Nullable;
 /**
  * Abstract class for all physical plan that have two children.
  */
-public abstract class PhysicalBinary<
-            LEFT_CHILD_TYPE extends Plan,
-            RIGHT_CHILD_TYPE extends Plan>
+public abstract class PhysicalBinary<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends Plan>
         extends AbstractPhysicalPlan
         implements BinaryPlan<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> {
+
     public PhysicalBinary(PlanType type, Optional<GroupExpression> 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 89b6ceeaa1..af01535c24 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,8 @@ import java.util.Optional;
  * select * from tbl limit 0
  */
 public class PhysicalEmptyRelation extends PhysicalLeaf implements EmptyRelation {
-    private final ImmutableList<? extends NamedExpression> projects;
+
+    private final List<? extends NamedExpression> projects;
 
     public PhysicalEmptyRelation(List<? extends NamedExpression> 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/PhysicalFilter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
index 6a3c22a8de..443c9f2c8c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
@@ -41,6 +41,7 @@ import java.util.Set;
  * Physical filter plan.
  */
 public class PhysicalFilter<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_TYPE> implements Filter {
+
     private final Set<Expression> conjuncts;
 
     public PhysicalFilter(Set<Expression> conjuncts, LogicalProperties logicalProperties, CHILD_TYPE child) {
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 2ce6ea75fd..ba66df6959 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
@@ -42,6 +42,7 @@ public class PhysicalHashJoin<
         LEFT_CHILD_TYPE extends Plan,
         RIGHT_CHILD_TYPE extends Plan>
         extends AbstractPhysicalJoin<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> {
+
     public PhysicalHashJoin(
             JoinType joinType,
             List<Expression> 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 5ca0028d17..f58e4600a9 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,6 +31,7 @@ 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, Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties) {
         super(type, groupExpression, logicalProperties);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
index e5bdb40dd2..dfab80443c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
@@ -39,8 +39,8 @@ import java.util.Optional;
  * Physical limit plan
  */
 public class PhysicalLimit<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_TYPE> implements Limit {
-    private final long limit;
 
+    private final long limit;
     private final long offset;
 
     public PhysicalLimit(long limit, long offset,
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 2910e72718..08e27e9667 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
@@ -40,6 +40,7 @@ import java.util.Optional;
  * Physical olap scan plan.
  */
 public class PhysicalOlapScan extends PhysicalRelation implements OlapScan {
+
     private final OlapTable olapTable;
     private final DistributionSpec distributionSpec;
     private final long selectedIndexId;
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 ed59190807..4e146e461a 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
@@ -40,7 +40,8 @@ import java.util.Optional;
  * e.g. select 100, 'value'
  */
 public class PhysicalOneRowRelation extends PhysicalLeaf implements OneRowRelation {
-    private final ImmutableList<NamedExpression> projects;
+
+    private final List<NamedExpression> projects;
     private final boolean buildUnionNode;
 
     public PhysicalOneRowRelation(List<NamedExpression> projects, boolean buildUnionNode,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java
index ca6ce10668..7ea66a8b60 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalPlan.java
@@ -25,6 +25,7 @@ import org.apache.doris.statistics.StatsDeriveResult;
  * interface for all physical plan.
  */
 public interface PhysicalPlan extends Plan {
+
     PhysicalProperties getPhysicalProperties();
 
     PhysicalPlan withPhysicalPropertiesAndStats(PhysicalProperties physicalProperties,
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 269f688466..7aaaf0a508 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
@@ -41,7 +41,7 @@ import java.util.Optional;
  */
 public class PhysicalProject<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD_TYPE> implements Project {
 
-    private final ImmutableList<NamedExpression> projects;
+    private final List<NamedExpression> projects;
 
     public PhysicalProject(List<NamedExpression> projects, LogicalProperties logicalProperties, CHILD_TYPE child) {
         this(projects, Optional.empty(), logicalProperties, child);
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 81006a73e0..a73b20625c 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,9 +38,8 @@ import java.util.Optional;
  */
 public abstract class PhysicalRelation extends PhysicalLeaf implements Scan {
 
-    protected final ImmutableList<String> qualifier;
-
     protected final RelationId id;
+    protected final ImmutableList<String> qualifier;
 
     /**
      * Constructor for PhysicalRelation.
@@ -48,8 +47,8 @@ public abstract class PhysicalRelation extends PhysicalLeaf implements Scan {
     public PhysicalRelation(RelationId id, PlanType type, List<String> qualifier,
             Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties) {
         super(type, groupExpression, logicalProperties);
-        this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null"));
         this.id = id;
+        this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null"));
     }
 
     /**
@@ -59,8 +58,8 @@ public abstract class PhysicalRelation extends PhysicalLeaf implements Scan {
             Optional<GroupExpression> groupExpression, LogicalProperties logicalProperties,
             PhysicalProperties physicalProperties, StatsDeriveResult statsDeriveResult) {
         super(type, groupExpression, logicalProperties, physicalProperties, statsDeriveResult);
-        this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null"));
         this.id = id;
+        this.qualifier = ImmutableList.copyOf(Objects.requireNonNull(qualifier, "qualifier can not be null"));
     }
 
     public List<String> getQualifier() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java
index 6ad934cf22..c58d2d8c09 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalRepeat.java
@@ -58,7 +58,7 @@ public class PhysicalRepeat<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD
         super(PlanType.PHYSICAL_REPEAT, logicalProperties, child);
         this.groupingSets = Objects.requireNonNull(groupingSets, "groupingSets can not be null")
                 .stream()
-                .map(groupingSet -> ImmutableList.copyOf(groupingSet))
+                .map(ImmutableList::copyOf)
                 .collect(ImmutableList.toImmutableList());
         this.outputExpressions = ImmutableList.copyOf(
                 Objects.requireNonNull(outputExpressions, "outputExpressions can not be null"));
@@ -74,7 +74,7 @@ public class PhysicalRepeat<CHILD_TYPE extends Plan> extends PhysicalUnary<CHILD
                 physicalProperties, statsDeriveResult, child);
         this.groupingSets = Objects.requireNonNull(groupingSets, "groupingSets can not be null")
                 .stream()
-                .map(groupingSet -> ImmutableList.copyOf(groupingSet))
+                .map(ImmutableList::copyOf)
                 .collect(ImmutableList.toImmutableList());
         this.outputExpressions = ImmutableList.copyOf(
                 Objects.requireNonNull(outputExpressions, "outputExpressions can not be null"));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java
index f8c86ac781..5dbe3a57db 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalSetOperation.java
@@ -40,6 +40,7 @@ import java.util.Optional;
  * Physical SetOperation.
  */
 public abstract class PhysicalSetOperation extends AbstractPhysicalPlan implements SetOperation {
+
     protected final Qualifier qualifier;
 
     public PhysicalSetOperation(PlanType planType,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalStorageLayerAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalStorageLayerAggregate.java
index 461266e440..221b4b19cf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalStorageLayerAggregate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalStorageLayerAggregate.java
@@ -40,6 +40,7 @@ import java.util.Optional;
 
 /** PhysicalStorageLayerAggregate */
 public class PhysicalStorageLayerAggregate extends PhysicalRelation {
+
     private final PhysicalRelation relation;
     private final PushDownAggOp aggOp;
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTVFRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTVFRelation.java
index 6074cba757..5e5a832786 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTVFRelation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTVFRelation.java
@@ -36,6 +36,7 @@ import java.util.Optional;
 
 /** PhysicalTableValuedFunctionRelation */
 public class PhysicalTVFRelation extends PhysicalRelation implements TVFRelation {
+
     private final TableValuedFunction function;
 
     public PhysicalTVFRelation(RelationId id, TableValuedFunction function, LogicalProperties logicalProperties) {
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 326bc6b634..8b80859e73 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
@@ -26,18 +26,11 @@ import org.apache.doris.thrift.TRuntimeFilterType;
  */
 public class RuntimeFilter {
 
-    private final Slot srcSlot;
-
-    private Slot targetSlot;
-
     private final RuntimeFilterId id;
-
     private final TRuntimeFilterType type;
-
+    private final Slot srcSlot;
+    private Slot targetSlot;
     private final int exprOrder;
-
-    private boolean finalized = false;
-
     private PhysicalHashJoin builderNode;
 
     /**
@@ -76,8 +69,4 @@ public class RuntimeFilter {
     public PhysicalHashJoin getBuilderNode() {
         return builderNode;
     }
-
-    public void setFinalized() {
-        this.finalized = true;
-    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
index 7e301cc174..9b8c6f0d2a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
@@ -303,7 +303,7 @@ public class JoinUtils {
                                 return e;
                             }
                         })
-                ).collect(Collectors.toList());
+                ).collect(ImmutableList.toImmutableList());
     }
 
     /**


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org