Skip to content

Commit

Permalink
[Feature](Nereids) Data structure of comparison predicate
Browse files Browse the repository at this point in the history
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
                                                                                                      ^
        |                                                                                             |
        |                                                                                             |
        +---- --- ---- ------ ---- ------- ------ ------- --- ------ ------ ----- ---- ----- ----- ---+
```
  • Loading branch information
EmmyMiao87 committed May 11, 2022
1 parent 99b8e08 commit d4d348e
Show file tree
Hide file tree
Showing 28 changed files with 461 additions and 264 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,7 @@ ZONE: 'ZONE';

EQ : '=' | '==';
NSEQ: '<=>';
NEQ : '<>';
NEQJ: '!=';
NEQ : '<>' | '!=';
LT : '<';
LTE : '<=' | '!>';
GT : '>';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ constant
;

comparisonOperator
: EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ
: EQ | NEQ | LT | LTE | GT | GTE | NSEQ
;

booleanValue
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
* Expression for unbound alias.
*/
public class UnboundAlias<CHILD_TYPE extends Expression>
extends UnaryExpression<UnboundAlias<CHILD_TYPE>, CHILD_TYPE>
implements NamedExpression<UnboundAlias<CHILD_TYPE>> {
extends NamedExpression<UnboundAlias<CHILD_TYPE>>
implements UnaryExpression<UnboundAlias<CHILD_TYPE>, CHILD_TYPE> {

public UnboundAlias(CHILD_TYPE child) {
super(NodeType.UNBOUND_ALIAS, child);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
/**
* 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,22 @@
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.NotEqualTo;
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 org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.RuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
Expand All @@ -73,10 +78,12 @@
import java.util.function.Supplier;
import java.util.stream.Collectors;

import com.clearspring.analytics.util.Lists;

/**
* Build an AST that consisting of logical plans.
*/
public class AstBuilder extends DorisParserBaseVisitor<Object> {
public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {

/**
* Create a logical plan using a where clause.
Expand Down Expand Up @@ -356,20 +363,19 @@ public Expression visitComparison(ComparisonContext ctx) {
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 NotEqualTo(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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public LogicalPlan parse(String sql) throws Exception {
tree = parser.singleStatement();
}

AstBuilder astBuilder = new AstBuilder();
return (LogicalPlan) astBuilder.visit(tree);
LogicalPlanBuilder logicalPlanBuilder = new LogicalPlanBuilder();
return (LogicalPlan) logicalPlanBuilder.visit(tree);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@
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;
Expand Down Expand Up @@ -329,33 +328,31 @@ default PatternDescriptor<SlotReference, Expression> slotReference() {
}

/**
* 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),

/**
* create a EQComparisonPredicate pattern.
*/
default PatternDescriptor<EqualTo<Expression, Expression>, Expression> eqcomparisonPredicate() {
return new PatternDescriptor<>(
new Pattern<>(NodeType.EQ_COMPARISON_PREDICATE),
defaultPromise()
).when(p -> p.getOperator() == operator);
);
}

/**
* create a binaryPredicate pattern with children patterns.
* create a EQComparisonPredicate pattern with children patterns.
*/
default <C1 extends Expression, C2 extends Expression> PatternDescriptor<BinaryPredicate<C1, C2>, Expression>
binaryPredicate(PatternDescriptor<C1, Expression> leftChildPattern,
default <C1 extends Expression, C2 extends Expression> PatternDescriptor<EqualTo<C1, C2>, Expression>
eqcomparisonPredicate(PatternDescriptor<C1, Expression> leftChildPattern,
PatternDescriptor<C2, Expression> rightChildPattern) {
return new PatternDescriptor<>(
new Pattern<>(NodeType.BINARY_PREDICATE,
new Pattern<>(NodeType.EQ_COMPARISON_PREDICATE,
leftChildPattern.pattern,
rightChildPattern.pattern
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,15 @@ public enum NodeType {
UNBOUND_STAR,
LITERAL,
SLOT_REFERENCE,
BINARY_PREDICATE,
COMPARISON_PREDICATE,
EQ_COMPARISON_PREDICATE,
NE_COMPARISON_PREDICATE,
LT_COMPARISON_PREDICATE,
GT_COMPARISON_PREDICATE,
LTE_COMPARISON_PREDICATE,
GTE_COMPARISON_PREDICATE,
NSEQ_COMPARISON_PREDICATE,

ALIAS,

// pattern
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;

import com.clearspring.analytics.util.Lists;

import java.util.List;

import com.clearspring.analytics.util.Lists;

/**
* 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>> {
extends NamedExpression<Alias<CHILD_TYPE>>
implements UnaryExpression<Alias<CHILD_TYPE>, CHILD_TYPE> {

private final ExprId exprId;
private final String name;
Expand All @@ -43,7 +43,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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,12 @@
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();
}
}

This file was deleted.

Loading

0 comments on commit d4d348e

Please sign in to comment.