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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]