This is an automated email from the ASF dual-hosted git repository. englefly 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 25cd9559652 [feat](nereids) add session variable disable_nereids_expression_rules (#44831) 25cd9559652 is described below commit 25cd9559652d0a9715db138687d1264ccf4045e9 Author: yujun <yu...@selectdb.com> AuthorDate: Tue Dec 31 16:21:39 2024 +0800 [feat](nereids) add session variable disable_nereids_expression_rules (#44831) ### What problem does this PR solve? Issue Number: close #xxx Related PR: #xxx Problem Summary: Add session variable test_disable_nereids_expression_rule for disable expression rule, example: ```sql SET disable_nereids_expression_rules='SIMPLIFY_COMPARISON_PREDICATE' ``` for a expression rule `ExpressionPatternMatcher`, its has default rule type: ANONYMOUS. when it calls `toRule(ruleTypeXX)` will create a rule with type: ruleTypeXX. --- .../nereids/pattern/ExpressionPatternRules.java | 12 +++-- .../expression/ExpressionPatternMatchRule.java | 6 +++ .../rules/expression/ExpressionPatternMatcher.java | 5 +- .../expression/ExpressionPatternRuleFactory.java | 21 +++++--- .../rules/expression/ExpressionRuleType.java | 59 ++++++++++++++++++++++ .../nereids/rules/expression/check/CheckCast.java | 3 +- .../nereids/rules/expression/rules/AddMinMax.java | 2 + .../rules/ArrayContainToArrayOverlap.java | 2 + .../rules/expression/rules/BetweenToEqual.java | 2 + .../rules/expression/rules/CaseWhenToIf.java | 2 + .../expression/rules/ConvertAggStateCast.java | 2 + .../expression/rules/DateFunctionRewrite.java | 14 +++-- .../expression/rules/DigitalMaskingConvert.java | 5 +- .../expression/rules/DistinctPredicatesRule.java | 2 + .../expression/rules/ExtractCommonFactorRule.java | 2 + .../expression/rules/FoldConstantRuleOnBE.java | 2 + .../expression/rules/FoldConstantRuleOnFE.java | 4 +- .../rules/expression/rules/InPredicateDedup.java | 2 + .../expression/rules/InPredicateToEqualToRule.java | 5 +- .../rules/expression/rules/LikeToEqualRewrite.java | 2 + .../rules/expression/rules/MergeDateTrunc.java | 2 + .../rules/NormalizeBinaryPredicatesRule.java | 2 + .../expression/rules/NullSafeEqualToEqual.java | 2 + .../nereids/rules/expression/rules/OrToIn.java | 2 + .../expression/rules/ReplaceVariableByLiteral.java | 3 +- .../rules/SimplifyArithmeticComparisonRule.java | 2 + .../expression/rules/SimplifyArithmeticRule.java | 2 + .../rules/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 + .../expression/rules/SupportJavaDateFormatter.java | 8 ++- .../nereids/rules/expression/rules/TopnToMax.java | 2 + .../nereids/rules/rewrite/ExprIdRewriter.java | 3 +- .../java/org/apache/doris/qe/SessionVariable.java | 26 ++++++++++ .../test_disable_nereids_expression_rule.out | 10 ++++ .../test_disable_nereids_expression_rule.groovy | 28 ++++++++++ 39 files changed, 237 insertions(+), 27 deletions(-) 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 523540e6435..339c082dbd2 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.LogManager; 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 class ExpressionPatternRules extends TypeMappings<Expression, ExpressionP List<ExpressionPatternMatchRule> rules = singleMappings.get(expr.getClass()); ExpressionMatchingContext<Expression> 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 class ExpressionPatternRules extends TypeMappings<Expression, ExpressionP } 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 class ExpressionPatternRules extends TypeMappings<Expression, ExpressionP } 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 dbf5c79c96d..b794981f657 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 @@ import java.util.function.Predicate; /** ExpressionPatternMatcherRule */ public class ExpressionPatternMatchRule implements TypeMapping<Expression> { + public final ExpressionRuleType expressionRuleType; public final Class<? extends Expression> typePattern; public final List<Predicate<ExpressionMatchingContext<Expression>>> predicates; public final ExpressionMatchingAction<Expression> 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 class ExpressionPatternMatchRule implements TypeMapping<Expression> { public Class<? extends Expression> 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 058b1d60b1d..0815060724e 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 @@ import java.util.function.Predicate; /** ExpressionPattern */ public class ExpressionPatternMatcher<E extends Expression> { + + public final ExpressionRuleType expressionRuleType; public final Class<E> typePattern; public final List<Predicate<ExpressionMatchingContext<E>>> predicates; public final ExpressionMatchingAction<E> matchingAction; - public ExpressionPatternMatcher(Class<E> typePattern, + public ExpressionPatternMatcher(ExpressionRuleType expressionRuleType, Class<E> typePattern, List<Predicate<ExpressionMatchingContext<E>>> predicates, ExpressionMatchingAction<E> 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 7fb18735ba5..635f8e0db7d 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 @@ public interface ExpressionPatternRuleFactory { class ExpressionPatternDescriptor<E extends Expression> { private final Class<E> typePattern; private final ImmutableList<Predicate<ExpressionMatchingContext<E>>> predicates; + private final ExpressionMatchingAction<E> matchingAction; public ExpressionPatternDescriptor(Class<E> typePattern) { - this(typePattern, ImmutableList.of()); + this(typePattern, ImmutableList.of(), ctx -> ctx.expr); } public ExpressionPatternDescriptor( - Class<E> typePattern, ImmutableList<Predicate<ExpressionMatchingContext<E>>> predicates) { + Class<E> typePattern, ImmutableList<Predicate<ExpressionMatchingContext<E>>> predicates, + ExpressionMatchingAction<E> 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<E> when(Predicate<E> predicate) { @@ -68,17 +71,21 @@ public interface ExpressionPatternRuleFactory { = ImmutableList.builderWithExpectedSize(predicates.size() + 1); newPredicates.addAll(predicates); newPredicates.add(predicate); - return new ExpressionPatternDescriptor<>(typePattern, newPredicates.build()); + return new ExpressionPatternDescriptor<>(typePattern, newPredicates.build(), ctx -> ctx.expr); } /** then */ - public ExpressionPatternMatcher<E> then(Function<E, Expression> rewriter) { - return new ExpressionPatternMatcher<>( + public ExpressionPatternDescriptor<E> then(Function<E, Expression> rewriter) { + return new ExpressionPatternDescriptor<>( typePattern, predicates, (context) -> rewriter.apply(context.expr)); } - public ExpressionPatternMatcher<E> thenApply(ExpressionMatchingAction<E> action) { - return new ExpressionPatternMatcher<>(typePattern, predicates, action); + public ExpressionPatternDescriptor<E> thenApply(ExpressionMatchingAction<E> action) { + return new ExpressionPatternDescriptor<>(typePattern, predicates, action); + } + + public ExpressionPatternMatcher<E> 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 00000000000..d8919d1eaed --- /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 e76d7ef344d..e3ede36da19 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 @@ package org.apache.doris.nereids.rules.expression.check; 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<ExpressionPatternMatcher<? extends Expression>> 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 c1efb82bac6..80d245c3780 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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 class AddMinMax implements ExpressionPatternRuleFactory { 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 f32d76062aa..93e7873638d 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 d1279fdfda5..9d9eda0a3fd 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 cafb0ecd068..17d6c6fa675 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 6d5a70139ab..28f6cc51365 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 07ec0c3de71..deba786d44c 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 95d25e3c592..d9cfee2b407 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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 class DigitalMaskingConvert implements ExpressionPatternRuleFactory { 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 cf18886cd85..83d7be34fac 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 d79fafa80a7..9ad42d1b379 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 dd79de70e26..21a0d1d59c8 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.glue.translator.ExpressionTranslator; 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 class FoldConstantRuleOnBE implements ExpressionPatternRuleFactory { .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 c2a73f7afec..c4dd18acaa2 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.ExpressionMatchingContext; 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 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule .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 3760dcf0e72..aaa822ac691 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 353de7f41f6..463393327a1 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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 class InPredicateToEqualToRule implements ExpressionPatternRuleFactory { 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 e2836204cdc..0e93b7ddc5a 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 892724cf893..f52ba41948d 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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 class MergeDateTrunc implements ExpressionPatternRuleFactory { 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 e73104793cd..433a43ba185 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 16c4663a1ed..6b3b53feb6b 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 af61bbdaddf..59b340478ce 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.ExpressionPatternMatcher; 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<ExpressionPatternMatcher<? extends Expression>> 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 74f41e17cac..e800bf790c5 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.SqlCacheContext; 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 class ReplaceVariableByLiteral implements ExpressionPatternRuleFactory { 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 863bfd18f45..853b5a3dfc9 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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 class SimplifyArithmeticComparisonRule implements ExpressionPatternRuleFa 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 b9fd91f6438..44d6505b003 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 cc044768056..8c3a5f21a30 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 1f435958202..e2bba0173b0 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.AbstractExpressionRewriteRule; 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<ExpressionPatternMatcher<? extends Expression>> 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 c1c6283e32d..6862e138ac9 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 bf1b194a6ac..70a964929e2 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 92ea5ddfd5c..413966514f6 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 4666342943a..576ef6bbf4d 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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 class SimplifyRange implements ExpressionPatternRuleFactory { 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 f5b442a3989..fbf59ab624b 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 318cb6ec603..972018b4244 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 @@ package org.apache.doris.nereids.rules.expression.rules; 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<ExpressionPatternMatcher<? extends Expression>> 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 60c9da4bc6e..9dfe4e84faa 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.ExpressionPatternRuleFactory; 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 class ExprIdRewriter extends ExpressionRewrite { 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 4f7506e30dc..18289a23bd4 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.Event; 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 class SessionVariable implements Serializable, Writable { @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 class SessionVariable implements Serializable, Writable { .collect(ImmutableSet.toImmutableSet()); } + public BitSet getDisableNereidsExpressionRules() { + return disableNereidsExpressionRuleSet; + } + public void setEnableNewCostModel(boolean enable) { this.enableNewCostModel = enable; } @@ -3665,6 +3677,20 @@ public class SessionVariable implements Serializable, Writable { 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 00000000000..a9cf8afc2e5 --- /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 00000000000..fda16071e16 --- /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}" +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org