This is an automated email from the ASF dual-hosted git repository. jakevin 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 0f6dbb5769 [fix](Nereids): split INNER and OUTER into different rules. (#12646) 0f6dbb5769 is described below commit 0f6dbb5769d3021eacc1175a4a419786ed6e04aa Author: jakevin <jakevin...@gmail.com> AuthorDate: Fri Sep 16 10:34:42 2022 +0800 [fix](Nereids): split INNER and OUTER into different rules. (#12646) --- .../org/apache/doris/nereids/rules/RuleSet.java | 34 ++++++------ .../org/apache/doris/nereids/rules/RuleType.java | 7 +-- .../{JoinLAsscom.java => InnerJoinLAsscom.java} | 37 ++----------- ...omProject.java => InnerJoinLAsscomProject.java} | 38 ++------------ .../rules/exploration/join/JoinExchange.java | 60 ---------------------- .../rules/exploration/join/JoinLAsscomHelper.java | 35 +++++-------- .../rules/exploration/join/JoinReorderCommon.java | 25 --------- .../{JoinLAsscom.java => OuterJoinLAsscom.java} | 43 ++++++---------- ...omProject.java => OuterJoinLAsscomProject.java} | 37 +++---------- .../join/SemiJoinSemiJoinTranspose.java | 4 +- ...tTest.java => InnerJoinLAsscomProjectTest.java} | 4 +- ...nLAsscomTest.java => InnerJoinLAsscomTest.java} | 6 +-- .../rules/exploration/join/JoinCommuteTest.java | 20 +++----- 13 files changed, 79 insertions(+), 271 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java index 7f11734e1f..410936f456 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java @@ -17,10 +17,12 @@ package org.apache.doris.nereids.rules; +import org.apache.doris.nereids.rules.exploration.join.InnerJoinLAsscom; +import org.apache.doris.nereids.rules.exploration.join.InnerJoinLAsscomProject; import org.apache.doris.nereids.rules.exploration.join.JoinCommute; import org.apache.doris.nereids.rules.exploration.join.JoinCommuteProject; -import org.apache.doris.nereids.rules.exploration.join.JoinLAsscom; -import org.apache.doris.nereids.rules.exploration.join.JoinLAsscomProject; +import org.apache.doris.nereids.rules.exploration.join.OuterJoinLAsscom; +import org.apache.doris.nereids.rules.exploration.join.OuterJoinLAsscomProject; import org.apache.doris.nereids.rules.exploration.join.SemiJoinLogicalJoinTranspose; import org.apache.doris.nereids.rules.exploration.join.SemiJoinLogicalJoinTransposeProject; import org.apache.doris.nereids.rules.exploration.join.SemiJoinSemiJoinTranspose; @@ -56,8 +58,10 @@ public class RuleSet { public static final List<Rule> EXPLORATION_RULES = planRuleFactories() .add(JoinCommute.LEFT_DEEP) .add(JoinCommuteProject.LEFT_DEEP) - .add(JoinLAsscom.INNER) - .add(JoinLAsscomProject.INNER) + .add(InnerJoinLAsscom.INSTANCE) + .add(InnerJoinLAsscomProject.INSTANCE) + .add(OuterJoinLAsscom.INSTANCE) + .add(OuterJoinLAsscomProject.INSTANCE) .add(SemiJoinLogicalJoinTranspose.LEFT_DEEP) .add(SemiJoinLogicalJoinTransposeProject.LEFT_DEEP) .add(SemiJoinSemiJoinTranspose.INSTANCE) @@ -90,20 +94,20 @@ public class RuleSet { .build(); public static final List<Rule> LEFT_DEEP_TREE_JOIN_REORDER = planRuleFactories() - .add(JoinCommute.LEFT_DEEP) - .add(JoinLAsscom.INNER) - .add(JoinLAsscomProject.INNER) - .add(JoinLAsscom.OUTER) - .add(JoinLAsscomProject.OUTER) + // .add(JoinCommute.LEFT_DEEP) + // .add(JoinLAsscom.INNER) + // .add(JoinLAsscomProject.INNER) + // .add(JoinLAsscom.OUTER) + // .add(JoinLAsscomProject.OUTER) // semi join Transpose .... .build(); public static final List<Rule> ZIG_ZAG_TREE_JOIN_REORDER = planRuleFactories() - .add(JoinCommute.ZIG_ZAG) - .add(JoinLAsscom.INNER) - .add(JoinLAsscomProject.INNER) - .add(JoinLAsscom.OUTER) - .add(JoinLAsscomProject.OUTER) + // .add(JoinCommute.ZIG_ZAG) + // .add(JoinLAsscom.INNER) + // .add(JoinLAsscomProject.INNER) + // .add(JoinLAsscom.OUTER) + // .add(JoinLAsscomProject.OUTER) // semi join Transpose .... .build(); @@ -119,7 +123,7 @@ public class RuleSet { // .add(JoinExchangeLeftProject.INNER) // .add(JoinExchangeRightProject.INNER) // .add(JoinRightAssociate.OUTER) - .add(JoinLAsscom.OUTER) + // .add(JoinLAsscom.OUTER) // semi join Transpose .... .build(); 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 c40419dfea..3fa98e3337 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 @@ -120,9 +120,10 @@ public enum RuleType { TEST_EXPLORATION(RuleTypeClass.EXPLORATION), LOGICAL_JOIN_COMMUTATE(RuleTypeClass.EXPLORATION), LOGICAL_LEFT_JOIN_ASSOCIATIVE(RuleTypeClass.EXPLORATION), - LOGICAL_JOIN_L_ASSCOM(RuleTypeClass.EXPLORATION), - LOGICAL_JOIN_L_ASSCOM_PROJECT(RuleTypeClass.EXPLORATION), - LOGICAL_JOIN_EXCHANGE(RuleTypeClass.EXPLORATION), + LOGICAL_INNER_JOIN_LASSCOM(RuleTypeClass.EXPLORATION), + LOGICAL_INNER_JOIN_LASSCOM_PROJECT(RuleTypeClass.EXPLORATION), + LOGICAL_OUTER_JOIN_LASSCOM(RuleTypeClass.EXPLORATION), + LOGICAL_OUTER_JOIN_LASSCOM_PROJECT(RuleTypeClass.EXPLORATION), LOGICAL_SEMI_JOIN_LOGICAL_JOIN_TRANSPOSE(RuleTypeClass.EXPLORATION), LOGICAL_SEMI_JOIN_LOGICAL_JOIN_TRANSPOSE_PROJECT(RuleTypeClass.EXPLORATION), LOGICAL_SEMI_JOIN_SEMI_JOIN_TRANPOSE(RuleTypeClass.EXPLORATION), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscom.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java similarity index 55% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscom.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java index 07d8acaceb..9286ba33f7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscom.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java @@ -17,41 +17,15 @@ package org.apache.doris.nereids.rules.exploration.join; -import org.apache.doris.common.Pair; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory; -import org.apache.doris.nereids.rules.exploration.join.JoinReorderCommon.Type; -import org.apache.doris.nereids.trees.plans.GroupPlan; -import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; - -import java.util.function.Predicate; /** * Rule for change inner join LAsscom (associative and commutive). */ -public class JoinLAsscom extends OneExplorationRuleFactory { - // for inner-inner - public static final JoinLAsscom INNER = new JoinLAsscom(Type.INNER); - // for inner-leftOuter or leftOuter-leftOuter - public static final JoinLAsscom OUTER = new JoinLAsscom(Type.OUTER); - - private final Predicate<LogicalJoin<LogicalJoin<GroupPlan, GroupPlan>, GroupPlan>> typeChecker; - - private final Type type; - - /** - * Specify join type. - */ - public JoinLAsscom(Type type) { - this.type = type; - if (type == Type.INNER) { - typeChecker = join -> join.getJoinType().isInnerJoin() && join.left().getJoinType().isInnerJoin(); - } else { - typeChecker = join -> JoinLAsscomHelper.outerSet.contains( - Pair.of(join.left().getJoinType(), join.getJoinType())); - } - } +public class InnerJoinLAsscom extends OneExplorationRuleFactory { + public static final InnerJoinLAsscom INSTANCE = new InnerJoinLAsscom(); /* * topJoin newTopJoin @@ -62,15 +36,14 @@ public class JoinLAsscom extends OneExplorationRuleFactory { */ @Override public Rule build() { - return logicalJoin(logicalJoin(), group()) - .when(topJoin -> JoinLAsscomHelper.check(type, topJoin, topJoin.left())) - .when(typeChecker) + return innerLogicalJoin(innerLogicalJoin(), group()) + .when(topJoin -> JoinLAsscomHelper.checkInner(topJoin, topJoin.left())) .then(topJoin -> { JoinLAsscomHelper helper = new JoinLAsscomHelper(topJoin, topJoin.left()); if (!helper.initJoinOnCondition()) { return null; } return helper.newTopJoin(); - }).toRule(RuleType.LOGICAL_JOIN_L_ASSCOM); + }).toRule(RuleType.LOGICAL_INNER_JOIN_LASSCOM); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java similarity index 55% copy from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProject.java copy to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java index 8c45afaa04..50e4858b72 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java @@ -17,42 +17,15 @@ package org.apache.doris.nereids.rules.exploration.join; -import org.apache.doris.common.Pair; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory; -import org.apache.doris.nereids.rules.exploration.join.JoinReorderCommon.Type; -import org.apache.doris.nereids.trees.plans.GroupPlan; -import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; -import org.apache.doris.nereids.trees.plans.logical.LogicalProject; - -import java.util.function.Predicate; /** * Rule for change inner join LAsscom (associative and commutive). */ -public class JoinLAsscomProject extends OneExplorationRuleFactory { - // for inner-inner - public static final JoinLAsscomProject INNER = new JoinLAsscomProject(Type.INNER); - // for inner-leftOuter or leftOuter-leftOuter - public static final JoinLAsscomProject OUTER = new JoinLAsscomProject(Type.OUTER); - - private final Predicate<LogicalJoin<LogicalProject<LogicalJoin<GroupPlan, GroupPlan>>, GroupPlan>> typeChecker; - - private final Type type; - - /** - * Specify join type. - */ - public JoinLAsscomProject(Type type) { - this.type = type; - if (type == Type.INNER) { - typeChecker = join -> join.getJoinType().isInnerJoin() && join.left().child().getJoinType().isInnerJoin(); - } else { - typeChecker = join -> JoinLAsscomHelper.outerSet.contains( - Pair.of(join.left().child().getJoinType(), join.getJoinType())); - } - } +public class InnerJoinLAsscomProject extends OneExplorationRuleFactory { + public static final InnerJoinLAsscomProject INSTANCE = new InnerJoinLAsscomProject(); /* * topJoin newTopJoin @@ -65,9 +38,8 @@ public class JoinLAsscomProject extends OneExplorationRuleFactory { */ @Override public Rule build() { - return logicalJoin(logicalProject(logicalJoin()), group()) - .when(topJoin -> JoinLAsscomHelper.check(type, topJoin, topJoin.left().child())) - .when(typeChecker) + return innerLogicalJoin(logicalProject(innerLogicalJoin()), group()) + .when(topJoin -> JoinLAsscomHelper.checkInner(topJoin, topJoin.left().child())) .then(topJoin -> { JoinLAsscomHelper helper = new JoinLAsscomHelper(topJoin, topJoin.left().child()); helper.initAllProject(topJoin.left()); @@ -75,6 +47,6 @@ public class JoinLAsscomProject extends OneExplorationRuleFactory { return null; } return helper.newTopJoin(); - }).toRule(RuleType.LOGICAL_JOIN_L_ASSCOM_PROJECT); + }).toRule(RuleType.LOGICAL_INNER_JOIN_LASSCOM_PROJECT); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinExchange.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinExchange.java deleted file mode 100644 index bb4aa8ecae..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinExchange.java +++ /dev/null @@ -1,60 +0,0 @@ -// 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.exploration.join; - -import org.apache.doris.nereids.annotation.Developing; -import org.apache.doris.nereids.rules.Rule; -import org.apache.doris.nereids.rules.RuleType; -import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory; -import org.apache.doris.nereids.trees.plans.GroupPlan; -import org.apache.doris.nereids.trees.plans.Plan; -import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; - - -/** - * Rule for busy-tree, exchange the children node. - */ -@Developing -public class JoinExchange extends OneExplorationRuleFactory { - /* - * topJoin newTopJoin - * / \ / \ - * leftJoin rightJoin --> newLeftJoin newRightJoin - * / \ / \ / \ / \ - * A B C D A C B D - */ - @Override - public Rule build() { - return innerLogicalJoin(innerLogicalJoin(), innerLogicalJoin()).then(topJoin -> { - LogicalJoin<GroupPlan, GroupPlan> leftJoin = topJoin.left(); - LogicalJoin<GroupPlan, GroupPlan> rightJoin = topJoin.right(); - - GroupPlan a = leftJoin.left(); - GroupPlan b = leftJoin.right(); - GroupPlan c = rightJoin.left(); - GroupPlan d = rightJoin.right(); - - Plan newLeftJoin = new LogicalJoin(leftJoin.getJoinType(), - leftJoin.getHashJoinConjuncts(), leftJoin.getOtherJoinCondition(), a, c); - Plan newRightJoin = new LogicalJoin(rightJoin.getJoinType(), - rightJoin.getHashJoinConjuncts(), rightJoin.getOtherJoinCondition(), b, d); - return new LogicalJoin(topJoin.getJoinType(), - topJoin.getHashJoinConjuncts(), topJoin.getOtherJoinCondition(), newLeftJoin, newRightJoin); - }).toRule(RuleType.LOGICAL_JOIN_EXCHANGE); - } -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomHelper.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomHelper.java index 616d9d8aba..20e05f96f8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomHelper.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomHelper.java @@ -17,21 +17,16 @@ package org.apache.doris.nereids.rules.exploration.join; -import org.apache.doris.common.Pair; -import org.apache.doris.nereids.rules.exploration.join.JoinReorderCommon.Type; import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.plans.GroupPlan; -import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.util.ExpressionUtils; import org.apache.doris.nereids.util.PlanUtils; import org.apache.doris.nereids.util.Utils; -import com.google.common.collect.ImmutableSet; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -50,13 +45,6 @@ class JoinLAsscomHelper extends ThreeJoinHelper { * A B A C */ - // Pair<bottomJoin, topJoin> - // newBottomJoin Type = topJoin Type, newTopJoin Type = bottomJoin Type - public static Set<Pair<JoinType, JoinType>> outerSet = ImmutableSet.of( - Pair.of(JoinType.LEFT_OUTER_JOIN, JoinType.INNER_JOIN), - Pair.of(JoinType.INNER_JOIN, JoinType.LEFT_OUTER_JOIN), - Pair.of(JoinType.LEFT_OUTER_JOIN, JoinType.LEFT_OUTER_JOIN)); - /** * Init plan and output. */ @@ -117,17 +105,18 @@ class JoinLAsscomHelper extends ThreeJoinHelper { return PlanUtils.projectOrSelf(new ArrayList<>(topJoin.getOutput()), newTopJoin); } - public static boolean check(Type type, LogicalJoin<? extends Plan, GroupPlan> topJoin, + public static boolean checkInner(LogicalJoin<? extends Plan, GroupPlan> topJoin, LogicalJoin<GroupPlan, GroupPlan> bottomJoin) { - if (type == Type.INNER) { - return !bottomJoin.getJoinReorderContext().hasCommuteZigZag() - && !topJoin.getJoinReorderContext().hasLAsscom(); - } else { - // hasCommute will cause to lack of OuterJoinAssocRule:Left - return !topJoin.getJoinReorderContext().hasLeftAssociate() - && !topJoin.getJoinReorderContext().hasRightAssociate() - && !topJoin.getJoinReorderContext().hasExchange() - && !bottomJoin.getJoinReorderContext().hasCommute(); - } + return !bottomJoin.getJoinReorderContext().hasCommuteZigZag() + && !topJoin.getJoinReorderContext().hasLAsscom(); + } + + public static boolean checkOuter(LogicalJoin<? extends Plan, GroupPlan> topJoin, + LogicalJoin<GroupPlan, GroupPlan> bottomJoin) { + // hasCommute will cause to lack of OuterJoinAssocRule:Left + return !topJoin.getJoinReorderContext().hasLeftAssociate() + && !topJoin.getJoinReorderContext().hasRightAssociate() + && !topJoin.getJoinReorderContext().hasExchange() + && !bottomJoin.getJoinReorderContext().hasCommute(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderCommon.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderCommon.java deleted file mode 100644 index 77eb09f014..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderCommon.java +++ /dev/null @@ -1,25 +0,0 @@ -// 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.exploration.join; - -class JoinReorderCommon { - public enum Type { - INNER, - OUTER - } -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscom.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java similarity index 58% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscom.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java index 07d8acaceb..8672c9cc89 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscom.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java @@ -21,37 +21,24 @@ import org.apache.doris.common.Pair; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory; -import org.apache.doris.nereids.rules.exploration.join.JoinReorderCommon.Type; -import org.apache.doris.nereids.trees.plans.GroupPlan; -import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.trees.plans.JoinType; -import java.util.function.Predicate; +import com.google.common.collect.ImmutableSet; + +import java.util.Set; /** * Rule for change inner join LAsscom (associative and commutive). */ -public class JoinLAsscom extends OneExplorationRuleFactory { - // for inner-inner - public static final JoinLAsscom INNER = new JoinLAsscom(Type.INNER); - // for inner-leftOuter or leftOuter-leftOuter - public static final JoinLAsscom OUTER = new JoinLAsscom(Type.OUTER); - - private final Predicate<LogicalJoin<LogicalJoin<GroupPlan, GroupPlan>, GroupPlan>> typeChecker; - - private final Type type; +public class OuterJoinLAsscom extends OneExplorationRuleFactory { + public static final OuterJoinLAsscom INSTANCE = new OuterJoinLAsscom(); - /** - * Specify join type. - */ - public JoinLAsscom(Type type) { - this.type = type; - if (type == Type.INNER) { - typeChecker = join -> join.getJoinType().isInnerJoin() && join.left().getJoinType().isInnerJoin(); - } else { - typeChecker = join -> JoinLAsscomHelper.outerSet.contains( - Pair.of(join.left().getJoinType(), join.getJoinType())); - } - } + // Pair<bottomJoin, topJoin> + // newBottomJoin Type = topJoin Type, newTopJoin Type = bottomJoin Type + public static Set<Pair<JoinType, JoinType>> VALID_TYPE_PAIR_SET = ImmutableSet.of( + Pair.of(JoinType.LEFT_OUTER_JOIN, JoinType.INNER_JOIN), + Pair.of(JoinType.INNER_JOIN, JoinType.LEFT_OUTER_JOIN), + Pair.of(JoinType.LEFT_OUTER_JOIN, JoinType.LEFT_OUTER_JOIN)); /* * topJoin newTopJoin @@ -63,14 +50,14 @@ public class JoinLAsscom extends OneExplorationRuleFactory { @Override public Rule build() { return logicalJoin(logicalJoin(), group()) - .when(topJoin -> JoinLAsscomHelper.check(type, topJoin, topJoin.left())) - .when(typeChecker) + .when(topJoin -> JoinLAsscomHelper.checkOuter(topJoin, topJoin.left())) + .when(join -> VALID_TYPE_PAIR_SET.contains(Pair.of(join.left().getJoinType(), join.getJoinType()))) .then(topJoin -> { JoinLAsscomHelper helper = new JoinLAsscomHelper(topJoin, topJoin.left()); if (!helper.initJoinOnCondition()) { return null; } return helper.newTopJoin(); - }).toRule(RuleType.LOGICAL_JOIN_L_ASSCOM); + }).toRule(RuleType.LOGICAL_OUTER_JOIN_LASSCOM); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java similarity index 58% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProject.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java index 8c45afaa04..65a9421e9f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java @@ -21,38 +21,12 @@ import org.apache.doris.common.Pair; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory; -import org.apache.doris.nereids.rules.exploration.join.JoinReorderCommon.Type; -import org.apache.doris.nereids.trees.plans.GroupPlan; -import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; -import org.apache.doris.nereids.trees.plans.logical.LogicalProject; - -import java.util.function.Predicate; /** * Rule for change inner join LAsscom (associative and commutive). */ -public class JoinLAsscomProject extends OneExplorationRuleFactory { - // for inner-inner - public static final JoinLAsscomProject INNER = new JoinLAsscomProject(Type.INNER); - // for inner-leftOuter or leftOuter-leftOuter - public static final JoinLAsscomProject OUTER = new JoinLAsscomProject(Type.OUTER); - - private final Predicate<LogicalJoin<LogicalProject<LogicalJoin<GroupPlan, GroupPlan>>, GroupPlan>> typeChecker; - - private final Type type; - - /** - * Specify join type. - */ - public JoinLAsscomProject(Type type) { - this.type = type; - if (type == Type.INNER) { - typeChecker = join -> join.getJoinType().isInnerJoin() && join.left().child().getJoinType().isInnerJoin(); - } else { - typeChecker = join -> JoinLAsscomHelper.outerSet.contains( - Pair.of(join.left().child().getJoinType(), join.getJoinType())); - } - } +public class OuterJoinLAsscomProject extends OneExplorationRuleFactory { + public static final OuterJoinLAsscomProject INSTANCE = new OuterJoinLAsscomProject(); /* * topJoin newTopJoin @@ -66,8 +40,9 @@ public class JoinLAsscomProject extends OneExplorationRuleFactory { @Override public Rule build() { return logicalJoin(logicalProject(logicalJoin()), group()) - .when(topJoin -> JoinLAsscomHelper.check(type, topJoin, topJoin.left().child())) - .when(typeChecker) + .when(topJoin -> JoinLAsscomHelper.checkOuter(topJoin, topJoin.left().child())) + .when(join -> OuterJoinLAsscom.VALID_TYPE_PAIR_SET.contains( + Pair.of(join.left().child().getJoinType(), join.getJoinType()))) .then(topJoin -> { JoinLAsscomHelper helper = new JoinLAsscomHelper(topJoin, topJoin.left().child()); helper.initAllProject(topJoin.left()); @@ -75,6 +50,6 @@ public class JoinLAsscomProject extends OneExplorationRuleFactory { return null; } return helper.newTopJoin(); - }).toRule(RuleType.LOGICAL_JOIN_L_ASSCOM_PROJECT); + }).toRule(RuleType.LOGICAL_OUTER_JOIN_LASSCOM_PROJECT); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java index beab255b89..a9b34bb2f1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java @@ -39,7 +39,7 @@ import java.util.Set; public class SemiJoinSemiJoinTranspose extends OneExplorationRuleFactory { public static final SemiJoinSemiJoinTranspose INSTANCE = new SemiJoinSemiJoinTranspose(); - public static Set<Pair<JoinType, JoinType>> typeSet = ImmutableSet.of( + public static Set<Pair<JoinType, JoinType>> VALID_TYPE_PAIR_SET = ImmutableSet.of( Pair.of(JoinType.LEFT_SEMI_JOIN, JoinType.LEFT_SEMI_JOIN), Pair.of(JoinType.LEFT_ANTI_JOIN, JoinType.LEFT_ANTI_JOIN), Pair.of(JoinType.LEFT_SEMI_JOIN, JoinType.LEFT_ANTI_JOIN), @@ -74,6 +74,6 @@ public class SemiJoinSemiJoinTranspose extends OneExplorationRuleFactory { } private boolean typeChecker(LogicalJoin<LogicalJoin<GroupPlan, GroupPlan>, GroupPlan> topJoin) { - return typeSet.contains(Pair.of(topJoin.getJoinType(), topJoin.left().getJoinType())); + return VALID_TYPE_PAIR_SET.contains(Pair.of(topJoin.getJoinType(), topJoin.left().getJoinType())); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java similarity index 98% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProjectTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java index bab120f2aa..26a3e030ab 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProjectTest.java @@ -40,7 +40,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -public class JoinLAsscomProjectTest { +public class InnerJoinLAsscomProjectTest { private final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -81,7 +81,7 @@ public class JoinLAsscomProjectTest { Optional.empty(), project, scan3); PlanChecker.from(MemoTestUtils.createConnectContext(), topJoin) - .transform(JoinLAsscomProject.INNER.build()) + .transform(InnerJoinLAsscomProject.INSTANCE.build()) .checkMemo(memo -> { Group root = memo.getRoot(); Assertions.assertEquals(2, root.getLogicalExpressions().size()); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomTest.java similarity index 97% rename from fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomTest.java rename to fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomTest.java index 5bbee33b0a..ca82e7446e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinLAsscomTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomTest.java @@ -36,7 +36,7 @@ import org.junit.jupiter.api.Test; import java.util.Optional; -public class JoinLAsscomTest { +public class InnerJoinLAsscomTest { private final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); private final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); @@ -70,7 +70,7 @@ public class JoinLAsscomTest { Optional.empty(), bottomJoin, scan3); PlanChecker.from(MemoTestUtils.createConnectContext(), topJoin) - .transform(JoinLAsscom.INNER.build()) + .transform(InnerJoinLAsscom.INSTANCE.build()) .checkMemo(memo -> { Group root = memo.getRoot(); Assertions.assertEquals(2, root.getLogicalExpressions().size()); @@ -115,7 +115,7 @@ public class JoinLAsscomTest { Optional.empty(), bottomJoin, scan3); PlanChecker.from(MemoTestUtils.createConnectContext(), topJoin) - .transform(JoinLAsscom.INNER.build()) + .transform(InnerJoinLAsscom.INSTANCE.build()) .checkMemo(memo -> { Group root = memo.getRoot(); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteTest.java index 5eae21170d..4fe713ee5e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteTest.java @@ -17,40 +17,32 @@ package org.apache.doris.nereids.rules.exploration.join; +import org.apache.doris.common.Pair; import org.apache.doris.nereids.memo.Group; import org.apache.doris.nereids.memo.GroupExpression; -import org.apache.doris.nereids.trees.expressions.EqualTo; -import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; +import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; -import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.util.LogicalPlanBuilder; import org.apache.doris.nereids.util.MemoTestUtils; import org.apache.doris.nereids.util.PlanChecker; import org.apache.doris.nereids.util.PlanConstructor; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.Optional; - public class JoinCommuteTest { @Test public void testInnerJoinCommute() { LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0); LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0); - Expression onCondition = new EqualTo( - new SlotReference("id", BigIntType.INSTANCE, true, ImmutableList.of("table1")), - new SlotReference("id", BigIntType.INSTANCE, true, ImmutableList.of("table2"))); - LogicalJoin<LogicalOlapScan, LogicalOlapScan> join = new LogicalJoin<>( - JoinType.INNER_JOIN, Lists.newArrayList(onCondition), - Optional.empty(), scan1, scan2); + LogicalPlan join = new LogicalPlanBuilder(scan1) + .hashJoinUsing(scan2, JoinType.INNER_JOIN, Pair.of(0, 0)) // t1.id = t2.id + .build(); PlanChecker.from(MemoTestUtils.createConnectContext(), join) .transform(JoinCommute.LEFT_DEEP.build()) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org