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

huajianlan 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 c1c635e944 [Refactor](Nereids) Fix expression constant and improve 
SlotExtractor (#11513)
c1c635e944 is described below

commit c1c635e944dc3535a876bcdaf8fa73c856c87534
Author: Shuo Wang <wangshuo...@gmail.com>
AuthorDate: Mon Aug 8 17:36:21 2022 +0800

    [Refactor](Nereids) Fix expression constant and improve SlotExtractor 
(#11513)
    
    1. Fix expression constant and add unit test.
    2. Improve logic in SlotExtractor and remove useless class IterationVisitor.
---
 .../apache/doris/nereids/analyzer/UnboundSlot.java |   5 -
 .../glue/translator/PhysicalPlanTranslator.java    |   2 +-
 .../logical/AbstractPushDownProjectRule.java       |   2 +-
 .../nereids/rules/rewrite/logical/MultiJoin.java   |   2 +-
 .../rewrite/logical/PruneAggChildColumns.java      |   2 +-
 .../rewrite/logical/PruneFilterChildColumns.java   |   2 +-
 .../rewrite/logical/PruneJoinChildrenColumns.java  |   2 +-
 .../rewrite/logical/PruneSortChildColumns.java     |   2 +-
 .../logical/PushPredicateThroughAggregation.java   |   2 +-
 .../rewrite/logical/PushPredicateThroughJoin.java  |   2 +-
 .../nereids/trees/expressions/Expression.java      |   8 +-
 .../doris/nereids/trees/expressions/Literal.java   |   5 -
 .../nereids/trees/expressions/SlotReference.java   |   9 +
 .../expressions/visitor/IterationVisitor.java      | 212 ---------------------
 .../visitor => util}/SlotExtractor.java            |  38 ++--
 .../nereids/trees/expressions/ExpressionTest.java  |  41 ++++
 16 files changed, 82 insertions(+), 254 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
index e248264ff7..60b662865b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
@@ -51,11 +51,6 @@ public class UnboundSlot extends Slot implements Unbound {
         }).reduce((left, right) -> left + "." + right).orElse("");
     }
 
-    @Override
-    public boolean isConstant() {
-        return false;
-    }
-
     @Override
     public String toSql() {
         return nameParts.stream().map(Utils::quoteIfNeeded).reduce((left, 
right) -> left + "." + right).orElse("");
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 c2e660e8be..eb61c3fe9c 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
@@ -37,7 +37,6 @@ import 
org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.functions.AggregateFunction;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.AggPhase;
 import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.Plan;
@@ -53,6 +52,7 @@ import 
org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalProject;
 import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanVisitor;
 import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.SlotExtractor;
 import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.planner.AggregationNode;
 import org.apache.doris.planner.DataPartition;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AbstractPushDownProjectRule.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AbstractPushDownProjectRule.java
index 7dfe770465..2b28c488d5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AbstractPushDownProjectRule.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/AbstractPushDownProjectRule.java
@@ -23,8 +23,8 @@ import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
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 230efe7e81..3cf7ae2545 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
@@ -20,13 +20,13 @@ package org.apache.doris.nereids.rules.rewrite.logical;
 import org.apache.doris.nereids.trees.expressions.EqualTo;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.base.Preconditions;
 
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 8d2b191344..78951bbf05 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
@@ -23,8 +23,8 @@ import 
org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFilterChildColumns.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFilterChildColumns.java
index a3c38997b1..1721234d0d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFilterChildColumns.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PruneFilterChildColumns.java
@@ -19,11 +19,11 @@ package org.apache.doris.nereids.rules.rewrite.logical;
 
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
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 8938f1dab0..bea8b1abcc 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
@@ -21,11 +21,11 @@ import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.ImmutableList;
 
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 63fe861bed..b90ae4e80c 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
@@ -19,11 +19,11 @@ package org.apache.doris.nereids.rules.rewrite.logical;
 
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughAggregation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughAggregation.java
index 33c8a9ccd6..a7bcf4de08 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughAggregation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughAggregation.java
@@ -22,12 +22,12 @@ import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.Lists;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
index 8c2f237b7a..bdb3961084 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
@@ -24,12 +24,12 @@ import 
org.apache.doris.nereids.trees.expressions.BooleanLiteral;
 import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.SlotExtractor;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
index e40544303f..34b17cc275 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
@@ -79,8 +79,12 @@ public abstract class Expression extends 
AbstractTreeNode<Expression> {
     /**
      * Whether the expression is a constant.
      */
-    public boolean isConstant() {
-        return children().stream().allMatch(Expression::isConstant);
+    public final boolean isConstant() {
+        if (this instanceof LeafExpression) {
+            return this instanceof Literal;
+        } else {
+            return children().stream().allMatch(Expression::isConstant);
+        }
     }
 
     public final Expression castTo(DataType targetType) throws 
AnalysisException {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
index ce7dcdb4c8..9bf609ede0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
@@ -79,11 +79,6 @@ public abstract class Literal extends Expression implements 
LeafExpression {
         return visitor.visitLiteral(this, context);
     }
 
-    @Override
-    public boolean isConstant() {
-        return true;
-    }
-
     @Override
     public boolean equals(Object o) {
         if (this == o) {
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 4aa225c4ec..0f4ba38e5d 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
@@ -23,6 +23,7 @@ import org.apache.doris.nereids.types.DataType;
 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.Objects;
@@ -37,6 +38,14 @@ public class SlotReference extends Slot {
     private final DataType dataType;
     private final boolean nullable;
 
+    public SlotReference(String name, DataType dataType) {
+        this(NamedExpressionUtil.newExprId(), name, dataType, true, 
ImmutableList.of());
+    }
+
+    public SlotReference(String name, DataType dataType, boolean nullable) {
+        this(NamedExpressionUtil.newExprId(), name, dataType, nullable, 
ImmutableList.of());
+    }
+
     public SlotReference(String name, DataType dataType, boolean nullable, 
List<String> qualifier) {
         this(NamedExpressionUtil.newExprId(), name, dataType, nullable, 
qualifier);
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/IterationVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/IterationVisitor.java
deleted file mode 100644
index 731eb8d599..0000000000
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/IterationVisitor.java
+++ /dev/null
@@ -1,212 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package org.apache.doris.nereids.trees.expressions.visitor;
-
-import org.apache.doris.nereids.trees.expressions.Add;
-import org.apache.doris.nereids.trees.expressions.Alias;
-import org.apache.doris.nereids.trees.expressions.Arithmetic;
-import org.apache.doris.nereids.trees.expressions.Between;
-import org.apache.doris.nereids.trees.expressions.BooleanLiteral;
-import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
-import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
-import org.apache.doris.nereids.trees.expressions.Divide;
-import org.apache.doris.nereids.trees.expressions.DoubleLiteral;
-import org.apache.doris.nereids.trees.expressions.EqualTo;
-import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.GreaterThan;
-import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
-import org.apache.doris.nereids.trees.expressions.IntegerLiteral;
-import org.apache.doris.nereids.trees.expressions.LessThan;
-import org.apache.doris.nereids.trees.expressions.LessThanEqual;
-import org.apache.doris.nereids.trees.expressions.Mod;
-import org.apache.doris.nereids.trees.expressions.Multiply;
-import org.apache.doris.nereids.trees.expressions.NamedExpression;
-import org.apache.doris.nereids.trees.expressions.Not;
-import org.apache.doris.nereids.trees.expressions.NullLiteral;
-import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
-import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.SlotReference;
-import org.apache.doris.nereids.trees.expressions.StringLiteral;
-import org.apache.doris.nereids.trees.expressions.Subtract;
-import org.apache.doris.nereids.trees.expressions.functions.AggregateFunction;
-import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
-
-/**
- * Iterative traversal of an expression.
- */
-public abstract class IterationVisitor<C> extends 
DefaultExpressionVisitor<Void, C> {
-
-    @Override
-    public Void visit(Expression expr, C context) {
-        return expr.accept(this, context);
-    }
-
-    @Override
-    public Void visitNot(Not expr, C context) {
-        visit(expr.child(), context);
-        return null;
-    }
-
-    @Override
-    public Void visitCompoundPredicate(CompoundPredicate expr, C context) {
-        visit(expr.left(), context);
-        visit(expr.right(), context);
-        return null;
-    }
-
-    @Override
-    public Void visitArithmetic(Arithmetic arithmetic, C context) {
-        visit(arithmetic.child(0), context);
-        if (arithmetic.getArithmeticOperator().isBinary()) {
-            visit(arithmetic.child(1), context);
-        }
-        return null;
-    }
-
-    @Override
-    public Void visitBetween(Between betweenPredicate, C context) {
-        visit(betweenPredicate.getCompareExpr(), context);
-        visit(betweenPredicate.getLowerBound(), context);
-        visit(betweenPredicate.getUpperBound(), context);
-        return null;
-    }
-
-    @Override
-    public Void visitAlias(Alias alias, C context) {
-        return visitNamedExpression(alias, context);
-    }
-
-    @Override
-    public Void visitComparisonPredicate(ComparisonPredicate cp, C context) {
-        visit(cp.left(), context);
-        visit(cp.right(), context);
-        return null;
-    }
-
-    @Override
-    public Void visitEqualTo(EqualTo equalTo, C context) {
-        return visitComparisonPredicate(equalTo, context);
-    }
-
-    @Override
-    public Void visitGreaterThan(GreaterThan greaterThan, C context) {
-        return visitComparisonPredicate(greaterThan, context);
-    }
-
-    @Override
-    public Void visitGreaterThanEqual(GreaterThanEqual greaterThanEqual, C 
context) {
-        return visitComparisonPredicate(greaterThanEqual, context);
-    }
-
-    @Override
-    public Void visitLessThan(LessThan lessThan, C context) {
-        return visitComparisonPredicate(lessThan, context);
-    }
-
-    @Override
-    public Void visitLessThanEqual(LessThanEqual lessThanEqual, C context) {
-        return visitComparisonPredicate(lessThanEqual, context);
-    }
-
-    @Override
-    public Void visitNullSafeEqual(NullSafeEqual nullSafeEqual, C context) {
-        return visitComparisonPredicate(nullSafeEqual, context);
-    }
-
-    @Override
-    public Void visitSlot(Slot slot, C context) {
-        return null;
-    }
-
-    @Override
-    public Void visitNamedExpression(NamedExpression namedExpression, C 
context) {
-        for (Expression child : namedExpression.children()) {
-            visit(child, context);
-        }
-        return null;
-    }
-
-    @Override
-    public Void visitBoundFunction(BoundFunction boundFunction, C context) {
-        for (Expression argument : boundFunction.getArguments()) {
-            visit(argument, context);
-        }
-        return null;
-    }
-
-    @Override
-    public Void visitAggregateFunction(AggregateFunction aggregateFunction, C 
context) {
-        return visitBoundFunction(aggregateFunction, context);
-    }
-
-    @Override
-    public Void visitAdd(Add add, C context) {
-        return visitArithmetic(add, context);
-    }
-
-    @Override
-    public Void visitSubtract(Subtract subtract, C context) {
-        return visitArithmetic(subtract, context);
-    }
-
-    @Override
-    public Void visitMultiply(Multiply multiply, C context) {
-        return visitArithmetic(multiply, context);
-    }
-
-    @Override
-    public Void visitDivide(Divide divide, C context) {
-        return visitArithmetic(divide, context);
-    }
-
-    @Override
-    public Void visitMod(Mod mod, C context) {
-        return visitArithmetic(mod, context);
-    }
-
-    @Override
-    public Void visitSlotReference(SlotReference slotReference, C context) {
-        return super.visitSlotReference(slotReference, context);
-    }
-
-    @Override
-    public Void visitBooleanLiteral(BooleanLiteral booleanLiteral, C context) {
-        return null;
-    }
-
-    @Override
-    public Void visitStringLiteral(StringLiteral stringLiteral, C context) {
-        return null;
-    }
-
-    @Override
-    public Void visitIntegerLiteral(IntegerLiteral integerLiteral, C context) {
-        return null;
-    }
-
-    @Override
-    public Void visitNullLiteral(NullLiteral nullLiteral, C context) {
-        return null;
-    }
-
-    @Override
-    public Void visitDoubleLiteral(DoubleLiteral doubleLiteral, C context) {
-        return null;
-    }
-}
-
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/SlotExtractor.java
 b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/SlotExtractor.java
similarity index 65%
rename from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/SlotExtractor.java
rename to 
fe/fe-core/src/main/java/org/apache/doris/nereids/util/SlotExtractor.java
index 07ea008dae..ac1f7b611e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/SlotExtractor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/SlotExtractor.java
@@ -15,32 +15,38 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.trees.expressions.visitor;
+package org.apache.doris.nereids.util;
 
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
+import 
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionVisitor;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 import java.util.Collection;
-import java.util.List;
 import java.util.Set;
 
 /**
  * Extracts the SlotReference contained in the expression.
  */
-public class SlotExtractor extends IterationVisitor<List<Slot>> {
+public class SlotExtractor {
+    private static final DefaultExpressionVisitor<Void, Set<Slot>> 
SLOT_COLLECTOR
+            = new DefaultExpressionVisitor<Void, Set<Slot>>() {
+                @Override
+                public Void visitSlotReference(SlotReference slotReference, 
Set<Slot> context) {
+                    context.add(slotReference);
+                    return null;
+                }
+            };
 
     /**
      * extract slot reference.
      */
     public static Set<Slot> extractSlot(Collection<Expression> expressions) {
-
-        Set<Slot> slots = Sets.newLinkedHashSet();
+        Set<Slot> slots = Sets.newHashSet();
         for (Expression expression : expressions) {
-            slots.addAll(extractSlot(expression));
+            extractSlot(expression, slots);
         }
         return slots;
     }
@@ -49,24 +55,14 @@ public class SlotExtractor extends 
IterationVisitor<List<Slot>> {
      * extract slot reference.
      */
     public static Set<Slot> extractSlot(Expression... expressions) {
-
-        Set<Slot> slots = Sets.newLinkedHashSet();
+        Set<Slot> slots = Sets.newHashSet();
         for (Expression expression : expressions) {
-            slots.addAll(extractSlot(expression));
+            extractSlot(expression, slots);
         }
         return slots;
     }
 
-    private static List<Slot> extractSlot(Expression expression) {
-        List<Slot> slots = Lists.newArrayList();
-        new SlotExtractor().visit(expression, slots);
-        return slots;
-    }
-
-
-    @Override
-    public Void visitSlotReference(SlotReference slotReference, List<Slot> 
context) {
-        context.add(slotReference);
-        return null;
+    private static void extractSlot(Expression expression, Set<Slot> slots) {
+        expression.accept(SLOT_COLLECTOR, slots);
     }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
new file mode 100644
index 0000000000..c2d7e2b348
--- /dev/null
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
@@ -0,0 +1,41 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions;
+
+import org.apache.doris.nereids.types.IntegerType;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class ExpressionTest {
+    @Test
+    public void testConstantExpression() {
+        // literal is constant
+        Assertions.assertTrue(new StringLiteral("abc").isConstant());
+
+        // slot reference is not constant
+        Assertions.assertFalse(new SlotReference("a", 
IntegerType.INSTANCE).isConstant());
+
+        // `1 + 2` is constant
+        Assertions.assertTrue(new Add(new IntegerLiteral(1), new 
IntegerLiteral(2)).isConstant());
+
+        // `a + 1` is not constant
+        Assertions.assertFalse(
+                new Add(new SlotReference("a", IntegerType.INSTANCE), new 
IntegerLiteral(1)).isConstant());
+    }
+}


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

Reply via email to