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

Reply via email to