Skip to content

Commit

Permalink
[opt](Nereids) remove between expression to simplify planner
Browse files Browse the repository at this point in the history
  • Loading branch information
morrySnow committed Aug 24, 2023
1 parent adafcc1 commit fbef81b
Show file tree
Hide file tree
Showing 20 changed files with 16 additions and 264 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.And;
import org.apache.doris.nereids.trees.expressions.AssertNumRowsElement;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.BinaryArithmetic;
import org.apache.doris.nereids.trees.expressions.CaseWhen;
import org.apache.doris.nereids.trees.expressions.Cast;
Expand Down Expand Up @@ -281,11 +280,6 @@ public Expr visitNullLiteral(NullLiteral nullLiteral, PlanTranslatorContext cont
return nullLit;
}

@Override
public Expr visitBetween(Between between, PlanTranslatorContext context) {
throw new RuntimeException("Unexpected invocation");
}

@Override
public Expr visitAnd(And and, PlanTranslatorContext context) {
return new org.apache.doris.analysis.CompoundPredicate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@
import org.apache.doris.nereids.properties.SelectHint;
import org.apache.doris.nereids.trees.expressions.Add;
import org.apache.doris.nereids.trees.expressions.And;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.BitAnd;
import org.apache.doris.nereids.trees.expressions.BitNot;
import org.apache.doris.nereids.trees.expressions.BitOr;
Expand Down Expand Up @@ -1827,10 +1826,9 @@ private Expression withPredicate(Expression valueExpression, PredicateContext ct
Expression outExpression;
switch (ctx.kind.getType()) {
case DorisParser.BETWEEN:
outExpression = new Between(
valueExpression,
getExpression(ctx.lower),
getExpression(ctx.upper)
outExpression = new And(
new GreaterThanEqual(valueExpression, getExpression(ctx.lower)),
new LessThanEqual(valueExpression, getExpression(ctx.upper))
);
break;
case DorisParser.LIKE:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
package org.apache.doris.nereids.rules.expression;

import org.apache.doris.nereids.rules.expression.check.CheckCast;
import org.apache.doris.nereids.rules.expression.rules.BetweenToCompoundRule;
import org.apache.doris.nereids.rules.expression.rules.DigitalMaskingConvert;
import org.apache.doris.nereids.rules.expression.rules.FoldConstantRule;
import org.apache.doris.nereids.rules.expression.rules.InPredicateDedup;
Expand Down Expand Up @@ -46,7 +45,6 @@ public class ExpressionNormalization extends ExpressionRewrite {
SupportJavaDateFormatter.INSTANCE,
ReplaceVariableByLiteral.INSTANCE,
NormalizeBinaryPredicatesRule.INSTANCE,
BetweenToCompoundRule.INSTANCE,
InPredicateDedup.INSTANCE,
InPredicateToEqualToRule.INSTANCE,
SimplifyNotExprRule.INSTANCE,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
Expand Down Expand Up @@ -126,10 +125,6 @@ private void collectConst(Expression expr, Map<String, Expression> constMap, Map
if (expr.isLiteral()) {
return;
}
// skip BetweenPredicate need to be rewrite to CompoundPredicate
if (expr instanceof Between) {
return;
}
String id = idGenerator.getNextId().toString();
constMap.put(id, expr);
Expr staleExpr = ExpressionTranslator.translate(expr, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.apache.doris.nereids.rules.analysis.ArithmeticFunctionBinder;
import org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.BinaryArithmetic;
import org.apache.doris.nereids.trees.expressions.BitNot;
import org.apache.doris.nereids.trees.expressions.CaseWhen;
Expand Down Expand Up @@ -234,14 +233,6 @@ public Expression visitInPredicate(InPredicate inPredicate, ExpressionRewriteCon
return TypeCoercionUtils.processInPredicate(newInPredicate);
}

@Override
public Expression visitBetween(Between between, ExpressionRewriteContext context) {
List<Expression> rewrittenChildren = between.children().stream()
.map(e -> e.accept(this, context)).collect(Collectors.toList());
Between newBetween = between.withChildren(rewrittenChildren);
return TypeCoercionUtils.processBetween(newBetween);
}

@Override
public Expression visitInSubquery(InSubquery inSubquery, ExpressionRewriteContext context) {
Expression newCompareExpr = inSubquery.getCompareExpr().accept(this, context);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.And;
import org.apache.doris.nereids.trees.expressions.AssertNumRowsElement;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.BinaryArithmetic;
import org.apache.doris.nereids.trees.expressions.BinaryOperator;
import org.apache.doris.nereids.trees.expressions.BitAnd;
Expand Down Expand Up @@ -295,10 +294,6 @@ public R visitArrayLiteral(ArrayLiteral arrayLiteral, C context) {
return visitLiteral(arrayLiteral, context);
}

public R visitBetween(Between between, C context) {
return visit(between, context);
}

public R visitCompoundPredicate(CompoundPredicate compoundPredicate, C context) {
return visitBinaryOperator(compoundPredicate, context);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import org.apache.doris.nereids.annotation.Developing;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Add;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.BinaryArithmetic;
import org.apache.doris.nereids.trees.expressions.BinaryOperator;
import org.apache.doris.nereids.trees.expressions.BitAnd;
Expand Down Expand Up @@ -894,33 +893,6 @@ public static Expression processCompoundPredicate(CompoundPredicate compoundPred
return compoundPredicate.withChildren(children);
}

/**
* process between type coercion.
*/
public static Expression processBetween(Between between) {
// check
between.checkLegalityBeforeTypeCoercion();

if (between.getLowerBound().getDataType().equals(between.getCompareExpr().getDataType())
&& between.getUpperBound().getDataType().equals(between.getCompareExpr().getDataType())) {
return between;
}
Optional<DataType> optionalCommonType = TypeCoercionUtils.findWiderCommonTypeForComparison(
between.children()
.stream()
.map(Expression::getDataType)
.collect(Collectors.toList()));

return optionalCommonType
.map(commonType -> {
List<Expression> newChildren = between.children().stream()
.map(e -> TypeCoercionUtils.castIfNotMatchType(e, commonType))
.collect(Collectors.toList());
return between.withChildren(newChildren);
})
.orElse(between);
}

private static boolean canCompareDate(DataType t1, DataType t2) {
DataType dateType = t1;
DataType anotherType = t2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.doris.nereids.rules.expression;

import org.apache.doris.nereids.rules.expression.rules.BetweenToCompoundRule;
import org.apache.doris.nereids.rules.expression.rules.DistinctPredicatesRule;
import org.apache.doris.nereids.rules.expression.rules.ExtractCommonFactorRule;
import org.apache.doris.nereids.rules.expression.rules.InPredicateDedup;
Expand Down Expand Up @@ -164,16 +163,6 @@ public void testExtractCommonFactorRewrite() {

}

@Test
public void testBetweenToCompoundRule() {
executor = new ExpressionRuleExecutor(ImmutableList.of(BetweenToCompoundRule.INSTANCE,
SimplifyNotExprRule.INSTANCE));

assertRewrite("a between c and d", "(a >= c) and (a <= d)");
assertRewrite("a not between c and d)", "(a < c) or (a > d)");

}

@Test
public void testInPredicateToEqualToRule() {
executor = new ExpressionRuleExecutor(ImmutableList.of(InPredicateToEqualToRule.INSTANCE));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,6 @@ public void testComparisonPredicate() {
Assertions.assertEquals(greaterThanEqual1.hashCode(), greaterThanEqual2.hashCode());
}

@Test
public void testBetween() {
Between between1 = new Between(child1, left1, right1);
Between between2 = new Between(child2, left2, right2);
Assertions.assertEquals(between1, between2);
Assertions.assertEquals(between1.hashCode(), between2.hashCode());
}

@Test
public void testNot() {
Not not1 = new Not(child1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,9 @@ public void testSqlBetweenPredicate() {
public void testExprBetweenPredicate() {
parseExpression("c BETWEEN a AND b")
.assertEquals(
new Between(
new UnboundSlot("c"),
new UnboundSlot("a"),
new UnboundSlot("b")
new And(
new GreaterThanEqual(new UnboundSlot("c"), new UnboundSlot("a")),
new LessThanEqual(new UnboundSlot("c"), new UnboundSlot("b"))
)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,6 @@ PhysicalResultSink
------------------------------PhysicalOlapScan[catalog_sales]
----------------------------PhysicalDistribute
------------------------------PhysicalProject
--------------------------------filter((date_dim.d_moy >= 1)(date_dim.d_year = 2001)(date_dim.d_moy <= 4))
--------------------------------filter((date_dim.d_moy >= 1)(date_dim.d_moy <= 4)(date_dim.d_year = 2001))
----------------------------------PhysicalOlapScan[date_dim]

Loading

0 comments on commit fbef81b

Please sign in to comment.