From aeb3a2c5d0b2c394cf85a1f781eb231ead2190bd Mon Sep 17 00:00:00 2001 From: yujun Date: Tue, 31 Dec 2024 14:36:24 +0800 Subject: [PATCH] fix rule type --- .../pattern/ExpressionPatternRules.java | 12 +++- .../ExpressionPatternMatchRule.java | 6 ++ .../expression/ExpressionPatternMatcher.java | 5 +- .../ExpressionPatternRuleFactory.java | 21 ++++--- .../rules/expression/ExpressionRuleType.java | 59 +++++++++++++++++++ .../rules/expression/check/CheckCast.java | 3 +- .../rules/expression/rules/AddMinMax.java | 2 + .../rules/ArrayContainToArrayOverlap.java | 2 + .../expression/rules/BetweenToEqual.java | 2 + .../rules/expression/rules/CaseWhenToIf.java | 2 + .../expression/rules/ConvertAggStateCast.java | 2 + .../expression/rules/DateFunctionRewrite.java | 14 +++-- .../rules/DigitalMaskingConvert.java | 5 +- .../rules/DistinctPredicatesRule.java | 2 + .../rules/ExtractCommonFactorRule.java | 2 + .../rules/FoldConstantRuleOnBE.java | 2 + .../rules/FoldConstantRuleOnFE.java | 4 +- .../expression/rules/InPredicateDedup.java | 2 + .../rules/InPredicateToEqualToRule.java | 5 +- .../expression/rules/LikeToEqualRewrite.java | 2 + .../expression/rules/MergeDateTrunc.java | 2 + .../rules/NormalizeBinaryPredicatesRule.java | 2 + .../rules/NullSafeEqualToEqual.java | 2 + .../rules/expression/rules/OrToIn.java | 2 + .../rules/ReplaceVariableByLiteral.java | 3 +- .../SimplifyArithmeticComparisonRule.java | 2 + .../rules/SimplifyArithmeticRule.java | 2 + .../expression/rules/SimplifyCastRule.java | 2 + .../rules/SimplifyComparisonPredicate.java | 2 + .../rules/SimplifyConditionalFunction.java | 8 ++- .../expression/rules/SimplifyInPredicate.java | 2 + .../expression/rules/SimplifyNotExprRule.java | 2 + .../rules/expression/rules/SimplifyRange.java | 2 + .../rules/SupportJavaDateFormatter.java | 8 ++- .../rules/expression/rules/TopnToMax.java | 2 + .../nereids/rules/rewrite/ExprIdRewriter.java | 3 +- .../org/apache/doris/qe/SessionVariable.java | 26 ++++++++ .../test_disable_nereids_expression_rule.out | 10 ++++ ...est_disable_nereids_expression_rule.groovy | 28 +++++++++ 39 files changed, 237 insertions(+), 27 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java create mode 100644 regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out create mode 100644 regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java index 523540e6435d89..339c082dbd2746 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java @@ -26,6 +26,7 @@ import org.apache.logging.log4j.Logger; import java.lang.reflect.Field; +import java.util.BitSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -48,10 +49,13 @@ public Optional matchesAndApply(Expression expr, ExpressionRewriteCo List rules = singleMappings.get(expr.getClass()); ExpressionMatchingContext matchingContext = new ExpressionMatchingContext<>(expr, parent, context); + BitSet disableRules = context.cascadesContext.getConnectContext().getSessionVariable() + .getDisableNereidsExpressionRules(); switch (rules.size()) { case 0: { for (ExpressionPatternMatchRule multiMatchRule : multiMappings) { - if (multiMatchRule.matchesTypeAndPredicates(matchingContext)) { + if (!disableRules.get(multiMatchRule.getExpressionRuleType().type()) + && multiMatchRule.matchesTypeAndPredicates(matchingContext)) { Expression newExpr = multiMatchRule.apply(matchingContext); if (!newExpr.equals(expr)) { if (context.cascadesContext.isEnableExprTrace()) { @@ -65,7 +69,8 @@ public Optional matchesAndApply(Expression expr, ExpressionRewriteCo } case 1: { ExpressionPatternMatchRule rule = rules.get(0); - if (rule.matchesPredicates(matchingContext)) { + if (!disableRules.get(rule.getExpressionRuleType().type()) + && rule.matchesPredicates(matchingContext)) { Expression newExpr = rule.apply(matchingContext); if (!newExpr.equals(expr)) { if (context.cascadesContext.isEnableExprTrace()) { @@ -78,7 +83,8 @@ public Optional matchesAndApply(Expression expr, ExpressionRewriteCo } default: { for (ExpressionPatternMatchRule rule : rules) { - if (rule.matchesPredicates(matchingContext)) { + if (!disableRules.get(rule.getExpressionRuleType().type()) + && rule.matchesPredicates(matchingContext)) { Expression newExpr = rule.apply(matchingContext); if (!expr.equals(newExpr)) { if (context.cascadesContext.isEnableExprTrace()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java index dbf5c79c96d754..b794981f657a7d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java @@ -25,11 +25,13 @@ /** ExpressionPatternMatcherRule */ public class ExpressionPatternMatchRule implements TypeMapping { + public final ExpressionRuleType expressionRuleType; public final Class typePattern; public final List>> predicates; public final ExpressionMatchingAction matchingAction; public ExpressionPatternMatchRule(ExpressionPatternMatcher patternMatcher) { + this.expressionRuleType = patternMatcher.expressionRuleType; this.typePattern = patternMatcher.typePattern; this.predicates = patternMatcher.predicates; this.matchingAction = patternMatcher.matchingAction; @@ -61,4 +63,8 @@ public Expression apply(ExpressionMatchingContext context) { public Class getType() { return typePattern; } + + public ExpressionRuleType getExpressionRuleType() { + return expressionRuleType; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java index 058b1d60b1d013..0815060724ef8d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java @@ -27,13 +27,16 @@ /** ExpressionPattern */ public class ExpressionPatternMatcher { + + public final ExpressionRuleType expressionRuleType; public final Class typePattern; public final List>> predicates; public final ExpressionMatchingAction matchingAction; - public ExpressionPatternMatcher(Class typePattern, + public ExpressionPatternMatcher(ExpressionRuleType expressionRuleType, Class typePattern, List>> predicates, ExpressionMatchingAction matchingAction) { + this.expressionRuleType = Objects.requireNonNull(expressionRuleType, "expressionRuleType can not be null"); this.typePattern = Objects.requireNonNull(typePattern, "typePattern can not be null"); this.predicates = predicates == null ? ImmutableList.of() : predicates; this.matchingAction = Objects.requireNonNull(matchingAction, "matchingAction can not be null"); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java index 7fb18735ba5e46..635f8e0db7d839 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java @@ -48,15 +48,18 @@ default ExpressionPatternDescriptor matchesTopType(Cla class ExpressionPatternDescriptor { private final Class typePattern; private final ImmutableList>> predicates; + private final ExpressionMatchingAction matchingAction; public ExpressionPatternDescriptor(Class typePattern) { - this(typePattern, ImmutableList.of()); + this(typePattern, ImmutableList.of(), ctx -> ctx.expr); } public ExpressionPatternDescriptor( - Class typePattern, ImmutableList>> predicates) { + Class typePattern, ImmutableList>> predicates, + ExpressionMatchingAction matchingAction) { this.typePattern = Objects.requireNonNull(typePattern, "typePattern can not be null"); this.predicates = Objects.requireNonNull(predicates, "predicates can not be null"); + this.matchingAction = Objects.requireNonNull(matchingAction, "action can not be null"); } public ExpressionPatternDescriptor when(Predicate predicate) { @@ -68,17 +71,21 @@ public ExpressionPatternDescriptor whenCtx(Predicate(typePattern, newPredicates.build()); + return new ExpressionPatternDescriptor<>(typePattern, newPredicates.build(), ctx -> ctx.expr); } /** then */ - public ExpressionPatternMatcher then(Function rewriter) { - return new ExpressionPatternMatcher<>( + public ExpressionPatternDescriptor then(Function rewriter) { + return new ExpressionPatternDescriptor<>( typePattern, predicates, (context) -> rewriter.apply(context.expr)); } - public ExpressionPatternMatcher thenApply(ExpressionMatchingAction action) { - return new ExpressionPatternMatcher<>(typePattern, predicates, action); + public ExpressionPatternDescriptor thenApply(ExpressionMatchingAction action) { + return new ExpressionPatternDescriptor<>(typePattern, predicates, action); + } + + public ExpressionPatternMatcher toRule(ExpressionRuleType expressionRuleType) { + return new ExpressionPatternMatcher<>(expressionRuleType, typePattern, predicates, matchingAction); } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java new file mode 100644 index 00000000000000..d8919d1eaedc51 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java @@ -0,0 +1,59 @@ +// 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; + +/** + * Type of rewrite expression rules. + */ +public enum ExpressionRuleType { + ADD_MIN_MAX, + ARRAY_CONTAIN_TO_ARRAY_OVERLAP, + BETWEEN_TO_EQUAL, + CASE_WHEN_TO_IF, + CHECK_CAST, + CONVERT_AGG_STATE_CAST, + DATE_FUNCTION_REWRITE, + DIGITAL_MASKING_CONVERT, + DISTINCT_PREDICATES, + EXPR_ID_REWRITE_REPLACE, + EXTRACT_COMMON_FACTOR, + FOLD_CONSTANT_ON_BE, + FOLD_CONSTANT_ON_FE, + IN_PREDICATE_DEDUP, + IN_PREDICATE_TO_EQUAL_TO, + LIKE_TO_EQUAL, + MERGE_DATE_TRUNC, + NORMALIZE_BINARY_PREDICATES, + NULL_SAFE_EQUAL_TO_EQUAL, + OR_TO_IN, + REPLACE_VARIABLE_BY_LITERAL, + SIMPLIFY_ARITHMETIC_COMPARISON, + SIMPLIFY_ARITHMETIC, + SIMPLIFY_CAST, + SIMPLIFY_COMPARISON_PREDICATE, + SIMPLIFY_CONDITIONAL_FUNCTION, + SIMPLIFY_IN_PREDICATE, + SIMPLIFY_NOT_EXPR, + SIMPLIFY_RANGE, + SUPPORT_JAVA_DATE_FORMATTER, + TOPN_TO_MAX; + + public int type() { + return ordinal(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java index e76d7ef344d8ad..e3ede36da19a57 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java @@ -20,6 +20,7 @@ import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.types.ArrayType; @@ -44,7 +45,7 @@ public class CheckCast implements ExpressionPatternRuleFactory { @Override public List> buildRules() { return ImmutableList.of( - matchesType(Cast.class).then(CheckCast::check) + matchesType(Cast.class).then(CheckCast::check).toRule(ExpressionRuleType.CHECK_CAST) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java index c1efb82bac6efc..80d245c37800c1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java @@ -20,6 +20,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.rules.expression.rules.RangeInference.DiscreteValue; import org.apache.doris.nereids.rules.expression.rules.RangeInference.EmptyValue; import org.apache.doris.nereids.rules.expression.rules.RangeInference.RangeValue; @@ -69,6 +70,7 @@ public List> buildRules() { return ImmutableList.of( matchesTopType(CompoundPredicate.class) .thenApply(ctx -> rewrite(ctx.expr, ctx.rewriteContext)) + .toRule(ExpressionRuleType.ADD_MIN_MAX) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java index f32d76062aaf7c..93e7873638dd14 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Or; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayContains; @@ -57,6 +58,7 @@ public class ArrayContainToArrayOverlap implements ExpressionPatternRuleFactory public List> buildRules() { return ImmutableList.of( matchesTopType(Or.class).then(ArrayContainToArrayOverlap::rewrite) + .toRule(ExpressionRuleType.ARRAY_CONTAIN_TO_ARRAY_OVERLAP) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java index d1279fdfda55d6..9d9eda0a3fdfd9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.And; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; import org.apache.doris.nereids.trees.expressions.EqualTo; @@ -47,6 +48,7 @@ public class BetweenToEqual implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(And.class).then(BetweenToEqual::rewriteBetweenToEqual) + .toRule(ExpressionRuleType.BETWEEN_TO_EQUAL) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java index cafb0ecd068ddd..17d6c6fa6751bd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.CaseWhen; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.WhenClause; @@ -42,6 +43,7 @@ public class CaseWhenToIf implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesTopType(CaseWhen.class).then(CaseWhenToIf::rewrite) + .toRule(ExpressionRuleType.CASE_WHEN_TO_IF) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java index 6d5a70139ab19c..28f6cc51365454 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.Expression; @@ -44,6 +45,7 @@ public class ConvertAggStateCast implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(Cast.class).then(ConvertAggStateCast::convert) + .toRule(ExpressionRuleType.CONVERT_AGG_STATE_CAST) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java index 07ec0c3de71d24..deba786d44cee6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.And; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; @@ -50,11 +51,16 @@ public class DateFunctionRewrite implements ExpressionPatternRuleFactory { @Override public List> buildRules() { return ImmutableList.of( - matchesType(EqualTo.class).then(DateFunctionRewrite::rewriteEqualTo), - matchesType(GreaterThan.class).then(DateFunctionRewrite::rewriteGreaterThan), - matchesType(GreaterThanEqual.class).then(DateFunctionRewrite::rewriteGreaterThanEqual), - matchesType(LessThan.class).then(DateFunctionRewrite::rewriteLessThan), + matchesType(EqualTo.class).then(DateFunctionRewrite::rewriteEqualTo) + .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE), + matchesType(GreaterThan.class).then(DateFunctionRewrite::rewriteGreaterThan) + .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE), + matchesType(GreaterThanEqual.class).then(DateFunctionRewrite::rewriteGreaterThanEqual) + .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE), + matchesType(LessThan.class).then(DateFunctionRewrite::rewriteLessThan) + .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE), matchesType(LessThanEqual.class).then(DateFunctionRewrite::rewriteLessThanEqual) + .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java index 95d25e3c592454..d9cfee2b4070f5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.scalar.Concat; import org.apache.doris.nereids.trees.expressions.functions.scalar.DigitalMasking; @@ -43,8 +44,8 @@ public List> buildRules() { new Concat( new Left(digitalMasking.child(), Literal.of(3)), Literal.of("****"), - new Right(digitalMasking.child(), Literal.of(4))) - ) + new Right(digitalMasking.child(), Literal.of(4)))) + .toRule(ExpressionRuleType.DIGITAL_MASKING_CONVERT) ); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java index cf18886cd85fc3..83d7be34facd9a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.CompoundPredicate; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.util.ExpressionUtils; @@ -43,6 +44,7 @@ public class DistinctPredicatesRule implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesTopType(CompoundPredicate.class).then(DistinctPredicatesRule::distinct) + .toRule(ExpressionRuleType.DISTINCT_PREDICATES) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java index d79fafa80a71b9..9ad42d1b379c9f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java @@ -20,6 +20,7 @@ import org.apache.doris.nereids.annotation.Developing; import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.CompoundPredicate; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; @@ -56,6 +57,7 @@ public class ExtractCommonFactorRule implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesTopType(CompoundPredicate.class).then(ExtractCommonFactorRule::extractCommonFactor) + .toRule(ExpressionRuleType.EXTRACT_COMMON_FACTOR) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java index dd79de70e26adb..21a0d1d59c8fec 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java @@ -31,6 +31,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionMatchingContext; import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.ArrayItemReference; import org.apache.doris.nereids.trees.expressions.Cast; @@ -123,6 +124,7 @@ public List> buildRules() { .isDebugSkipFoldConstant()) .whenCtx(FoldConstantRuleOnBE::isEnableFoldByBe) .thenApply(FoldConstantRuleOnBE::foldByBE) + .toRule(ExpressionRuleType.FOLD_CONSTANT_ON_BE) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java index c2a73f7afec3be..c4dd18acaa2ef5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java @@ -33,6 +33,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.rules.expression.ExpressionTraverseListener; import org.apache.doris.nereids.rules.expression.ExpressionTraverseListenerFactory; import org.apache.doris.nereids.trees.expressions.AggregateExpression; @@ -764,6 +765,7 @@ private ExpressionPatternMatcher ma .whenCtx(ctx -> !ctx.cascadesContext.getConnectContext().getSessionVariable() .isDebugSkipFoldConstant()) .whenCtx(NOT_UNDER_AGG_DISTINCT.as()) - .thenApply(ctx -> visitMethod.apply(ctx.expr, ctx.rewriteContext)); + .thenApply(ctx -> visitMethod.apply(ctx.expr, ctx.rewriteContext)) + .toRule(ExpressionRuleType.FOLD_CONSTANT_ON_FE); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java index 3760dcf0e72420..aaa822ac691eb7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.InPredicate; @@ -39,6 +40,7 @@ public class InPredicateDedup implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(InPredicate.class).then(InPredicateDedup::dedup) + .toRule(ExpressionRuleType.IN_PREDICATE_DEDUP) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java index 353de7f41f62a1..463393327a135a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.InPredicate; @@ -46,8 +47,8 @@ public List> buildRules() { return ImmutableList.of( matchesType(InPredicate.class) .when(in -> in.getOptions().size() == 1) - .then(in -> new EqualTo(in.getCompareExpr(), in.getOptions().get(0)) - ) + .then(in -> new EqualTo(in.getCompareExpr(), in.getOptions().get(0))) + .toRule(ExpressionRuleType.IN_PREDICATE_TO_EQUAL_TO) ); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java index e2836204cdc033..0e93b7ddc5a718 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Like; @@ -38,6 +39,7 @@ public class LikeToEqualRewrite implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(Like.class).then(LikeToEqualRewrite::rewriteLikeToEqual) + .toRule(ExpressionRuleType.LIKE_TO_EQUAL) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java index 892724cf8932fb..f52ba41948d749 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.scalar.DateTrunc; import org.apache.doris.nereids.trees.expressions.literal.Interval.TimeUnit; @@ -47,6 +48,7 @@ public List> buildRules() { matchesTopType(DateTrunc.class) .when(dateTrunc -> dateTrunc.getArgument(0) instanceof DateTrunc) .then(MergeDateTrunc::rewrite) + .toRule(ExpressionRuleType.MERGE_DATE_TRUNC) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java index e73104793cd916..433a43ba1852c5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; import org.apache.doris.nereids.trees.expressions.Expression; @@ -38,6 +39,7 @@ public class NormalizeBinaryPredicatesRule implements ExpressionPatternRuleFacto public List> buildRules() { return ImmutableList.of( matchesType(ComparisonPredicate.class).then(NormalizeBinaryPredicatesRule::normalize) + .toRule(ExpressionRuleType.NORMALIZE_BINARY_PREDICATES) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java index 16c4663a1edacd..6b3b53feb6b9fd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.EqualTo; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.IsNull; @@ -42,6 +43,7 @@ public class NullSafeEqualToEqual implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(NullSafeEqual.class).then(NullSafeEqualToEqual::rewrite) + .toRule(ExpressionRuleType.NULL_SAFE_EQUAL_TO_EQUAL) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java index af61bbdaddf974..59b340478ce432 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java @@ -23,6 +23,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; import org.apache.doris.nereids.rules.expression.ExpressionRewrite; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.And; import org.apache.doris.nereids.trees.expressions.CompoundPredicate; import org.apache.doris.nereids.trees.expressions.EqualTo; @@ -59,6 +60,7 @@ public class OrToIn implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesTopType(Or.class).then(OrToIn.INSTANCE::rewrite) + .toRule(ExpressionRuleType.OR_TO_IN) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java index 74f41e17cac49d..e800bf790c534f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.StatementContext; import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Variable; @@ -46,7 +47,7 @@ public List> buildRules() { sqlCacheContext.get().addUsedVariable(variable); } return variable.getRealExpression(); - }) + }).toRule(ExpressionRuleType.REPLACE_VARIABLE_BY_LITERAL) ); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java index 863bfd18f458fd..853b5a3dfc98c0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java @@ -20,6 +20,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Add; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; import org.apache.doris.nereids.trees.expressions.Divide; @@ -82,6 +83,7 @@ public List> buildRules() { return ImmutableList.of( matchesType(ComparisonPredicate.class) .thenApply(ctx -> simplify(ctx.expr, new ExpressionRewriteContext(ctx.cascadesContext))) + .toRule(ExpressionRuleType.SIMPLIFY_ARITHMETIC_COMPARISON) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java index b9fd91f64387ef..44d6505b003aef 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Add; import org.apache.doris.nereids.trees.expressions.BinaryArithmetic; import org.apache.doris.nereids.trees.expressions.Divide; @@ -52,6 +53,7 @@ public class SimplifyArithmeticRule implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesTopType(BinaryArithmetic.class).then(SimplifyArithmeticRule::simplify) + .toRule(ExpressionRuleType.SIMPLIFY_ARITHMETIC) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java index cc044768056ab3..8c3a5f21a30649 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral; @@ -57,6 +58,7 @@ public class SimplifyCastRule implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(Cast.class).then(SimplifyCastRule::simplifyCast) + .toRule(ExpressionRuleType.SIMPLIFY_CAST) ); } 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 1f435958202264..e2bba0173b0e9d 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 @@ -23,6 +23,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; import org.apache.doris.nereids.trees.expressions.EqualTo; @@ -77,6 +78,7 @@ public class SimplifyComparisonPredicate extends AbstractExpressionRewriteRule i public List> buildRules() { return ImmutableList.of( matchesType(ComparisonPredicate.class).then(SimplifyComparisonPredicate::simplify) + .toRule(ExpressionRuleType.SIMPLIFY_COMPARISON_PREDICATE) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java index c1c6283e32d21c..6862e138ac981f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.scalar.Coalesce; import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf; @@ -37,9 +38,12 @@ public class SimplifyConditionalFunction implements ExpressionPatternRuleFactory @Override public List> buildRules() { return ImmutableList.of( - matchesType(Coalesce.class).then(SimplifyConditionalFunction::rewriteCoalesce), - matchesType(Nvl.class).then(SimplifyConditionalFunction::rewriteNvl), + matchesType(Coalesce.class).then(SimplifyConditionalFunction::rewriteCoalesce) + .toRule(ExpressionRuleType.SIMPLIFY_CONDITIONAL_FUNCTION), + matchesType(Nvl.class).then(SimplifyConditionalFunction::rewriteNvl) + .toRule(ExpressionRuleType.SIMPLIFY_CONDITIONAL_FUNCTION), matchesType(NullIf.class).then(SimplifyConditionalFunction::rewriteNullIf) + .toRule(ExpressionRuleType.SIMPLIFY_CONDITIONAL_FUNCTION) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java index bf1b194a6ac7f7..70a964929e22d2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.InPredicate; @@ -40,6 +41,7 @@ public class SimplifyInPredicate implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(InPredicate.class).then(SimplifyInPredicate::simplify) + .toRule(ExpressionRuleType.SIMPLIFY_IN_PREDICATE) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java index 92ea5ddfd5c9ed..413966514f693b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; import org.apache.doris.nereids.trees.expressions.CompoundPredicate; import org.apache.doris.nereids.trees.expressions.Expression; @@ -55,6 +56,7 @@ public class SimplifyNotExprRule implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesType(Not.class).then(SimplifyNotExprRule::simplify) + .toRule(ExpressionRuleType.SIMPLIFY_NOT_EXPR) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java index 4666342943a85c..576ef6bbf4d5df 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java @@ -20,6 +20,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.rules.expression.rules.RangeInference.DiscreteValue; import org.apache.doris.nereids.rules.expression.rules.RangeInference.EmptyValue; import org.apache.doris.nereids.rules.expression.rules.RangeInference.RangeValue; @@ -76,6 +77,7 @@ public List> buildRules() { return ImmutableList.of( matchesTopType(CompoundPredicate.class) .thenApply(ctx -> rewrite(ctx.expr, ctx.rewriteContext)) + .toRule(ExpressionRuleType.SIMPLIFY_RANGE) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java index f5b442a3989cd5..fbf59ab624b8bd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.scalar.DateFormat; import org.apache.doris.nereids.trees.expressions.functions.scalar.FromUnixtime; @@ -38,9 +39,12 @@ public class SupportJavaDateFormatter implements ExpressionPatternRuleFactory { @Override public List> buildRules() { return ImmutableList.of( - matchesType(DateFormat.class).then(SupportJavaDateFormatter::rewriteDateFormat), - matchesType(FromUnixtime.class).then(SupportJavaDateFormatter::rewriteFromUnixtime), + matchesType(DateFormat.class).then(SupportJavaDateFormatter::rewriteDateFormat) + .toRule(ExpressionRuleType.SUPPORT_JAVA_DATE_FORMATTER), + matchesType(FromUnixtime.class).then(SupportJavaDateFormatter::rewriteFromUnixtime) + .toRule(ExpressionRuleType.SUPPORT_JAVA_DATE_FORMATTER), matchesType(UnixTimestamp.class).then(SupportJavaDateFormatter::rewriteUnixTimestamp) + .toRule(ExpressionRuleType.SUPPORT_JAVA_DATE_FORMATTER) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java index 318cb6ec6031af..972018b4244522 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java @@ -19,6 +19,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher; import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.agg.Max; import org.apache.doris.nereids.trees.expressions.functions.agg.TopN; @@ -39,6 +40,7 @@ public class TopnToMax implements ExpressionPatternRuleFactory { public List> buildRules() { return ImmutableList.of( matchesTopType(TopN.class).then(TopnToMax::rewrite) + .toRule(ExpressionRuleType.TOPN_TO_MAX) ); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java index 60c9da4bc6eec5..9dfe4e84faa6a7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java @@ -28,6 +28,7 @@ import org.apache.doris.nereids.rules.expression.ExpressionRewrite; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; import org.apache.doris.nereids.rules.expression.ExpressionRuleExecutor; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.expressions.ExprId; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.NamedExpression; @@ -125,7 +126,7 @@ public List> buildRules() { return slot.withExprId(newId); } return slot; - }) + }).toRule(ExpressionRuleType.EXPR_ID_REWRITE_REPLACE) ); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java index 4f7506e30dcbdd..18289a23bd4538 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java @@ -34,6 +34,7 @@ import org.apache.doris.nereids.metrics.EventSwitchParser; import org.apache.doris.nereids.parser.Dialect; import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.rules.expression.ExpressionRuleType; import org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableCommand; import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; @@ -332,6 +333,7 @@ public class SessionVariable implements Serializable, Writable { public static final String ENABLE_NEREIDS_DISTRIBUTE_PLANNER = "enable_nereids_distribute_planner"; public static final String DISABLE_NEREIDS_RULES = "disable_nereids_rules"; public static final String ENABLE_NEREIDS_RULES = "enable_nereids_rules"; + public static final String DISABLE_NEREIDS_EXPRESSION_RULES = "disable_nereids_expression_rules"; public static final String ENABLE_NEW_COST_MODEL = "enable_new_cost_model"; public static final String ENABLE_FALLBACK_TO_ORIGINAL_PLANNER = "enable_fallback_to_original_planner"; public static final String ENABLE_NEREIDS_TIMEOUT = "enable_nereids_timeout"; @@ -1438,6 +1440,12 @@ public void setEnableLeftZigZag(boolean enableLeftZigZag) { @VariableMgr.VarAttr(name = ENABLE_NEREIDS_RULES, needForward = true) public String enableNereidsRules = ""; + @VariableMgr.VarAttr(name = DISABLE_NEREIDS_EXPRESSION_RULES, needForward = true, + setter = "setDisableNereidsExpressionRules") + private String disableNereidsExpressionRules = ""; + + private BitSet disableNereidsExpressionRuleSet = new BitSet(); + @VariableMgr.VarAttr(name = ENABLE_NEW_COST_MODEL, needForward = true) private boolean enableNewCostModel = false; @@ -3653,6 +3661,10 @@ public Set getEnableNereidsRules() { .collect(ImmutableSet.toImmutableSet()); } + public BitSet getDisableNereidsExpressionRules() { + return disableNereidsExpressionRuleSet; + } + public void setEnableNewCostModel(boolean enable) { this.enableNewCostModel = enable; } @@ -3665,6 +3677,20 @@ public void setDisableNereidsRules(String disableNereidsRules) { this.disableNereidsRules = disableNereidsRules; } + public void setDisableNereidsExpressionRules(String disableNereidsExpressionRules) { + BitSet bitSet = new BitSet(); + for (String ruleName : disableNereidsExpressionRules.split(",")) { + ruleName = ruleName.trim().toUpperCase(Locale.ROOT); + if (ruleName.isEmpty()) { + continue; + } + ExpressionRuleType ruleType = ExpressionRuleType.valueOf(ruleName); + bitSet.set(ruleType.type()); + } + this.disableNereidsExpressionRuleSet = bitSet; + this.disableNereidsExpressionRules = disableNereidsExpressionRules; + } + public double getNereidsCboPenaltyFactor() { return nereidsCboPenaltyFactor; } diff --git a/regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out b/regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out new file mode 100644 index 00000000000000..a9cf8afc2e5cc1 --- /dev/null +++ b/regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out @@ -0,0 +1,10 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !shape_1 -- +PhysicalResultSink +--PhysicalEmptyRelation + +-- !shape_2 -- +PhysicalResultSink +--filter((cast(a as DECIMALV3(11, 1)) = 1.1)) +----PhysicalOlapScan[test_disable_nereids_expression_rule_tbl] + diff --git a/regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy b/regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy new file mode 100644 index 00000000000000..fda16071e16a45 --- /dev/null +++ b/regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy @@ -0,0 +1,28 @@ +// 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. + +suite('test_disable_nereids_expression_rule') { + def tbl = 'test_disable_nereids_expression_rule_tbl' + sql "DROP TABLE IF EXISTS ${tbl}" + sql "CREATE TABLE ${tbl}(a INT) PROPERTIES('replication_num' = '1')" + sql "INSERT INTO ${tbl} VALUES(10)" + sql "SET enable_parallel_result_sink=true" + qt_shape_1 "EXPLAIN SHAPE PLAN SELECT * FROM ${tbl} WHERE a = 1.1" + sql "SET disable_nereids_expression_rules='SIMPLIFY_COMPARISON_PREDICATE'" + qt_shape_2 "EXPLAIN SHAPE PLAN SELECT * FROM ${tbl} WHERE a = 1.1" + sql "DROP TABLE IF EXISTS ${tbl}" +}