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/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new 9f9b666bc1 [Feature](Nereids) Data structure of comparison predicate (#9506) 9f9b666bc1 is described below commit 9f9b666bc190005dd8b5e5f5f1bc295470ff04bd Author: EmmyMiao87 <522274...@qq.com> AuthorDate: Mon May 16 15:01:13 2022 +0800 [Feature](Nereids) Data structure of comparison predicate (#9506) 1. The data structure of the comparison expression 2. Refactored the inheritance and implementation relationship of tree node ``` +-- ---- ---- ---+- ---- ---- ---- ---+- ---- ----- ---- ----TreeNode-----------------+ | | | | | | | | | v v v v Abstract Tree Node Leaf Node Unary Node Binary Node +-------- ---------+ | | | | (children) | | | v v v v v Leaf Expression Unary Expression Binary Expression +------Expression----+ Plan Node | | | | | | | | | | v v | | +- ---- ---- -----> Comparison Predicate Named Expr +---- -------+ | | v v | +- -- --- --- --- --- --- --- --- --- --- --- --- --- ---> Alias Expr Slot ^ | | | | +---- --- ---- ------ ---- ------- ------ ------- --- ------ ------ ----- ---- ----- ----- ---+ ``` --- .../antlr4/org/apache/doris/nereids/DorisLexer.g4 | 3 +- .../antlr4/org/apache/doris/nereids/DorisParser.g4 | 2 +- .../doris/nereids/analyzer/UnboundAlias.java | 5 +- .../apache/doris/nereids/analyzer/UnboundStar.java | 2 +- .../{AstBuilder.java => LogicalPlanBuilder.java} | 34 +++--- .../org/apache/doris/nereids/parser/SqlParser.java | 4 +- .../org/apache/doris/nereids/pattern/Patterns.java | 39 +++---- .../org/apache/doris/nereids/trees/NodeType.java | 9 +- .../doris/nereids/trees/expressions/Alias.java | 9 +- .../trees/expressions/BinaryExpression.java | 20 +--- .../nereids/trees/expressions/BinaryPredicate.java | 122 --------------------- ...actExpression.java => ComparisonPredicate.java} | 46 ++++---- .../expressions/{Expression.java => EqualTo.java} | 26 ++--- .../nereids/trees/expressions/Expression.java | 30 +++-- .../{BinaryExpression.java => GreaterThan.java} | 31 +++--- ...stractExpression.java => GreaterThanEqual.java} | 42 +++---- .../nereids/trees/expressions/LeafExpression.java | 11 +- .../{BinaryExpression.java => LessThan.java} | 31 +++--- .../{BinaryExpression.java => LessThanEqual.java} | 31 +++--- .../doris/nereids/trees/expressions/Literal.java | 4 +- .../nereids/trees/expressions/NamedExpression.java | 36 ++---- .../{Slot.java => NamedExpressionUtil.java} | 23 ++-- .../expressions/{Expression.java => Not.java} | 27 +++-- ...{AbstractExpression.java => NullSafeEqual.java} | 43 +++----- .../doris/nereids/trees/expressions/Slot.java | 5 +- .../nereids/trees/expressions/SlotReference.java | 2 +- .../nereids/trees/expressions/UnaryExpression.java | 11 +- ...icateTest.java => ComparisonPredicateTest.java} | 6 +- 28 files changed, 239 insertions(+), 415 deletions(-) diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 index bd1737b7ac..c07854e0cc 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 @@ -371,8 +371,7 @@ ZONE: 'ZONE'; EQ : '=' | '=='; NSEQ: '<=>'; -NEQ : '<>'; -NEQJ: '!='; +NEQ : '<>' | '!='; LT : '<'; LTE : '<=' | '!>'; GT : '>'; diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 602a5ed394..d4c580dfc7 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -170,7 +170,7 @@ constant ; comparisonOperator - : EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ + : EQ | NEQ | LT | LTE | GT | GTE | NSEQ ; booleanValue diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java index 4b7301734e..23272aaf7e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java @@ -29,9 +29,8 @@ import java.util.List; /** * Expression for unbound alias. */ -public class UnboundAlias<CHILD_TYPE extends Expression> - extends UnaryExpression<UnboundAlias<CHILD_TYPE>, CHILD_TYPE> - implements NamedExpression<UnboundAlias<CHILD_TYPE>> { +public class UnboundAlias<CHILD_TYPE extends Expression> extends NamedExpression<UnboundAlias<CHILD_TYPE>> + implements UnaryExpression<UnboundAlias<CHILD_TYPE>, CHILD_TYPE> { public UnboundAlias(CHILD_TYPE child) { super(NodeType.UNBOUND_ALIAS, child); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java index d94d1df637..ce4c9c1ca4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java @@ -29,7 +29,7 @@ import java.util.List; /** * Star expression. */ -public class UnboundStar extends LeafExpression<UnboundStar> implements NamedExpression<UnboundStar> { +public class UnboundStar extends NamedExpression<UnboundStar> implements LeafExpression<UnboundStar> { private final List<String> target; public UnboundStar(List<String> target) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/AstBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java similarity index 94% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/AstBuilder.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index 7a93b88e0d..8dfc6bec91 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/AstBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -50,17 +50,24 @@ import org.apache.doris.nereids.analyzer.UnboundRelation; import org.apache.doris.nereids.analyzer.UnboundSlot; import org.apache.doris.nereids.analyzer.UnboundStar; import org.apache.doris.nereids.trees.expressions.Alias; -import org.apache.doris.nereids.trees.expressions.BinaryPredicate; +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.LessThan; +import org.apache.doris.nereids.trees.expressions.LessThanEqual; import org.apache.doris.nereids.trees.expressions.Literal; import org.apache.doris.nereids.trees.expressions.NamedExpression; +import org.apache.doris.nereids.trees.expressions.Not; +import org.apache.doris.nereids.trees.expressions.NullSafeEqual; import org.apache.doris.nereids.trees.plans.JoinType; 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.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; -import com.clearspring.analytics.util.Lists; +import com.google.common.collect.Lists; + import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.RuleContext; import org.antlr.v4.runtime.tree.ParseTree; @@ -74,9 +81,9 @@ import java.util.function.Supplier; import java.util.stream.Collectors; /** - * Build an AST that consisting of logical plans. + * Build an logical plan tree with unbounded nodes. */ -public class AstBuilder extends DorisParserBaseVisitor<Object> { +public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> { /** * Create a logical plan using a where clause. @@ -356,20 +363,19 @@ public class AstBuilder extends DorisParserBaseVisitor<Object> { TerminalNode operator = (TerminalNode) ctx.comparisonOperator().getChild(0); switch (operator.getSymbol().getType()) { case DorisParser.EQ: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.EQ); - case DorisParser.NSEQ: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.NSEQ); + return new EqualTo(left, right); + case DorisParser.NEQ: + return new Not(new EqualTo(left, right)); case DorisParser.LT: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.LT); + return new LessThan(left, right); case DorisParser.GT: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.GT); + return new GreaterThan(left, right); case DorisParser.LTE: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.LE); + return new LessThanEqual(left, right); case DorisParser.GTE: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.GE); - case DorisParser.NEQ: - case DorisParser.NEQJ: - return new BinaryPredicate(left, right, BinaryPredicate.Operator.EQ); + return new GreaterThanEqual(left, right); + case DorisParser.NSEQ: + return new NullSafeEqual(left, right); default: return null; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/SqlParser.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/SqlParser.java index a2a44378a9..9c734e1edc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/SqlParser.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/SqlParser.java @@ -63,7 +63,7 @@ public class SqlParser { tree = parser.singleStatement(); } - AstBuilder astBuilder = new AstBuilder(); - return (LogicalPlan) astBuilder.visit(tree); + LogicalPlanBuilder logicalPlanBuilder = new LogicalPlanBuilder(); + return (LogicalPlan) logicalPlanBuilder.visit(tree); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/Patterns.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/Patterns.java index c73a45cc3c..3e35bae60b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/Patterns.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/Patterns.java @@ -25,8 +25,7 @@ import org.apache.doris.nereids.rules.RulePromise; import org.apache.doris.nereids.trees.NodeType; import org.apache.doris.nereids.trees.TreeNode; import org.apache.doris.nereids.trees.expressions.Alias; -import org.apache.doris.nereids.trees.expressions.BinaryPredicate; -import org.apache.doris.nereids.trees.expressions.BinaryPredicate.Operator; +import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Literal; import org.apache.doris.nereids.trees.expressions.SlotReference; @@ -329,38 +328,28 @@ public interface Patterns { } /** - * create a binaryPredicate pattern. + * TODO create a ComparisonPredicate pattern. */ - default PatternDescriptor<BinaryPredicate<Expression, Expression>, Expression> binaryPredicate() { - return new PatternDescriptor<>( - new Pattern<>(NodeType.BINARY_PREDICATE), - defaultPromise() - ); - } /** - * create a binaryPredicate pattern with operator type. + * TODO create a ComparisonPredicate pattern with children patterns. */ - default PatternDescriptor<BinaryPredicate<Expression, Expression>, Expression> binaryPredicate(Operator operator) { - return new PatternDescriptor<BinaryPredicate<Expression, Expression>, Expression>( - new Pattern<>(NodeType.BINARY_PREDICATE), - defaultPromise() - ).when(p -> p.getOperator() == operator); + + /** + * create a equal to predicate pattern. + */ + default PatternDescriptor<EqualTo<Expression, Expression>, Expression> equalTo() { + return new PatternDescriptor<>(new Pattern<>(NodeType.EQUAL_TO), defaultPromise()); } /** - * create a binaryPredicate pattern with children patterns. + * create a equal to predicate pattern with children patterns. */ - default <C1 extends Expression, C2 extends Expression> PatternDescriptor<BinaryPredicate<C1, C2>, Expression> - binaryPredicate(PatternDescriptor<C1, Expression> leftChildPattern, - PatternDescriptor<C2, Expression> rightChildPattern) { + default <C1 extends Expression, C2 extends Expression> PatternDescriptor<EqualTo<C1, C2>, Expression> equalTo( + PatternDescriptor<C1, Expression> leftChildPattern, PatternDescriptor<C2, Expression> rightChildPattern) { return new PatternDescriptor<>( - new Pattern<>(NodeType.BINARY_PREDICATE, - leftChildPattern.pattern, - rightChildPattern.pattern - ), - defaultPromise() - ); + new Pattern<>(NodeType.EQUAL_TO, leftChildPattern.pattern, rightChildPattern.pattern), + defaultPromise()); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/NodeType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/NodeType.java index 71a9830415..bf048208a3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/NodeType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/NodeType.java @@ -43,7 +43,14 @@ public enum NodeType { UNBOUND_STAR, LITERAL, SLOT_REFERENCE, - BINARY_PREDICATE, + COMPARISON_PREDICATE, + EQUAL_TO, + LESS_THAN, + GREATER_THAN, + LESS_THAN_EQUAL, + GREATER_THAN_EQUAL, + NULL_SAFE_EQUAL, + NOT, ALIAS, // pattern diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java index c688df8915..a9b46ae80c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java @@ -20,16 +20,15 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.trees.NodeType; -import com.clearspring.analytics.util.Lists; +import com.google.common.collect.Lists; import java.util.List; /** * Expression for alias, such as col1 as c1. */ -public class Alias<CHILD_TYPE extends Expression> - extends UnaryExpression<Alias<CHILD_TYPE>, CHILD_TYPE> - implements NamedExpression<Alias<CHILD_TYPE>> { +public class Alias<CHILD_TYPE extends Expression> extends NamedExpression<Alias<CHILD_TYPE>> + implements UnaryExpression<Alias<CHILD_TYPE>, CHILD_TYPE> { private final ExprId exprId; private final String name; @@ -43,7 +42,7 @@ public class Alias<CHILD_TYPE extends Expression> */ public Alias(CHILD_TYPE child, String name) { super(NodeType.ALIAS, child); - exprId = NamedExpressionUtils.newExprId(); + exprId = NamedExpressionUtil.newExprId(); this.name = name; qualifier = Lists.newArrayList(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java index 7cac178f55..988985c196 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java @@ -21,26 +21,12 @@ import org.apache.doris.nereids.trees.BinaryNode; import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all expression that have two children. + * Interface for all expression that have two children. */ -public abstract class BinaryExpression< +public interface BinaryExpression< EXPR_TYPE extends BinaryExpression<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>, LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> - extends AbstractExpression<EXPR_TYPE> - implements BinaryNode<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + extends BinaryNode<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { - public BinaryExpression(NodeType type, LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { - super(type, left, right); - } - - @Override - public LEFT_CHILD_TYPE left() { - return BinaryNode.super.left(); - } - - @Override - public RIGHT_CHILD_TYPE right() { - return BinaryNode.super.right(); - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryPredicate.java deleted file mode 100644 index f962732627..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryPredicate.java +++ /dev/null @@ -1,122 +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; - -import org.apache.doris.common.AnalysisException; -import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.NodeType; -import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.DataType; - -/** - * Binary predicate expression. - */ -public class BinaryPredicate< - LEFT_CHILD_TYPE extends Expression, - RIGHT_CHILD_TYPE extends Expression> - extends BinaryExpression<BinaryPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>, - LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { - - private final Operator operator; - - /** - * Operator for binary predicate. - */ - public enum Operator { - EQ("="), - NSEQ("<=>"), - LT("<"), - GT(">"), - LE("<="), - GE(">="), - ; - - private final String operand; - - Operator(String operand) { - this.operand = operand; - } - - /** - * Translate expression op in Nereids to legacy one in Doris. - * - * @param operator expression operator in Nereids - * @return legacy expression operator in Doris - * @throws AnalysisException throw exception when operator cannot be recognized - */ - public static org.apache.doris.analysis.BinaryPredicate.Operator toExprOp(Operator operator) - throws AnalysisException { - switch (operator) { - case EQ: - return org.apache.doris.analysis.BinaryPredicate.Operator.EQ; - case GE: - return org.apache.doris.analysis.BinaryPredicate.Operator.GE; - case GT: - return org.apache.doris.analysis.BinaryPredicate.Operator.GT; - case LE: - return org.apache.doris.analysis.BinaryPredicate.Operator.LE; - case LT: - return org.apache.doris.analysis.BinaryPredicate.Operator.LT; - case NSEQ: - return org.apache.doris.analysis.BinaryPredicate.Operator.EQ_FOR_NULL; - default: - throw new AnalysisException("Not support operator: " + operator.name()); - } - } - } - - /** - * Constructor of BinaryPredicate. - * - * @param left left child of binary predicate - * @param right right child of binary predicate - * @param operator operator of binary predicate - */ - public BinaryPredicate(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right, Operator operator) { - super(NodeType.BINARY_PREDICATE, left, right); - this.operator = operator; - } - - public Operator getOperator() { - return operator; - } - - @Override - public boolean nullable() throws UnboundException { - if (operator == Operator.NSEQ) { - return false; - } else { - return left().nullable() || right().nullable(); - } - } - - @Override - public DataType getDataType() throws UnboundException { - return BooleanType.INSTANCE; - } - - @Override - public String sql() { - return null; - } - - @Override - public String toString() { - return "(" + left() + " " + operator.operand + " " + right() + ")"; - } -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java similarity index 55% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java index 6996a66cc2..4f3307d9ab 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java @@ -18,42 +18,36 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.AbstractTreeNode; import org.apache.doris.nereids.trees.NodeType; +import org.apache.doris.nereids.types.BooleanType; import org.apache.doris.nereids.types.DataType; -import java.util.List; - /** - * Abstract class for all Expression in Nereids. + * Comparison predicate expression. + * Such as: "=", "<", "<=", ">", ">=", "<=>" */ -public abstract class AbstractExpression<EXPR_TYPE extends AbstractExpression<EXPR_TYPE>> - extends AbstractTreeNode<EXPR_TYPE> - implements Expression<EXPR_TYPE> { - - public AbstractExpression(NodeType type, Expression... children) { - super(type, children); - } - - public DataType getDataType() throws UnboundException { - throw new UnboundException("dataType"); - } - - public String sql() throws UnboundException { - throw new UnboundException("sql"); - } - - public boolean nullable() throws UnboundException { - throw new UnboundException("nullable"); +public class ComparisonPredicate<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends Expression<ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>> implements + BinaryExpression<ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + + /** + * Constructor of ComparisonPredicate. + * + * @param nodeType node type of expression + * @param left left child of comparison predicate + * @param right right child of comparison predicate + */ + public ComparisonPredicate(NodeType nodeType, LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(nodeType, left, right); } @Override - public List<Expression> children() { - return (List) children; + public DataType getDataType() throws UnboundException { + return BooleanType.INSTANCE; } @Override - public Expression child(int index) { - return (Expression) children.get(index); + public String sql() { + return toString(); } } 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/EqualTo.java similarity index 62% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/EqualTo.java index 6783102fa7..20517d7523 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/EqualTo.java @@ -18,25 +18,25 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.TreeNode; -import org.apache.doris.nereids.types.DataType; - -import java.util.List; +import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all Expression in Nereids. + * Equal to expression: a = b. */ -public interface Expression<EXPR_TYPE extends Expression<EXPR_TYPE>> extends TreeNode<EXPR_TYPE> { - - DataType getDataType() throws UnboundException; - - String sql() throws UnboundException; +public class EqualTo<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { - boolean nullable() throws UnboundException; + public EqualTo(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(NodeType.EQUAL_TO, left, right); + } @Override - List<Expression> children(); + public boolean nullable() throws UnboundException { + return left().nullable() || right().nullable(); + } @Override - Expression child(int index); + public String toString() { + return "(" + left() + " = " + right() + ")"; + } } 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 6783102fa7..c490627e38 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 @@ -18,7 +18,8 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.TreeNode; +import org.apache.doris.nereids.trees.AbstractTreeNode; +import org.apache.doris.nereids.trees.NodeType; import org.apache.doris.nereids.types.DataType; import java.util.List; @@ -26,17 +27,32 @@ import java.util.List; /** * Abstract class for all Expression in Nereids. */ -public interface Expression<EXPR_TYPE extends Expression<EXPR_TYPE>> extends TreeNode<EXPR_TYPE> { +public abstract class Expression<EXPR_TYPE extends Expression<EXPR_TYPE>> + extends AbstractTreeNode<EXPR_TYPE> { - DataType getDataType() throws UnboundException; + public Expression(NodeType type, Expression... children) { + super(type, children); + } - String sql() throws UnboundException; + public DataType getDataType() throws UnboundException { + throw new UnboundException("dataType"); + } - boolean nullable() throws UnboundException; + public String sql() throws UnboundException { + throw new UnboundException("sql"); + } + + public boolean nullable() throws UnboundException { + throw new UnboundException("nullable"); + } @Override - List<Expression> children(); + public List<Expression> children() { + return (List) children; + } @Override - Expression child(int index); + public Expression child(int index) { + return (Expression) children.get(index); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java similarity index 55% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java index 7cac178f55..99ce4cb7b9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java @@ -17,30 +17,31 @@ package org.apache.doris.nereids.trees.expressions; -import org.apache.doris.nereids.trees.BinaryNode; +import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all expression that have two children. + * Greater than expression: a > b. */ -public abstract class BinaryExpression< - EXPR_TYPE extends BinaryExpression<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>, - LEFT_CHILD_TYPE extends Expression, - RIGHT_CHILD_TYPE extends Expression> - extends AbstractExpression<EXPR_TYPE> - implements BinaryNode<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { - - public BinaryExpression(NodeType type, LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { - super(type, left, right); +public class GreaterThan<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + /** + * Constructor of Greater Than ComparisonPredicate. + * + * @param left left child of greater than + * @param right right child of greater than + */ + public GreaterThan(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(NodeType.GREATER_THAN, left, right); } @Override - public LEFT_CHILD_TYPE left() { - return BinaryNode.super.left(); + public boolean nullable() throws UnboundException { + return left().nullable() || right().nullable(); } @Override - public RIGHT_CHILD_TYPE right() { - return BinaryNode.super.right(); + public String toString() { + return "(" + left() + " > " + right() + ")"; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java similarity index 54% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java index 6996a66cc2..4e7a2f92dc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java @@ -18,42 +18,30 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.AbstractTreeNode; import org.apache.doris.nereids.trees.NodeType; -import org.apache.doris.nereids.types.DataType; - -import java.util.List; /** - * Abstract class for all Expression in Nereids. + * Greater than and equal expression: a >= b. */ -public abstract class AbstractExpression<EXPR_TYPE extends AbstractExpression<EXPR_TYPE>> - extends AbstractTreeNode<EXPR_TYPE> - implements Expression<EXPR_TYPE> { - - public AbstractExpression(NodeType type, Expression... children) { - super(type, children); - } - - public DataType getDataType() throws UnboundException { - throw new UnboundException("dataType"); - } - - public String sql() throws UnboundException { - throw new UnboundException("sql"); - } - - public boolean nullable() throws UnboundException { - throw new UnboundException("nullable"); +public class GreaterThanEqual<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + /** + * Constructor of Greater Than And Equal. + * + * @param left left child of Greater Than And Equal + * @param right right child of Greater Than And Equal + */ + public GreaterThanEqual(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(NodeType.GREATER_THAN_EQUAL, left, right); } @Override - public List<Expression> children() { - return (List) children; + public boolean nullable() throws UnboundException { + return left().nullable() || right().nullable(); } @Override - public Expression child(int index) { - return (Expression) children.get(index); + public String toString() { + return "(" + left() + " >= " + right() + ")"; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LeafExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LeafExpression.java index 7fc5f1d6de..2c8aeb55c4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LeafExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LeafExpression.java @@ -18,16 +18,9 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.trees.LeafNode; -import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all expression that have no child. + * Interface for all expression that have no child. */ -public abstract class LeafExpression<EXPR_TYPE extends LeafExpression<EXPR_TYPE>> - extends AbstractExpression<EXPR_TYPE> - implements LeafNode<EXPR_TYPE> { - - public LeafExpression(NodeType type) { - super(type); - } +public interface LeafExpression<EXPR_TYPE extends LeafExpression<EXPR_TYPE>> extends LeafNode<EXPR_TYPE> { } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java similarity index 56% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java index 7cac178f55..cfea4676de 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java @@ -17,30 +17,31 @@ package org.apache.doris.nereids.trees.expressions; -import org.apache.doris.nereids.trees.BinaryNode; +import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all expression that have two children. + * Less than expression: a < b. */ -public abstract class BinaryExpression< - EXPR_TYPE extends BinaryExpression<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>, - LEFT_CHILD_TYPE extends Expression, - RIGHT_CHILD_TYPE extends Expression> - extends AbstractExpression<EXPR_TYPE> - implements BinaryNode<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { - - public BinaryExpression(NodeType type, LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { - super(type, left, right); +public class LessThan<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + /** + * Constructor of Less Than Comparison Predicate. + * + * @param left left child of Less Than + * @param right right child of Less Than + */ + public LessThan(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(NodeType.LESS_THAN, left, right); } @Override - public LEFT_CHILD_TYPE left() { - return BinaryNode.super.left(); + public boolean nullable() throws UnboundException { + return left().nullable() || right().nullable(); } @Override - public RIGHT_CHILD_TYPE right() { - return BinaryNode.super.right(); + public String toString() { + return "(" + left() + " < " + right() + ")"; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java similarity index 55% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java index 7cac178f55..5ba2c1a5bb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java @@ -17,30 +17,31 @@ package org.apache.doris.nereids.trees.expressions; -import org.apache.doris.nereids.trees.BinaryNode; +import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all expression that have two children. + * Less than and equal expression: a <= b. */ -public abstract class BinaryExpression< - EXPR_TYPE extends BinaryExpression<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE>, - LEFT_CHILD_TYPE extends Expression, - RIGHT_CHILD_TYPE extends Expression> - extends AbstractExpression<EXPR_TYPE> - implements BinaryNode<EXPR_TYPE, LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { - - public BinaryExpression(NodeType type, LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { - super(type, left, right); +public class LessThanEqual<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + /** + * Constructor of Less Than And Equal. + * + * @param left left child of Less Than And Equal + * @param right right child of Less Than And Equal + */ + public LessThanEqual(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(NodeType.LESS_THAN_EQUAL, left, right); } @Override - public LEFT_CHILD_TYPE left() { - return BinaryNode.super.left(); + public boolean nullable() throws UnboundException { + return left().nullable() || right().nullable(); } @Override - public RIGHT_CHILD_TYPE right() { - return BinaryNode.super.right(); + public String toString() { + return "(" + left() + " <= " + right() + ")"; } } 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 21fce728f7..79e830d91d 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 @@ -30,14 +30,14 @@ import org.apache.doris.nereids.types.StringType; /** * All data type literal expression in Nereids. */ -public class Literal extends LeafExpression<Literal> { +public class Literal extends Expression<Literal> implements LeafExpression<Literal> { private final DataType dataType; private final Object value; /** * Constructor for Literal. * - * @param value real value stored in java object + * @param value real value stored in java object * @param dataType logical data type in Nereids */ public Literal(Object value, DataType dataType) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java index 1001ba7205..ae7f4d27f1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java @@ -18,38 +18,34 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; +import org.apache.doris.nereids.trees.NodeType; import org.apache.commons.collections.CollectionUtils; import java.util.List; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicLong; /** * Expression in Nereids that having name. */ -public interface NamedExpression<EXPR_TYPE extends NamedExpression<EXPR_TYPE>> - extends Expression<EXPR_TYPE> { +public abstract class NamedExpression<EXPR_TYPE extends NamedExpression<EXPR_TYPE>> extends Expression<EXPR_TYPE> { - @Override - Expression child(int index); - - @Override - List<Expression> children(); + public NamedExpression(NodeType type, Expression... children) { + super(type, children); + } - default Slot toSlot() throws UnboundException { + public Slot toSlot() throws UnboundException { throw new UnboundException("toSlot"); } - default String getName() throws UnboundException { + public String getName() throws UnboundException { throw new UnboundException("name"); } - default ExprId getExprId() throws UnboundException { + public ExprId getExprId() throws UnboundException { throw new UnboundException("exprId"); } - default List<String> getQualifier() throws UnboundException { + public List<String> getQualifier() throws UnboundException { throw new UnboundException("qualifier"); } @@ -59,23 +55,11 @@ public interface NamedExpression<EXPR_TYPE extends NamedExpression<EXPR_TYPE>> * @return qualified name * @throws UnboundException throw this exception if this expression is unbound */ - default String getQualifiedName() throws UnboundException { + public String getQualifiedName() throws UnboundException { String qualifiedName = ""; if (CollectionUtils.isNotEmpty(getQualifier())) { qualifiedName = String.join(".", getQualifier()) + "."; } return qualifiedName + getName(); } - - /** - * Tool class for generate next ExprId. - */ - class NamedExpressionUtils { - static final UUID JVM_ID = UUID.randomUUID(); - private static final AtomicLong CURRENT_ID = new AtomicLong(); - - static ExprId newExprId() { - return new ExprId(CURRENT_ID.getAndIncrement(), JVM_ID); - } - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java similarity index 67% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java index 62f18e994c..610a695475 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java @@ -17,21 +17,20 @@ package org.apache.doris.nereids.trees.expressions; -import org.apache.doris.nereids.trees.NodeType; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; /** - * Abstract class for all slot in expression. + * The util of named expression. */ -public abstract class Slot<EXPR_TYPE extends Slot<EXPR_TYPE>> - extends LeafExpression<EXPR_TYPE> - implements NamedExpression<EXPR_TYPE> { +public class NamedExpressionUtil { + /** + * Tool class for generate next ExprId. + */ + private static final UUID JVM_ID = UUID.randomUUID(); + private static final AtomicLong CURRENT_ID = new AtomicLong(); - public Slot(NodeType type) { - super(type); - } - - @Override - public Slot toSlot() { - return this; + public static ExprId newExprId() { + return new ExprId(CURRENT_ID.getAndIncrement(), JVM_ID); } } 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/Not.java similarity index 66% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Not.java index 6783102fa7..15ddcf54b5 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/Not.java @@ -18,25 +18,24 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.TreeNode; -import org.apache.doris.nereids.types.DataType; - -import java.util.List; +import org.apache.doris.nereids.trees.NodeType; /** - * Abstract class for all Expression in Nereids. + * Not expression: not a. */ -public interface Expression<EXPR_TYPE extends Expression<EXPR_TYPE>> extends TreeNode<EXPR_TYPE> { - - DataType getDataType() throws UnboundException; - - String sql() throws UnboundException; - - boolean nullable() throws UnboundException; +public class Not<CHILD_TYPE extends Expression> extends Expression<Not<CHILD_TYPE>> + implements UnaryExpression<Not<CHILD_TYPE>, CHILD_TYPE> { + public Not(CHILD_TYPE child) { + super(NodeType.NOT, child); + } @Override - List<Expression> children(); + public boolean nullable() throws UnboundException { + return child().nullable(); + } @Override - Expression child(int index); + public String toString() { + return "( not " + child() + ")"; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java similarity index 54% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java index 6996a66cc2..61488318b9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AbstractExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java @@ -18,42 +18,31 @@ package org.apache.doris.nereids.trees.expressions; import org.apache.doris.nereids.exceptions.UnboundException; -import org.apache.doris.nereids.trees.AbstractTreeNode; import org.apache.doris.nereids.trees.NodeType; -import org.apache.doris.nereids.types.DataType; - -import java.util.List; /** - * Abstract class for all Expression in Nereids. + * Null safe equal expression: a <=> b. + * Unlike normal equal to expression, null <=> null is true. */ -public abstract class AbstractExpression<EXPR_TYPE extends AbstractExpression<EXPR_TYPE>> - extends AbstractTreeNode<EXPR_TYPE> - implements Expression<EXPR_TYPE> { - - public AbstractExpression(NodeType type, Expression... children) { - super(type, children); - } - - public DataType getDataType() throws UnboundException { - throw new UnboundException("dataType"); - } - - public String sql() throws UnboundException { - throw new UnboundException("sql"); - } - - public boolean nullable() throws UnboundException { - throw new UnboundException("nullable"); +public class NullSafeEqual<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Expression> + extends ComparisonPredicate<LEFT_CHILD_TYPE, RIGHT_CHILD_TYPE> { + /** + * Constructor of Null Safe Equal ComparisonPredicate. + * + * @param left left child of Null Safe Equal + * @param right right child of Null Safe Equal + */ + public NullSafeEqual(LEFT_CHILD_TYPE left, RIGHT_CHILD_TYPE right) { + super(NodeType.NULL_SAFE_EQUAL, left, right); } @Override - public List<Expression> children() { - return (List) children; + public boolean nullable() throws UnboundException { + return false; } @Override - public Expression child(int index) { - return (Expression) children.get(index); + public String toString() { + return "(" + left() + " <=> " + right() + ")"; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java index 62f18e994c..16d23ffd98 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Slot.java @@ -22,9 +22,8 @@ import org.apache.doris.nereids.trees.NodeType; /** * Abstract class for all slot in expression. */ -public abstract class Slot<EXPR_TYPE extends Slot<EXPR_TYPE>> - extends LeafExpression<EXPR_TYPE> - implements NamedExpression<EXPR_TYPE> { +public abstract class Slot<EXPR_TYPE extends Slot<EXPR_TYPE>> extends NamedExpression<EXPR_TYPE> + implements LeafExpression<EXPR_TYPE> { public Slot(NodeType type) { super(type); 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 b4d76ac136..f779b9eaba 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 @@ -38,7 +38,7 @@ public class SlotReference extends Slot<SlotReference> { private final boolean nullable; public SlotReference(String name, DataType dataType, boolean nullable, List<String> qualifier) { - this(NamedExpressionUtils.newExprId(), name, dataType, nullable, qualifier); + this(NamedExpressionUtil.newExprId(), name, dataType, nullable, qualifier); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java index 7729720d42..991edda91c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java @@ -17,19 +17,12 @@ package org.apache.doris.nereids.trees.expressions; -import org.apache.doris.nereids.trees.NodeType; import org.apache.doris.nereids.trees.UnaryNode; /** * Abstract class for all expression that have one child. */ -public abstract class UnaryExpression< - EXPR_TYPE extends UnaryExpression<EXPR_TYPE, CHILD_TYPE>, - CHILD_TYPE extends Expression> - extends AbstractExpression<EXPR_TYPE> - implements UnaryNode<EXPR_TYPE, CHILD_TYPE> { +public interface UnaryExpression<EXPR_TYPE extends UnaryExpression<EXPR_TYPE, CHILD_TYPE>, + CHILD_TYPE extends Expression> extends UnaryNode<EXPR_TYPE, CHILD_TYPE> { - public UnaryExpression(NodeType type, CHILD_TYPE child) { - super(type, child); - } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/BinaryPredicateTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ComparisonPredicateTest.java similarity index 98% rename from fe/fe-core/src/test/java/org/apache/doris/analysis/BinaryPredicateTest.java rename to fe/fe-core/src/test/java/org/apache/doris/analysis/ComparisonPredicateTest.java index e1c7d3ec99..d050c94d90 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/BinaryPredicateTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ComparisonPredicateTest.java @@ -31,7 +31,11 @@ import mockit.Mocked; import org.junit.Assert; import org.junit.Test; -public class BinaryPredicateTest { + +/** + * Comparison Predicate unit test. + */ +public class ComparisonPredicateTest { @Mocked Analyzer analyzer; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org