This is an automated email from the ASF dual-hosted git repository. huajianlan 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 69bfbae856 [enhancement](nereids) Normalize expressions before performing plan rewriting (#11299) 69bfbae856 is described below commit 69bfbae856ef2219ac31c01b4a49f40680293419 Author: Adonis Ling <adonis0...@gmail.com> AuthorDate: Mon Aug 1 17:15:04 2022 +0800 [enhancement](nereids) Normalize expressions before performing plan rewriting (#11299) Rules for normalizing expressions should be applied once before do some extra expression transforms. Normalization rules include: 1. NormalizeBinaryPredicatesRule 2. BetweenToCompoundRule 3. SimplifyNotExprRule --- .../org/apache/doris/nereids/NereidsPlanner.java | 2 ++ .../batch/NormalizeExpressionRulesJob.java} | 33 ++++++++++++---------- .../java/org/apache/doris/nereids/memo/Memo.java | 2 +- ...ionOfPlan.java => ExpressionNormalization.java} | 8 ++++-- ...sionOfPlan.java => ExpressionOptimization.java} | 6 ++-- ...onOfPlanRewrite.java => ExpressionRewrite.java} | 4 +-- .../expression/rewrite/ExpressionRuleExecutor.java | 15 ---------- .../rewrite/logical/PushPredicateThroughJoin.java | 6 ++-- .../apache/doris/nereids/trees/TernaryNode.java | 2 +- .../trees/expressions/BinaryExpression.java | 11 -------- .../trees/expressions/TernaryExpression.java | 13 --------- .../nereids/trees/expressions/UnaryExpression.java | 5 ---- .../rewrite/logical/PushDownPredicateTest.java | 4 ++- 13 files changed, 36 insertions(+), 75 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index 3ccb0615d1..57f4e267ee 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -27,6 +27,7 @@ import org.apache.doris.nereids.glue.translator.PhysicalPlanTranslator; import org.apache.doris.nereids.glue.translator.PlanTranslatorContext; import org.apache.doris.nereids.jobs.batch.DisassembleRulesJob; import org.apache.doris.nereids.jobs.batch.JoinReorderRulesJob; +import org.apache.doris.nereids.jobs.batch.NormalizeExpressionRulesJob; import org.apache.doris.nereids.jobs.batch.OptimizeRulesJob; import org.apache.doris.nereids.jobs.batch.PredicatePushDownRulesJob; import org.apache.doris.nereids.jobs.cascades.DeriveStatsJob; @@ -120,6 +121,7 @@ public class NereidsPlanner extends Planner { * Logical plan rewrite based on a series of heuristic rules. */ private void rewrite() { + new NormalizeExpressionRulesJob(plannerContext).execute(); new JoinReorderRulesJob(plannerContext).execute(); new PredicatePushDownRulesJob(plannerContext).execute(); new DisassembleRulesJob(plannerContext).execute(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NormalizeExpressionRulesJob.java similarity index 54% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NormalizeExpressionRulesJob.java index c5a86c5541..0e7c1b9549 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NormalizeExpressionRulesJob.java @@ -15,25 +15,28 @@ // specific language governing permissions and limitations // under the License. -package org.apache.doris.nereids.trees.expressions; +package org.apache.doris.nereids.jobs.batch; -import org.apache.doris.nereids.trees.TernaryNode; +import org.apache.doris.nereids.PlannerContext; +import org.apache.doris.nereids.rules.expression.rewrite.ExpressionNormalization; + +import com.google.common.collect.ImmutableList; /** - * Interface for all expression that have three children. + * Apply rules to normalize expressions. */ -public interface TernaryExpression extends TernaryNode<Expression, Expression, Expression, Expression> { - - - default Expression first() { - return child(0); - } - - default Expression second() { - return child(1); - } +public class NormalizeExpressionRulesJob extends BatchRulesJob { - default Expression third() { - return child(2); + /** + * Constructor. + * @param plannerContext context for applying rules. + */ + public NormalizeExpressionRulesJob(PlannerContext plannerContext) { + super(plannerContext); + rulesJob.addAll(ImmutableList.of( + topDownBatch(ImmutableList.of( + new ExpressionNormalization() + )) + )); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java index 16d02e8fa9..6f13bb7fa2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java @@ -247,7 +247,7 @@ public class Memo { private Plan replaceChildrenToGroupPlan(Plan plan, List<Group> childrenGroups) { List<Plan> groupPlanChildren = childrenGroups.stream() - .map(group -> new GroupPlan(group)) + .map(GroupPlan::new) .collect(ImmutableList.toImmutableList()); LogicalProperties logicalProperties = plan.getLogicalProperties(); return plan.withChildren(groupPlanChildren) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/NormalizeExpressionOfPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionNormalization.java similarity index 84% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/NormalizeExpressionOfPlan.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionNormalization.java index 44970483f9..3cd9357325 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/NormalizeExpressionOfPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionNormalization.java @@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rewrite; import org.apache.doris.nereids.rules.expression.rewrite.rules.BetweenToCompoundRule; import org.apache.doris.nereids.rules.expression.rewrite.rules.NormalizeBinaryPredicatesRule; +import org.apache.doris.nereids.rules.expression.rewrite.rules.SimplifyNotExprRule; import com.google.common.collect.ImmutableList; @@ -27,15 +28,16 @@ import java.util.List; /** * normalize expression of plan rule set. */ -public class NormalizeExpressionOfPlan extends ExpressionOfPlanRewrite { +public class ExpressionNormalization extends ExpressionRewrite { public static final List<ExpressionRewriteRule> NORMALIZE_REWRITE_RULES = ImmutableList.of( NormalizeBinaryPredicatesRule.INSTANCE, - BetweenToCompoundRule.INSTANCE + BetweenToCompoundRule.INSTANCE, + SimplifyNotExprRule.INSTANCE ); private static final ExpressionRuleExecutor EXECUTOR = new ExpressionRuleExecutor(NORMALIZE_REWRITE_RULES); - public NormalizeExpressionOfPlan() { + public ExpressionNormalization() { super(EXECUTOR); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/OptimizeExpressionOfPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionOptimization.java similarity index 86% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/OptimizeExpressionOfPlan.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionOptimization.java index 44bb3ed06e..be0e7f0763 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/OptimizeExpressionOfPlan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionOptimization.java @@ -19,7 +19,6 @@ package org.apache.doris.nereids.rules.expression.rewrite; import org.apache.doris.nereids.rules.expression.rewrite.rules.DistinctPredicatesRule; import org.apache.doris.nereids.rules.expression.rewrite.rules.ExtractCommonFactorRule; -import org.apache.doris.nereids.rules.expression.rewrite.rules.SimplifyNotExprRule; import com.google.common.collect.ImmutableList; @@ -28,14 +27,13 @@ import java.util.List; /** * optimize expression of plan rule set. */ -public class OptimizeExpressionOfPlan extends ExpressionOfPlanRewrite { +public class ExpressionOptimization extends ExpressionRewrite { public static final List<ExpressionRewriteRule> OPTIMIZE_REWRITE_RULES = ImmutableList.of( - SimplifyNotExprRule.INSTANCE, ExtractCommonFactorRule.INSTANCE, DistinctPredicatesRule.INSTANCE); private static final ExpressionRuleExecutor EXECUTOR = new ExpressionRuleExecutor(OPTIMIZE_REWRITE_RULES); - public OptimizeExpressionOfPlan() { + public ExpressionOptimization() { super(EXECUTOR); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionOfPlanRewrite.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java similarity index 97% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionOfPlanRewrite.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java index aaf1cc60ff..b285eaa2fa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionOfPlanRewrite.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRewrite.java @@ -38,10 +38,10 @@ import java.util.stream.Collectors; /** * expression of plan rewrite rule. */ -public class ExpressionOfPlanRewrite implements RewriteRuleFactory { +public class ExpressionRewrite implements RewriteRuleFactory { private final ExpressionRuleExecutor rewriter; - public ExpressionOfPlanRewrite(ExpressionRuleExecutor rewriter) { + public ExpressionRewrite(ExpressionRuleExecutor rewriter) { this.rewriter = Objects.requireNonNull(rewriter, "rewriter is null"); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java index d2e66a2c3e..1e38dcd2bd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/ExpressionRuleExecutor.java @@ -17,12 +17,8 @@ package org.apache.doris.nereids.rules.expression.rewrite; -import org.apache.doris.nereids.rules.expression.rewrite.rules.BetweenToCompoundRule; -import org.apache.doris.nereids.rules.expression.rewrite.rules.NormalizeBinaryPredicatesRule; -import org.apache.doris.nereids.rules.expression.rewrite.rules.SimplifyNotExprRule; import org.apache.doris.nereids.trees.expressions.Expression; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import java.util.List; @@ -33,20 +29,9 @@ import java.util.stream.Collectors; */ public class ExpressionRuleExecutor { - public static final List<ExpressionRewriteRule> REWRITE_RULES = ImmutableList.of( - new BetweenToCompoundRule(), - new SimplifyNotExprRule(), - new NormalizeBinaryPredicatesRule() - ); - private final ExpressionRewriteContext ctx; private final List<ExpressionRewriteRule> rules; - public ExpressionRuleExecutor() { - this.rules = REWRITE_RULES; - this.ctx = new ExpressionRewriteContext(); - } - public ExpressionRuleExecutor(List<ExpressionRewriteRule> rules) { this.rules = rules; this.ctx = new ExpressionRewriteContext(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java index 0b79ea062c..5fff975229 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java @@ -19,7 +19,6 @@ package org.apache.doris.nereids.rules.rewrite.logical; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; -import org.apache.doris.nereids.rules.expression.rewrite.ExpressionRuleExecutor; import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory; import org.apache.doris.nereids.trees.expressions.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; @@ -122,15 +121,14 @@ public class PushPredicateThroughJoin extends OneRewriteRuleFactory { Expression left = ExpressionUtils.and(leftPredicates); Expression right = ExpressionUtils.and(rightPredicates); //todo expr should optimize again using expr rewrite - ExpressionRuleExecutor exprRewriter = new ExpressionRuleExecutor(); Plan leftPlan = joinPlan.left(); Plan rightPlan = joinPlan.right(); if (!left.equals(BooleanLiteral.TRUE)) { - leftPlan = new LogicalFilter(exprRewriter.rewrite(left), leftPlan); + leftPlan = new LogicalFilter(left, leftPlan); } if (!right.equals(BooleanLiteral.TRUE)) { - rightPlan = new LogicalFilter(exprRewriter.rewrite(right), rightPlan); + rightPlan = new LogicalFilter(right, rightPlan); } return new LogicalJoin<>(joinPlan.getJoinType(), Optional.of(joinConditions), leftPlan, rightPlan); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/TernaryNode.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/TernaryNode.java index d598d604cd..d1c74a8204 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/TernaryNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/TernaryNode.java @@ -18,7 +18,7 @@ package org.apache.doris.nereids.trees; /** - * interface for all tree node that have two children. + * interface for all tree node that have three children. */ public interface TernaryNode< NODE_TYPE extends TreeNode<NODE_TYPE>, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java index ccf9ea9b61..8965e36b6f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryExpression.java @@ -23,15 +23,4 @@ import org.apache.doris.nereids.trees.BinaryNode; * Interface for all expression that have two children. */ public interface BinaryExpression extends BinaryNode<Expression, Expression, Expression> { - - @Override - default Expression left() { - return child(0); - } - - @Override - default Expression right() { - return child(1); - } - } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java index c5a86c5541..bea2644e54 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TernaryExpression.java @@ -23,17 +23,4 @@ import org.apache.doris.nereids.trees.TernaryNode; * Interface for all expression that have three children. */ public interface TernaryExpression extends TernaryNode<Expression, Expression, Expression, Expression> { - - - default Expression first() { - return child(0); - } - - default Expression second() { - return child(1); - } - - default Expression third() { - return child(2); - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java index eca639d13c..ba37beee60 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/UnaryExpression.java @@ -23,9 +23,4 @@ import org.apache.doris.nereids.trees.UnaryNode; * Abstract class for all expression that have one child. */ public interface UnaryExpression extends UnaryNode<Expression, Expression> { - - @Override - default Expression child() { - return child(0); - } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushDownPredicateTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushDownPredicateTest.java index 7a81d1f9a2..c5525add55 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushDownPredicateTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushDownPredicateTest.java @@ -23,6 +23,7 @@ import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Type; import org.apache.doris.nereids.memo.Group; import org.apache.doris.nereids.memo.Memo; +import org.apache.doris.nereids.rules.expression.rewrite.ExpressionNormalization; import org.apache.doris.nereids.trees.expressions.Add; import org.apache.doris.nereids.trees.expressions.And; import org.apache.doris.nereids.trees.expressions.Between; @@ -242,6 +243,7 @@ public class PushDownPredicateTest { } private Memo rewrite(Plan plan) { - return PlanRewriter.topDownRewriteMemo(plan, new ConnectContext(), new PushPredicateThroughJoin()); + Plan normalizedPlan = PlanRewriter.topDownRewrite(plan, new ConnectContext(), new ExpressionNormalization()); + return PlanRewriter.topDownRewriteMemo(normalizedPlan, new ConnectContext(), new PushPredicateThroughJoin()); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org