[feature](Nereids): convert CrossJoin to InnerJoin. (#17681)

This commit is contained in:
jakevin
2023-03-11 13:23:28 +08:00
committed by GitHub
parent 9c7854f1ff
commit db9692a114
4 changed files with 23 additions and 9 deletions

View File

@ -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(

View File

@ -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

View File

@ -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<Rule> 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)
);
}
}

View File

@ -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);
}