You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by li...@apache.org on 2022/07/18 04:01:35 UTC

[doris] branch master updated: [Refactor](nereids)Refactor Literal to an inheritance hierarchy (#10771)

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 <33...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org