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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]