This is an automated email from the ASF dual-hosted git repository. lingmiao 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 bf95440c13 [Refactor](nereids)Refactor Literal to an inheritance hierarchy (#10771) bf95440c13 is described below commit bf95440c13a368f16e5986419365a0550d1f887f Author: Kikyou1997 <33112463+kikyou1...@users.noreply.github.com> AuthorDate: Mon Jul 18 12:01:30 2022 +0800 [Refactor](nereids)Refactor Literal to an inheritance hierarchy (#10771) Use inheritance hierarchy instead of combination to make the framework more clear --- .../glue/translator/ExpressionTranslator.java | 52 +++++++++++---------- .../doris/nereids/parser/LogicalPlanBuilder.java | 12 +++-- .../rewrite/logical/PushPredicateThroughJoin.java | 8 ++-- .../nereids/trees/expressions/BooleanLiteral.java | 53 +++++++++++++++++++++ .../nereids/trees/expressions/DoubleLiteral.java | 44 ++++++++++++++++++ .../nereids/trees/expressions/IntegerLiteral.java | 44 ++++++++++++++++++ .../doris/nereids/trees/expressions/Literal.java | 48 ++++++------------- .../nereids/trees/expressions/NullLiteral.java | 46 ++++++++++++++++++ .../nereids/trees/expressions/StringLiteral.java | 54 ++++++++++++++++++++++ .../expressions/visitor/ExpressionVisitor.java | 25 ++++++++++ .../expressions/visitor/IterationVisitor.java | 42 ++++++++++++++--- .../apache/doris/nereids/util/ExpressionUtils.java | 8 ++-- .../rewrite/logical/AggregateDisassembleTest.java | 10 ++-- .../nereids/trees/expressions/LiteralTest.java | 40 ++++++++++++++++ 14 files changed, 405 insertions(+), 81 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java index 5fa60994c0..6991364c0c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java @@ -27,31 +27,26 @@ import org.apache.doris.analysis.FunctionCallExpr; import org.apache.doris.analysis.IntLiteral; import org.apache.doris.analysis.NullLiteral; import org.apache.doris.analysis.StringLiteral; -import org.apache.doris.catalog.Type; import org.apache.doris.nereids.exceptions.AnalysisException; 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.CompoundPredicate; +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.ExpressionType; 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.Literal; import org.apache.doris.nereids.trees.expressions.Not; import org.apache.doris.nereids.trees.expressions.NullSafeEqual; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.BoundFunction; import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionVisitor; -import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.DataType; -import org.apache.doris.nereids.types.DoubleType; -import org.apache.doris.nereids.types.IntegerType; -import org.apache.doris.nereids.types.NullType; -import org.apache.doris.nereids.types.StringType; import java.util.ArrayList; import java.util.List; @@ -143,24 +138,31 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra return context.findSlotRef(slotReference.getExprId()); } - /** - * translate to stale literal. - */ @Override - public Expr visitLiteral(Literal literal, PlanTranslatorContext context) { - DataType dataType = literal.getDataType(); - if (dataType instanceof BooleanType) { - return new BoolLiteral((Boolean) literal.getValue()); - } else if (dataType instanceof DoubleType) { - return new FloatLiteral((Double) literal.getValue(), Type.DOUBLE); - } else if (dataType instanceof IntegerType) { - return new IntLiteral((Integer) literal.getValue()); - } else if (dataType instanceof NullType) { - return new NullLiteral(); - } else if (dataType instanceof StringType) { - return new StringLiteral((String) literal.getValue()); - } - throw new RuntimeException(String.format("Unsupported data type: %s", dataType.toString())); + public Expr visitBooleanLiteral(BooleanLiteral booleanLiteral, PlanTranslatorContext context) { + return new BoolLiteral(booleanLiteral.getValue()); + } + + @Override + public Expr visitStringLiteral(org.apache.doris.nereids.trees.expressions.StringLiteral stringLiteral, + PlanTranslatorContext context) { + return new StringLiteral(stringLiteral.getValue()); + } + + @Override + public Expr visitIntegerLiteral(IntegerLiteral integerLiteral, PlanTranslatorContext context) { + return new IntLiteral(integerLiteral.getValue()); + } + + @Override + public Expr visitNullLiteral(org.apache.doris.nereids.trees.expressions.NullLiteral nullLiteral, + PlanTranslatorContext context) { + return new NullLiteral(); + } + + @Override + public Expr visitDoubleLiteral(DoubleLiteral doubleLiteral, PlanTranslatorContext context) { + return new FloatLiteral(doubleLiteral.getValue()); } @Override 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 6c8f4a0151..1c25087dbd 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 @@ -65,11 +65,13 @@ import org.apache.doris.nereids.trees.expressions.Add; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.And; import org.apache.doris.nereids.trees.expressions.Between; +import org.apache.doris.nereids.trees.expressions.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.Divide; 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.Like; @@ -78,9 +80,11 @@ 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.Or; import org.apache.doris.nereids.trees.expressions.Regexp; +import org.apache.doris.nereids.trees.expressions.StringLiteral; import org.apache.doris.nereids.trees.expressions.Subtract; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; @@ -376,20 +380,20 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> { */ @Override public Expression visitNullLiteral(NullLiteralContext ctx) { - return new Literal(null); + return new NullLiteral(); } @Override public Literal visitBooleanLiteral(BooleanLiteralContext ctx) { Boolean b = Boolean.valueOf(ctx.getText()); - return new Literal(b); + return new BooleanLiteral(b); } @Override public Literal visitIntegerLiteral(IntegerLiteralContext ctx) { // TODO: throw NumberFormatException Integer l = Integer.valueOf(ctx.getText()); - return new Literal(l); + return new IntegerLiteral(l); } @Override @@ -400,7 +404,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> { .map(str -> str.substring(1, str.length() - 1)) .reduce((s1, s2) -> s1 + s2) .orElse(""); - return new Literal(s); + return new StringLiteral(s); } @Override 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 2ea6890894..653940279e 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 @@ -21,9 +21,9 @@ import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.expression.rewrite.ExpressionRuleExecutor; import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; +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.Literal; 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; @@ -71,7 +71,7 @@ public class PushPredicateThroughJoin extends OneRewriteRuleFactory { LogicalJoin<GroupPlan, GroupPlan> join = filter.child(); Expression wherePredicates = filter.getPredicates(); - Expression onPredicates = Literal.TRUE_LITERAL; + Expression onPredicates = BooleanLiteral.TRUE; List<Expression> otherConditions = Lists.newArrayList(); List<Expression> eqConditions = Lists.newArrayList(); @@ -126,11 +126,11 @@ public class PushPredicateThroughJoin extends OneRewriteRuleFactory { ExpressionRuleExecutor exprRewriter = new ExpressionRuleExecutor(); Plan leftPlan = joinPlan.left(); Plan rightPlan = joinPlan.right(); - if (!left.equals(Literal.TRUE_LITERAL)) { + if (!left.equals(BooleanLiteral.TRUE)) { leftPlan = new LogicalFilter(exprRewriter.rewrite(left), leftPlan); } - if (!right.equals(Literal.TRUE_LITERAL)) { + if (!right.equals(BooleanLiteral.TRUE)) { rightPlan = new LogicalFilter(exprRewriter.rewrite(right), rightPlan); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BooleanLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BooleanLiteral.java new file mode 100644 index 0000000000..3b6f8b58c1 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BooleanLiteral.java @@ -0,0 +1,53 @@ +// 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.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.BooleanType; + + +/** + * Represents Boolean literal + */ +public class BooleanLiteral extends Literal { + + public static final BooleanLiteral TRUE = new BooleanLiteral(true); + public static final BooleanLiteral FALSE = new BooleanLiteral(false); + + private final boolean value; + + public BooleanLiteral(boolean value) { + super(BooleanType.INSTANCE); + this.value = value; + } + + @Override + public Boolean getValue() { + return value; + } + + @Override + public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { + return visitor.visitBooleanLiteral(this, context); + } + + @Override + public String toString() { + return Boolean.valueOf(value).toString().toUpperCase(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DoubleLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DoubleLiteral.java new file mode 100644 index 0000000000..9ff366a491 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DoubleLiteral.java @@ -0,0 +1,44 @@ +// 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.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.DoubleType; + +/** + * Double literal + */ +public class DoubleLiteral extends Literal { + + private final double value; + + public DoubleLiteral(double value) { + super(DoubleType.INSTANCE); + this.value = value; + } + + @Override + public Double getValue() { + return value; + } + + @Override + public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { + return visitor.visitDoubleLiteral(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/IntegerLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/IntegerLiteral.java new file mode 100644 index 0000000000..6320536d31 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/IntegerLiteral.java @@ -0,0 +1,44 @@ +// 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.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.IntegerType; + +/** + * Represents Integer literal + */ +public class IntegerLiteral extends Literal { + + private final int value; + + public IntegerLiteral(int value) { + super(IntegerType.INSTANCE); + this.value = value; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { + return visitor.visitIntegerLiteral(this, context); + } +} 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 0acefce225..bcd382171b 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 @@ -19,11 +19,7 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; -import org.apache.doris.nereids.types.BooleanType; import org.apache.doris.nereids.types.DataType; -import org.apache.doris.nereids.types.IntegerType; -import org.apache.doris.nereids.types.NullType; -import org.apache.doris.nereids.types.StringType; import java.util.Objects; @@ -31,52 +27,38 @@ import java.util.Objects; * All data type literal expression in Nereids. * TODO: Increase the implementation of sub expression. such as Integer. */ -public class Literal extends Expression implements LeafExpression { - public static final Literal TRUE_LITERAL = new Literal(true); - public static final Literal FALSE_LITERAL = new Literal(false); +public abstract class Literal extends Expression implements LeafExpression { + private final DataType dataType; - private final Object value; /** * Constructor for Literal. * - * @param value real value stored in java object * @param dataType logical data type in Nereids */ - public Literal(Object value, DataType dataType) { + public Literal(DataType dataType) { super(ExpressionType.LITERAL); this.dataType = dataType; - this.value = value; } /** - * Constructor for Literal. Recognize data type Automatically. - * - * @param value real value stored in java object + * Get literal according to value type */ - public Literal(Object value) { - super(ExpressionType.LITERAL); - this.value = value; + public static Literal of(Object value) { if (value == null) { - dataType = NullType.INSTANCE; + return new NullLiteral(); } else if (value instanceof Integer) { - dataType = IntegerType.INSTANCE; + return new IntegerLiteral((Integer) value); } else if (value instanceof Boolean) { - dataType = BooleanType.INSTANCE; + return new BooleanLiteral((Boolean) value); } else if (value instanceof String) { - dataType = StringType.INSTANCE; + return new StringLiteral((String) value); } else { throw new RuntimeException(); } } - public static Literal of(Object value) { - return new Literal(value); - } - - public Object getValue() { - return value; - } + public abstract Object getValue(); @Override public DataType getDataType() throws UnboundException { @@ -85,12 +67,12 @@ public class Literal extends Expression implements LeafExpression { @Override public String toSql() { - return value.toString(); + return toString(); } @Override public boolean nullable() throws UnboundException { - return value == null; + return this instanceof NullLiteral; } @Override @@ -112,16 +94,16 @@ public class Literal extends Expression implements LeafExpression { return false; } Literal other = (Literal) o; - return Objects.equals(value, other.getValue()); + return Objects.equals(getValue(), other.getValue()); } @Override public int hashCode() { - return Objects.hashCode(value); + return Objects.hashCode(getValue()); } @Override public String toString() { - return value.toString(); + return String.valueOf(getValue()); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullLiteral.java new file mode 100644 index 0000000000..4320080e8d --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullLiteral.java @@ -0,0 +1,46 @@ +// 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.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.NullType; + +/** + * Represents Null literal + */ +public class NullLiteral extends Literal { + + public NullLiteral() { + super(NullType.INSTANCE); + } + + @Override + public Object getValue() { + return null; + } + + @Override + public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { + return visitor.visitNullLiteral(this, context); + } + + @Override + public String toString() { + return "NULL"; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/StringLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/StringLiteral.java new file mode 100644 index 0000000000..d0a9d65326 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/StringLiteral.java @@ -0,0 +1,54 @@ +// 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.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.StringType; + +/** + * Represents String literal + */ +public class StringLiteral extends Literal { + + private final String value; + + /** + * Constructor for Literal. + * + * @param value real value stored in java object + */ + public StringLiteral(String value) { + super(StringType.INSTANCE); + this.value = value; + } + + @Override + public String getValue() { + return value; + } + + @Override + public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { + return visitor.visitStringLiteral(this, context); + } + + @Override + public String toSql() { + return "'" + value + "'"; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java index 7084ea8503..7286812e82 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java @@ -25,13 +25,16 @@ 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.Like; @@ -40,10 +43,12 @@ 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.Regexp; 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.StringRegexPredicate; import org.apache.doris.nereids.trees.expressions.Subtract; import org.apache.doris.nereids.trees.expressions.functions.AggregateFunction; @@ -108,6 +113,26 @@ public abstract class ExpressionVisitor<R, C> { return visit(literal, context); } + public R visitBooleanLiteral(BooleanLiteral booleanLiteral, C context) { + return visit(booleanLiteral, context); + } + + public R visitStringLiteral(StringLiteral stringLiteral, C context) { + return visit(stringLiteral, context); + } + + public R visitIntegerLiteral(IntegerLiteral integerLiteral, C context) { + return visit(integerLiteral, context); + } + + public R visitNullLiteral(NullLiteral nullLiteral, C context) { + return visit(nullLiteral, context); + } + + public R visitDoubleLiteral(DoubleLiteral doubleLiteral, C context) { + return visit(doubleLiteral, context); + } + public R visitBetween(Between between, C context) { return visit(between, context); } 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 index 1b05457259..731eb8d599 100644 --- 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 @@ -21,22 +21,27 @@ 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.Literal; 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; @@ -64,11 +69,6 @@ public abstract class IterationVisitor<C> extends DefaultExpressionVisitor<Void, return null; } - @Override - public Void visitLiteral(Literal literal, C context) { - return null; - } - @Override public Void visitArithmetic(Arithmetic arithmetic, C context) { visit(arithmetic.child(0), context); @@ -178,5 +178,35 @@ public abstract class IterationVisitor<C> extends DefaultExpressionVisitor<Void, 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/util/ExpressionUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java index e95a5571e7..c257a80cdf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java @@ -17,10 +17,10 @@ package org.apache.doris.nereids.util; +import org.apache.doris.nereids.trees.expressions.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.CompoundPredicate; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.ExpressionType; -import org.apache.doris.nereids.trees.expressions.Literal; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; @@ -91,8 +91,8 @@ public class ExpressionUtils { Preconditions.checkArgument(op == ExpressionType.AND || op == ExpressionType.OR); Objects.requireNonNull(expressions, "expressions is null"); - Expression shortCircuit = (op == ExpressionType.AND ? Literal.FALSE_LITERAL : Literal.TRUE_LITERAL); - Expression skip = (op == ExpressionType.AND ? Literal.TRUE_LITERAL : Literal.FALSE_LITERAL); + Expression shortCircuit = (op == ExpressionType.AND ? BooleanLiteral.FALSE : BooleanLiteral.TRUE); + Expression skip = (op == ExpressionType.AND ? BooleanLiteral.TRUE : BooleanLiteral.FALSE); LinkedHashSet<Expression> distinctExpressions = Sets.newLinkedHashSetWithExpectedSize(expressions.size()); for (Expression expression : expressions) { if (expression.equals(shortCircuit)) { @@ -104,6 +104,6 @@ public class ExpressionUtils { Optional<Expression> result = distinctExpressions.stream().reduce((left, right) -> new CompoundPredicate(op, left, right)); - return result.orElse(new Literal(op == ExpressionType.AND)); + return result.orElse(new BooleanLiteral(op == ExpressionType.AND)); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/AggregateDisassembleTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/AggregateDisassembleTest.java index b735e8049e..a43374adb9 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/AggregateDisassembleTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/AggregateDisassembleTest.java @@ -30,7 +30,7 @@ import org.apache.doris.nereids.rules.rewrite.AggregateDisassemble; import org.apache.doris.nereids.trees.expressions.Add; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.Literal; +import org.apache.doris.nereids.trees.expressions.IntegerLiteral; import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.Sum; @@ -144,9 +144,9 @@ public class AggregateDisassembleTest { @Test public void aliasGroupBy() { List<Expression> groupExpressionList = Lists.newArrayList( - new Add(rStudent.getOutput().get(2).toSlot(), new Literal(1))); + new Add(rStudent.getOutput().get(2).toSlot(), new IntegerLiteral(1))); List<NamedExpression> outputExpressionList = Lists.newArrayList( - new Alias(new Add(rStudent.getOutput().get(2).toSlot(), new Literal(1)), "key"), + new Alias(new Add(rStudent.getOutput().get(2).toSlot(), new IntegerLiteral(1)), "key"), new Alias(new Sum(rStudent.getOutput().get(0).toSlot()), "sum")); Plan root = new LogicalAggregate<>(groupExpressionList, outputExpressionList, rStudent); @@ -170,9 +170,9 @@ public class AggregateDisassembleTest { Assertions.assertEquals(AggPhase.GLOBAL, global.getAggPhase()); Assertions.assertEquals(AggPhase.LOCAL, local.getAggPhase()); - Expression localOutput0 = new Add(rStudent.getOutput().get(2).toSlot(), new Literal(1)); + Expression localOutput0 = new Add(rStudent.getOutput().get(2).toSlot(), new IntegerLiteral(1)); Expression localOutput1 = new Sum(rStudent.getOutput().get(0).toSlot()); - Expression localGroupBy = new Add(rStudent.getOutput().get(2).toSlot(), new Literal(1)); + Expression localGroupBy = new Add(rStudent.getOutput().get(2).toSlot(), new IntegerLiteral(1)); Assertions.assertEquals(2, local.getOutputExpressionList().size()); Assertions.assertTrue(local.getOutputExpressionList().get(0) instanceof Alias); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java new file mode 100644 index 0000000000..c510f5b48a --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java @@ -0,0 +1,40 @@ +// 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.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class LiteralTest { + + @Test + public void testEqual() { + IntegerLiteral one = new IntegerLiteral(1); + IntegerLiteral anotherOne = new IntegerLiteral(1); + IntegerLiteral two = new IntegerLiteral(2); + Assertions.assertNotEquals(one, two); + Assertions.assertEquals(one, anotherOne); + StringLiteral str1 = new StringLiteral("hello"); + Assertions.assertNotEquals(str1, one); + Assertions.assertTrue(Literal.of("world") instanceof StringLiteral); + Assertions.assertTrue(Literal.of(null) instanceof NullLiteral); + Assertions.assertTrue(Literal.of(1) instanceof IntegerLiteral); + Assertions.assertTrue(Literal.of(false) instanceof BooleanLiteral); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org