From db9692a114f7ee181ba4ed4588a677d1d95e50e9 Mon Sep 17 00:00:00 2001 From: jakevin Date: Sat, 11 Mar 2023 13:23:28 +0800 Subject: [PATCH] [feature](Nereids): convert CrossJoin to InnerJoin. (#17681) --- .../nereids/jobs/batch/NereidsRewriter.java | 4 +-- .../apache/doris/nereids/rules/RuleType.java | 1 + ...Join.java => ConvertInnerOrCrossJoin.java} | 25 ++++++++++++++----- .../rewrite/logical/PushdownLimitTest.java | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) rename fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/{InnerToCrossJoin.java => ConvertInnerOrCrossJoin.java} (61%) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java index c9ad180ba9..155a1cffa1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/batch/NereidsRewriter.java @@ -34,6 +34,7 @@ import org.apache.doris.nereids.rules.rewrite.logical.AdjustNullable; import org.apache.doris.nereids.rules.rewrite.logical.BuildAggForUnion; import org.apache.doris.nereids.rules.rewrite.logical.CheckAndStandardizeWindowFunctionAndFrame; import org.apache.doris.nereids.rules.rewrite.logical.ColumnPruning; +import org.apache.doris.nereids.rules.rewrite.logical.ConvertInnerOrCrossJoin; import org.apache.doris.nereids.rules.rewrite.logical.CountDistinctRewrite; import org.apache.doris.nereids.rules.rewrite.logical.EliminateAggregate; import org.apache.doris.nereids.rules.rewrite.logical.EliminateDedupJoinCondition; @@ -51,7 +52,6 @@ import org.apache.doris.nereids.rules.rewrite.logical.FindHashConditionForJoin; import org.apache.doris.nereids.rules.rewrite.logical.InferFilterNotNull; import org.apache.doris.nereids.rules.rewrite.logical.InferJoinNotNull; import org.apache.doris.nereids.rules.rewrite.logical.InferPredicates; -import org.apache.doris.nereids.rules.rewrite.logical.InnerToCrossJoin; import org.apache.doris.nereids.rules.rewrite.logical.MergeFilters; import org.apache.doris.nereids.rules.rewrite.logical.MergeProjects; import org.apache.doris.nereids.rules.rewrite.logical.MergeSetOperations; @@ -155,7 +155,7 @@ public class NereidsRewriter extends BatchRewriteJob { new ReorderJoin(), new PushFilterInsideJoin(), new FindHashConditionForJoin(), - new InnerToCrossJoin(), + new ConvertInnerOrCrossJoin(), new EliminateNullAwareLeftAntiJoin() ), topDown( diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java index c439a13ce5..f945327630 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java @@ -186,6 +186,7 @@ public enum RuleType { BUILD_AGG_FOR_UNION(RuleTypeClass.REWRITE), COUNT_DISTINCT_REWRITE(RuleTypeClass.REWRITE), INNER_TO_CROSS_JOIN(RuleTypeClass.REWRITE), + CROSS_TO_INNER_JOIN(RuleTypeClass.REWRITE), REWRITE_SENTINEL(RuleTypeClass.REWRITE), // split limit diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InnerToCrossJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ConvertInnerOrCrossJoin.java similarity index 61% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InnerToCrossJoin.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ConvertInnerOrCrossJoin.java index 1a041680f4..7b0bc4b1ff 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InnerToCrossJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ConvertInnerOrCrossJoin.java @@ -19,19 +19,32 @@ 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.rewrite.OneRewriteRuleFactory; +import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory; import org.apache.doris.nereids.trees.plans.JoinType; +import com.google.common.collect.ImmutableList; + +import java.util.List; + /** * Convert invalid inner join to cross join. * Like: A inner join B on true -> A cross join B on true; + * Or + * Convert invalid cross join to inner join. + * Like: A cross join B on A.id > 1 -> A inner join B on A.id > 1; */ -public class InnerToCrossJoin extends OneRewriteRuleFactory { +public class ConvertInnerOrCrossJoin implements RewriteRuleFactory { @Override - public Rule build() { - return innerLogicalJoin() - .when(join -> join.getHashJoinConjuncts().size() == 0) + public List buildRules() { + return ImmutableList.of( + innerLogicalJoin() + .when(join -> join.getHashJoinConjuncts().size() == 0 && join.getOtherJoinConjuncts().size() == 0) .then(join -> join.withJoinType(JoinType.CROSS_JOIN)) - .toRule(RuleType.INNER_TO_CROSS_JOIN); + .toRule(RuleType.INNER_TO_CROSS_JOIN), + crossLogicalJoin() + .when(join -> join.getHashJoinConjuncts().size() != 0 || join.getOtherJoinConjuncts().size() != 0) + .then(join -> join.withJoinType(JoinType.INNER_JOIN)) + .toRule(RuleType.CROSS_TO_INNER_JOIN) + ); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownLimitTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownLimitTest.java index 57e38b32d1..8926f7f3a3 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownLimitTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownLimitTest.java @@ -251,7 +251,7 @@ class PushdownLimitTest extends TestWithFeService implements MemoPatternMatchSup Plan plan = generatePlan(joinType, hasProject); PlanChecker.from(MemoTestUtils.createConnectContext()) .analyze(plan) - .applyTopDown(new InnerToCrossJoin()) + .applyTopDown(new ConvertInnerOrCrossJoin()) .applyTopDown(new PushdownLimit()) .matchesFromRoot(pattern); }