[feature](Nereids): convert CrossJoin to InnerJoin. (#17681)
This commit is contained in:
@ -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(
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user