This is an automated email from the ASF dual-hosted git repository. jakevin 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 6890e5bf0f [test](Nereids): add test for SimplifyComparisonPredicate (#24865) 6890e5bf0f is described below commit 6890e5bf0f185d48f6a088444bd5fc8238f8b60c Author: jakevin <jakevin...@gmail.com> AuthorDate: Tue Sep 26 12:50:31 2023 +0800 [test](Nereids): add test for SimplifyComparisonPredicate (#24865) --- .../rules/SimplifyComparisonPredicate.java | 15 +-- .../rules/expression/ExpressionRewriteTest.java | 61 ----------- .../rules/SimplifyComparisonPredicateTest.java | 114 +++++++++++++++++++++ 3 files changed, 116 insertions(+), 74 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java index 19574f8f16..5c6025f060 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java @@ -85,8 +85,7 @@ public class SimplifyComparisonPredicate extends AbstractExpressionRewriteRule { } // decimalv3 type - if (left.getDataType() instanceof DecimalV3Type - && right.getDataType() instanceof DecimalV3Type) { + if (left.getDataType() instanceof DecimalV3Type && right.getDataType() instanceof DecimalV3Type) { return processDecimalV3TypeCoercion(cp, left, right); } @@ -198,7 +197,7 @@ public class SimplifyComparisonPredicate extends AbstractExpressionRewriteRule { } if (left.getDataType() == DateType.INSTANCE && right.getDataType() == DateType.INSTANCE) { - //Date cp Date is not supported in BE storage engine. So cast to DateTime + // Date cp Date is not supported in BE storage engine. So cast to DateTime left = new Cast(left, DateTimeType.INSTANCE); if (right instanceof DateLiteral) { right = migrateLiteralToDateTime((DateLiteral) originalRight); @@ -349,16 +348,6 @@ public class SimplifyComparisonPredicate extends AbstractExpressionRewriteRule { } } - private Expression migrateCastToDateTime(Cast cast) { - //cast( cast(v as date) as datetime) if v is datetime, set left = v - if (cast.child() instanceof Cast - && cast.child().child(0).getDataType() instanceof DateTimeType) { - return cast.child().child(0); - } else { - return new Cast(cast.child(), DateTimeType.INSTANCE); - } - } - /* derive tree: DateLiteral diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java index 1010e7df27..646174c9eb 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java @@ -23,20 +23,13 @@ import org.apache.doris.nereids.rules.expression.rules.InPredicateDedup; import org.apache.doris.nereids.rules.expression.rules.InPredicateToEqualToRule; import org.apache.doris.nereids.rules.expression.rules.NormalizeBinaryPredicatesRule; import org.apache.doris.nereids.rules.expression.rules.SimplifyCastRule; -import org.apache.doris.nereids.rules.expression.rules.SimplifyComparisonPredicate; import org.apache.doris.nereids.rules.expression.rules.SimplifyDecimalV3Comparison; import org.apache.doris.nereids.rules.expression.rules.SimplifyNotExprRule; import org.apache.doris.nereids.trees.expressions.Cast; 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.LessThan; import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.CharLiteral; -import org.apache.doris.nereids.trees.expressions.literal.DateLiteral; -import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral; -import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal; -import org.apache.doris.nereids.trees.expressions.literal.DateV2Literal; import org.apache.doris.nereids.trees.expressions.literal.DecimalLiteral; import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal; import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral; @@ -44,8 +37,6 @@ import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.StringLiteral; import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral; import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral; -import org.apache.doris.nereids.types.DateTimeType; -import org.apache.doris.nereids.types.DateTimeV2Type; import org.apache.doris.nereids.types.DecimalV2Type; import org.apache.doris.nereids.types.DecimalV3Type; import org.apache.doris.nereids.types.StringType; @@ -218,58 +209,6 @@ class ExpressionRewriteTest extends ExpressionRewriteTestHelper { new DecimalLiteral(new BigDecimal(1))); } - @Test - void testSimplifyComparisonPredicateRule() { - executor = new ExpressionRuleExecutor(ImmutableList.of(SimplifyCastRule.INSTANCE, SimplifyComparisonPredicate.INSTANCE)); - - Expression dtv2 = new DateTimeV2Literal(1, 1, 1, 1, 1, 1, 0); - Expression dt = new DateTimeLiteral(1, 1, 1, 1, 1, 1); - Expression dv2 = new DateV2Literal(1, 1, 1); - Expression dv2PlusOne = new DateV2Literal(1, 1, 2); - Expression d = new DateLiteral(1, 1, 1); - // Expression dPlusOne = new DateLiteral(1, 1, 2); - - // DateTimeV2 -> DateTime - assertRewrite( - new GreaterThan(new Cast(dt, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new GreaterThan(dt, dt)); - - // DateTimeV2 -> DateV2 - assertRewrite( - new GreaterThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new GreaterThan(dv2, dv2)); - assertRewrite( - new LessThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new LessThan(dv2, dv2PlusOne)); - assertRewrite( - new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2)); - - // DateTimeV2 -> Date - assertRewrite( - new GreaterThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new GreaterThan(new Cast(d, DateTimeType.INSTANCE), dt)); - assertRewrite( - new LessThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new LessThan(new Cast(d, DateTimeType.INSTANCE), dt)); - assertRewrite( - new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), - new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2)); - - // test hour, minute and second all zero - Expression dtv2AtZeroClock = new DateTimeV2Literal(1, 1, 1, 0, 0, 0, 0); - assertRewrite( - new GreaterThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2AtZeroClock), - new GreaterThan(dv2, dv2)); - assertRewrite( - new LessThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2AtZeroClock), - new LessThan(dv2, dv2)); - assertRewrite( - new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2AtZeroClock), - new EqualTo(dv2, dv2)); - - } - @Test void testSimplifyDecimalV3Comparison() { executor = new ExpressionRuleExecutor(ImmutableList.of(SimplifyDecimalV3Comparison.INSTANCE)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java new file mode 100644 index 0000000000..b06d914b65 --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java @@ -0,0 +1,114 @@ +// 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.rules.expression.rules; + +import org.apache.doris.nereids.rules.expression.ExpressionRewriteTestHelper; +import org.apache.doris.nereids.rules.expression.ExpressionRuleExecutor; +import org.apache.doris.nereids.trees.expressions.Cast; +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.LessThan; +import org.apache.doris.nereids.trees.expressions.literal.DateLiteral; +import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral; +import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal; +import org.apache.doris.nereids.trees.expressions.literal.DateV2Literal; +import org.apache.doris.nereids.types.DateTimeType; +import org.apache.doris.nereids.types.DateTimeV2Type; + +import com.google.common.collect.ImmutableList; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SimplifyComparisonPredicateTest extends ExpressionRewriteTestHelper { + + @Test + void testSimplifyComparisonPredicateRule() { + executor = new ExpressionRuleExecutor(ImmutableList.of(SimplifyCastRule.INSTANCE, SimplifyComparisonPredicate.INSTANCE)); + + Expression dtv2 = new DateTimeV2Literal(1, 1, 1, 1, 1, 1, 0); + Expression dt = new DateTimeLiteral(1, 1, 1, 1, 1, 1); + Expression dv2 = new DateV2Literal(1, 1, 1); + Expression dv2PlusOne = new DateV2Literal(1, 1, 2); + Expression d = new DateLiteral(1, 1, 1); + // Expression dPlusOne = new DateLiteral(1, 1, 2); + + // DateTimeV2 -> DateTime + assertRewrite( + new GreaterThan(new Cast(dt, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new GreaterThan(dt, dt)); + + // DateTimeV2 -> DateV2 + assertRewrite( + new GreaterThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new GreaterThan(dv2, dv2)); + assertRewrite( + new LessThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new LessThan(dv2, dv2PlusOne)); + assertRewrite( + new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2)); + + // DateTimeV2 -> Date + assertRewrite( + new GreaterThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new GreaterThan(new Cast(d, DateTimeType.INSTANCE), dt)); + assertRewrite( + new LessThan(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new LessThan(new Cast(d, DateTimeType.INSTANCE), dt)); + assertRewrite( + new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2), + new EqualTo(new Cast(d, DateTimeV2Type.SYSTEM_DEFAULT), dtv2)); + + // test hour, minute and second all zero + Expression dtv2AtZeroClock = new DateTimeV2Literal(1, 1, 1, 0, 0, 0, 0); + assertRewrite( + new GreaterThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2AtZeroClock), + new GreaterThan(dv2, dv2)); + assertRewrite( + new LessThan(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2AtZeroClock), + new LessThan(dv2, dv2)); + assertRewrite( + new EqualTo(new Cast(dv2, DateTimeV2Type.SYSTEM_DEFAULT), dtv2AtZeroClock), + new EqualTo(dv2, dv2)); + + } + + @Test + void testDateTimeV2CmpDateTimeV2() { + executor = new ExpressionRuleExecutor( + ImmutableList.of(SimplifyCastRule.INSTANCE, SimplifyComparisonPredicate.INSTANCE)); + + Expression dt = new DateTimeLiteral(1, 1, 1, 1, 1, 1); + + // cast(0001-01-01 01:01:01 as DATETIMEV2(0) + Expression left = new Cast(dt, DateTimeV2Type.SYSTEM_DEFAULT); + // 2021-01-01 00:00:00.001 (DATETIMEV2(3)) + Expression right = new DateTimeV2Literal("2021-01-01 00:00:00.001"); + + // (cast(0001-01-01 01:01:01 as DATETIMEV2(0)) > 2021-01-01 00:00:00.001) + Expression expression = new GreaterThan(left, right); + Expression rewrittenExpression = executor.rewrite(typeCoercion(expression), context); + Assertions.assertEquals(left.getDataType(), rewrittenExpression.child(0).getDataType()); + + // (cast(0001-01-01 01:01:01 as DATETIMEV2(0)) < 2021-01-01 00:00:00.001) + expression = new GreaterThan(left, right); + rewrittenExpression = executor.rewrite(typeCoercion(expression), context); + Assertions.assertEquals(left.getDataType(), rewrittenExpression.child(0).getDataType()); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org