This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 75d7de89a5 [improve](Nereids) Add all slots used by onClause to
project when reorder and fix reorder mark (#12701)
75d7de89a5 is described below
commit 75d7de89a56e4eca9c1831a887e38b4683208235
Author: jakevin <[email protected]>
AuthorDate: Mon Sep 19 11:01:25 2022 +0800
[improve](Nereids) Add all slots used by onClause to project when reorder
and fix reorder mark (#12701)
1. Add all slots used by onClause in project
```
(A & B) & C like
join(hash conjuncts: C.t2 = A.t2)
|---project(A.t2)
| +---join(hash conjuncts: A.t1 = B.t1)
| +---A
| +---B
+---C
transform to (A & C) & B
join(hash conjuncts: A.t1 = B.t1)
|---project(A.t2)
| +---join(hash conjuncts: C.t2 = A.t2)
| +---A
| +---C
+---B
```
But projection just include `A.t2`, can't find `A.t1`, we should add slots
used by onClause when projection exist.
2. fix join reorder mark
Add mark `LAsscom` when apply `LAsscom`
3. remove slotReference
use `Slot` instead of `SlotReference` to avoid cast.
---
.../rules/exploration/join/InnerJoinLAsscom.java | 11 +++-
.../exploration/join/InnerJoinLAsscomProject.java | 4 +-
.../rules/exploration/join/JoinCommuteHelper.java | 7 +--
.../rules/exploration/join/JoinLAsscomHelper.java | 70 ++++++++++------------
.../rules/exploration/join/OuterJoinLAsscom.java | 21 +++++--
.../exploration/join/OuterJoinLAsscomProject.java | 4 +-
.../rules/exploration/join/ThreeJoinHelper.java | 31 +++++-----
.../LogicalOlapScanToPhysicalOlapScan.java | 5 +-
.../org/apache/doris/nereids/util/JoinUtils.java | 43 +++++++------
.../java/org/apache/doris/nereids/util/Utils.java | 10 ----
10 files changed, 103 insertions(+), 103 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java
index 9286ba33f7..021987cb7d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscom.java
@@ -20,6 +20,9 @@ package org.apache.doris.nereids.rules.exploration.join;
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 change inner join LAsscom (associative and commutive).
@@ -37,7 +40,7 @@ public class InnerJoinLAsscom extends
OneExplorationRuleFactory {
@Override
public Rule build() {
return innerLogicalJoin(innerLogicalJoin(), group())
- .when(topJoin -> JoinLAsscomHelper.checkInner(topJoin,
topJoin.left()))
+ .when(topJoin -> check(topJoin, topJoin.left()))
.then(topJoin -> {
JoinLAsscomHelper helper = new JoinLAsscomHelper(topJoin,
topJoin.left());
if (!helper.initJoinOnCondition()) {
@@ -46,4 +49,10 @@ public class InnerJoinLAsscom extends
OneExplorationRuleFactory {
return helper.newTopJoin();
}).toRule(RuleType.LOGICAL_INNER_JOIN_LASSCOM);
}
+
+ public static boolean check(LogicalJoin<? extends Plan, GroupPlan> topJoin,
+ LogicalJoin<GroupPlan, GroupPlan> bottomJoin) {
+ return !bottomJoin.getJoinReorderContext().hasCommuteZigZag()
+ && !topJoin.getJoinReorderContext().hasLAsscom();
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java
index 50e4858b72..7f3fc20c68 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/InnerJoinLAsscomProject.java
@@ -39,10 +39,10 @@ public class InnerJoinLAsscomProject extends
OneExplorationRuleFactory {
@Override
public Rule build() {
return innerLogicalJoin(logicalProject(innerLogicalJoin()), group())
- .when(topJoin -> JoinLAsscomHelper.checkInner(topJoin,
topJoin.left().child()))
+ .when(topJoin -> InnerJoinLAsscom.check(topJoin,
topJoin.left().child()))
.then(topJoin -> {
JoinLAsscomHelper helper = new JoinLAsscomHelper(topJoin,
topJoin.left().child());
- helper.initAllProject(topJoin.left());
+ helper.initProject(topJoin.left());
if (!helper.initJoinOnCondition()) {
return null;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteHelper.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteHelper.java
index 288c566a72..cb07f2383c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteHelper.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommuteHelper.java
@@ -17,10 +17,9 @@
package org.apache.doris.nereids.rules.exploration.join;
-import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.plans.GroupPlan;
import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
-import org.apache.doris.nereids.util.Utils;
import java.util.List;
@@ -47,7 +46,7 @@ class JoinCommuteHelper {
private static boolean containJoin(GroupPlan groupPlan) {
// TODO: tmp way to judge containJoin
- List<SlotReference> output = Utils.getOutputSlotReference(groupPlan);
- return
!output.stream().map(SlotReference::getQualifier).allMatch(output.get(0).getQualifier()::equals);
+ List<Slot> output = groupPlan.getOutput();
+ return
!output.stream().map(Slot::getQualifier).allMatch(output.get(0).getQualifier()::equals);
}
}
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 20e05f96f8..74bf081090 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
@@ -19,15 +19,14 @@ package org.apache.doris.nereids.rules.exploration.join;
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.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 java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -57,35 +56,30 @@ class JoinLAsscomHelper extends ThreeJoinHelper {
* Create newTopJoin.
*/
public Plan newTopJoin() {
- // Split inside-project into two part.
- Map<Boolean, List<NamedExpression>> projectExprsMap =
allProjects.stream()
+ // Split bottomJoinProject into two part.
+ Map<Boolean, List<NamedExpression>> projectExprsMap =
bottomProjects.stream()
.collect(Collectors.partitioningBy(projectExpr -> {
Set<Slot> usedSlots =
projectExpr.collect(Slot.class::isInstance);
- return bOutput.containsAll(usedSlots);
+ return bOutputSet.containsAll(usedSlots);
}));
+ List<NamedExpression> newLeftProjects =
projectExprsMap.get(Boolean.FALSE);
+ List<NamedExpression> newRightProjects =
projectExprsMap.get(Boolean.TRUE);
- List<NamedExpression> newLeftProjectExpr =
projectExprsMap.get(Boolean.FALSE);
- List<NamedExpression> newRightProjectExprs =
projectExprsMap.get(Boolean.TRUE);
-
- // If add project to B, we should add all slotReference used by
hashOnCondition.
+ // Add all slots used by hashOnCondition when projects not empty.
// TODO: Does nonHashOnCondition also need to be considered.
- Set<SlotReference> onUsedSlotRef =
bottomJoin.getHashJoinConjuncts().stream()
- .flatMap(expr -> {
- Set<SlotReference> usedSlotRefs =
expr.collect(SlotReference.class::isInstance);
+ Map<Boolean, List<Slot>> onUsedSlots =
bottomJoin.getHashJoinConjuncts().stream()
+ .flatMap(onExpr -> {
+ Set<Slot> usedSlotRefs =
onExpr.collect(Slot.class::isInstance);
return usedSlotRefs.stream();
-
}).filter(Utils.getOutputSlotReference(bottomJoin)::contains).collect(Collectors.toSet());
- boolean existRightProject = !newRightProjectExprs.isEmpty();
- boolean existLeftProject = !newLeftProjectExpr.isEmpty();
- onUsedSlotRef.forEach(slotRef -> {
- if (existRightProject && bOutput.contains(slotRef) &&
!newRightProjectExprs.contains(slotRef)) {
- newRightProjectExprs.add(slotRef);
- } else if (existLeftProject && aOutput.contains(slotRef) &&
!newLeftProjectExpr.contains(slotRef)) {
- newLeftProjectExpr.add(slotRef);
- }
- });
+ }).collect(Collectors.partitioningBy(bOutputSet::contains));
+ List<Slot> leftUsedSlots = onUsedSlots.get(Boolean.FALSE);
+ List<Slot> rightUsedSlots = onUsedSlots.get(Boolean.TRUE);
- if (existLeftProject) {
- newLeftProjectExpr.addAll(cOutput);
+ addSlotsUsedByOn(rightUsedSlots, newRightProjects);
+ addSlotsUsedByOn(leftUsedSlots, newLeftProjects);
+
+ if (!newLeftProjects.isEmpty()) {
+ newLeftProjects.addAll(cOutputSet);
}
LogicalJoin<GroupPlan, GroupPlan> newBottomJoin = new
LogicalJoin<>(topJoin.getJoinType(),
newBottomHashJoinConjuncts,
ExpressionUtils.optionalAnd(newBottomNonHashJoinConjuncts), a, c,
@@ -93,8 +87,8 @@ class JoinLAsscomHelper extends ThreeJoinHelper {
newBottomJoin.getJoinReorderContext().setHasLAsscom(false);
newBottomJoin.getJoinReorderContext().setHasCommute(false);
- Plan left = PlanUtils.projectOrSelf(newLeftProjectExpr, newBottomJoin);
- Plan right = PlanUtils.projectOrSelf(newRightProjectExprs, b);
+ Plan left = PlanUtils.projectOrSelf(newLeftProjects, newBottomJoin);
+ Plan right = PlanUtils.projectOrSelf(newRightProjects, b);
LogicalJoin<Plan, Plan> newTopJoin = new
LogicalJoin<>(bottomJoin.getJoinType(),
newTopHashJoinConjuncts,
@@ -105,18 +99,16 @@ class JoinLAsscomHelper extends ThreeJoinHelper {
return PlanUtils.projectOrSelf(new ArrayList<>(topJoin.getOutput()),
newTopJoin);
}
- public static boolean checkInner(LogicalJoin<? extends Plan, GroupPlan>
topJoin,
- LogicalJoin<GroupPlan, GroupPlan> bottomJoin) {
- 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();
+ // When project not empty, we add all slots used by hashOnCondition into
projects.
+ private void addSlotsUsedByOn(List<Slot> usedSlots, List<NamedExpression>
projects) {
+ if (projects.isEmpty()) {
+ return;
+ }
+ Set<NamedExpression> projectsSet = new HashSet<>(projects);
+ usedSlots.forEach(slot -> {
+ if (!projectsSet.contains(slot)) {
+ projects.add(slot);
+ }
+ });
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java
index 8672c9cc89..70b451a910 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscom.java
@@ -21,7 +21,10 @@ 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.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 com.google.common.collect.ImmutableSet;
@@ -50,14 +53,24 @@ public class OuterJoinLAsscom extends
OneExplorationRuleFactory {
@Override
public Rule build() {
return logicalJoin(logicalJoin(), group())
- .when(topJoin -> JoinLAsscomHelper.checkOuter(topJoin,
topJoin.left()))
+ .when(topJoin -> check(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_OUTER_JOIN_LASSCOM);
}
+
+ /**
+ * check.
+ */
+ public static boolean check(LogicalJoin<? extends Plan, GroupPlan> topJoin,
+ LogicalJoin<GroupPlan, GroupPlan> bottomJoin) {
+ // hasCommute will cause to lack of OuterJoinAssocRule:Left
+ return !topJoin.getJoinReorderContext().hasLAsscom()
+ && !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/OuterJoinLAsscomProject.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java
index 65a9421e9f..6cda79c3b7 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java
@@ -40,12 +40,12 @@ public class OuterJoinLAsscomProject extends
OneExplorationRuleFactory {
@Override
public Rule build() {
return logicalJoin(logicalProject(logicalJoin()), group())
- .when(topJoin -> JoinLAsscomHelper.checkOuter(topJoin,
topJoin.left().child()))
+ .when(topJoin -> OuterJoinLAsscom.check(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());
+ helper.initProject(topJoin.left());
if (!helper.initJoinOnCondition()) {
return null;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/ThreeJoinHelper.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/ThreeJoinHelper.java
index e93aa5f104..fd305813cd 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/ThreeJoinHelper.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/ThreeJoinHelper.java
@@ -44,11 +44,12 @@ abstract class ThreeJoinHelper {
protected final GroupPlan b;
protected final GroupPlan c;
- protected final Set<Slot> aOutput;
- protected final Set<Slot> bOutput;
- protected final Set<Slot> cOutput;
+ protected final Set<Slot> aOutputSet;
+ protected final Set<Slot> bOutputSet;
+ protected final Set<Slot> cOutputSet;
+ protected final Set<Slot> bottomJoinOutputSet;
- protected final List<NamedExpression> allProjects = Lists.newArrayList();
+ protected final List<NamedExpression> bottomProjects =
Lists.newArrayList();
protected final List<Expression> allHashJoinConjuncts =
Lists.newArrayList();
protected final List<Expression> allNonHashJoinConjuncts =
Lists.newArrayList();
@@ -70,9 +71,10 @@ abstract class ThreeJoinHelper {
this.b = b;
this.c = c;
- aOutput = a.getOutputSet();
- bOutput = b.getOutputSet();
- cOutput = c.getOutputSet();
+ aOutputSet = a.getOutputSet();
+ bOutputSet = b.getOutputSet();
+ cOutputSet = c.getOutputSet();
+ bottomJoinOutputSet = bottomJoin.getOutputSet();
Preconditions.checkArgument(!topJoin.getHashJoinConjuncts().isEmpty(),
"topJoin hashJoinConjuncts must exist.");
Preconditions.checkArgument(!bottomJoin.getHashJoinConjuncts().isEmpty(),
@@ -86,11 +88,8 @@ abstract class ThreeJoinHelper {
ExpressionUtils.extractConjunction(otherJoinCondition)));
}
- @SafeVarargs
- public final void initAllProject(LogicalProject<? extends Plan>...
projects) {
- for (LogicalProject<? extends Plan> project : projects) {
- allProjects.addAll(project.getProjects());
- }
+ public final void initProject(LogicalProject<? extends Plan> project) {
+ bottomProjects.addAll(project.getProjects());
}
/**
@@ -102,14 +101,14 @@ abstract class ThreeJoinHelper {
// TODO: also need for otherJoinCondition
for (Expression topJoinOnClauseConjunct :
topJoin.getHashJoinConjuncts()) {
Set<Slot> topJoinUsedSlot =
topJoinOnClauseConjunct.collect(SlotReference.class::isInstance);
- if (ExpressionUtils.isIntersecting(topJoinUsedSlot, aOutput) &&
ExpressionUtils.isIntersecting(
- topJoinUsedSlot, bOutput) &&
ExpressionUtils.isIntersecting(topJoinUsedSlot, cOutput)) {
+ if (ExpressionUtils.isIntersecting(topJoinUsedSlot, aOutputSet) &&
ExpressionUtils.isIntersecting(
+ topJoinUsedSlot, bOutputSet) &&
ExpressionUtils.isIntersecting(topJoinUsedSlot, cOutputSet)) {
return false;
}
}
- Set<Slot> newBottomJoinSlots = new HashSet<>(aOutput);
- newBottomJoinSlots.addAll(cOutput);
+ Set<Slot> newBottomJoinSlots = new HashSet<>(aOutputSet);
+ newBottomJoinSlots.addAll(cOutputSet);
for (Expression hashConjunct : allHashJoinConjuncts) {
Set<SlotReference> slots =
hashConjunct.collect(SlotReference.class::isInstance);
if (newBottomJoinSlots.containsAll(slots)) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapScanToPhysicalOlapScan.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapScanToPhysicalOlapScan.java
index 83f5ce6c1e..3ebaa3eab2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapScanToPhysicalOlapScan.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalOlapScanToPhysicalOlapScan.java
@@ -27,10 +27,9 @@ import
org.apache.doris.nereids.properties.DistributionSpecHash.ShuffleType;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
import org.apache.doris.nereids.trees.expressions.ExprId;
-import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalOlapScan;
-import org.apache.doris.nereids.util.Utils;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -63,7 +62,7 @@ public class LogicalOlapScanToPhysicalOlapScan extends
OneImplementationRuleFact
if (distributionInfo instanceof HashDistributionInfo) {
HashDistributionInfo hashDistributionInfo = (HashDistributionInfo)
distributionInfo;
- List<SlotReference> output =
Utils.getOutputSlotReference(olapScan);
+ List<Slot> output = olapScan.getOutput();
List<ExprId> hashColumns = Lists.newArrayList();
List<Column> schemaColumns = olapScan.getTable().getFullSchema();
for (int i = 0; i < schemaColumns.size(); i++) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
index b17a176148..c7e6d4e978 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
@@ -26,7 +26,6 @@ import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Slot;
-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.algebra.Join;
@@ -62,20 +61,20 @@ public class JoinUtils {
Set<ExprId> leftExprIds;
Set<ExprId> rightExprIds;
- JoinSlotCoverageChecker(List<SlotReference> left, List<SlotReference>
right) {
- leftExprIds =
left.stream().map(SlotReference::getExprId).collect(Collectors.toSet());
- rightExprIds =
right.stream().map(SlotReference::getExprId).collect(Collectors.toSet());
+ JoinSlotCoverageChecker(List<Slot> left, List<Slot> right) {
+ leftExprIds =
left.stream().map(Slot::getExprId).collect(Collectors.toSet());
+ rightExprIds =
right.stream().map(Slot::getExprId).collect(Collectors.toSet());
}
- boolean isCoveredByLeftSlots(Set<SlotReference> slots) {
+ boolean isCoveredByLeftSlots(Set<Slot> slots) {
return slots.stream()
- .map(SlotReference::getExprId)
+ .map(Slot::getExprId)
.allMatch(leftExprIds::contains);
}
- boolean isCoveredByRightSlots(Set<SlotReference> slots) {
+ boolean isCoveredByRightSlots(Set<Slot> slots) {
return slots.stream()
- .map(SlotReference::getExprId)
+ .map(Slot::getExprId)
.allMatch(rightExprIds::contains);
}
@@ -90,21 +89,21 @@ public class JoinUtils {
* @return true if the equal can be used as hash join condition
*/
boolean isHashJoinCondition(EqualTo equalTo) {
- Set<SlotReference> equalLeft =
equalTo.left().collect(SlotReference.class::isInstance);
+ Set<Slot> equalLeft =
equalTo.left().collect(Slot.class::isInstance);
if (equalLeft.isEmpty()) {
return false;
}
- Set<SlotReference> equalRight =
equalTo.right().collect(SlotReference.class::isInstance);
+ Set<Slot> equalRight =
equalTo.right().collect(Slot.class::isInstance);
if (equalRight.isEmpty()) {
return false;
}
List<ExprId> equalLeftExprIds = equalLeft.stream()
-
.map(SlotReference::getExprId).collect(Collectors.toList());
+ .map(Slot::getExprId).collect(Collectors.toList());
List<ExprId> equalRightExprIds = equalRight.stream()
-
.map(SlotReference::getExprId).collect(Collectors.toList());
+ .map(Slot::getExprId).collect(Collectors.toList());
return leftExprIds.containsAll(equalLeftExprIds) &&
rightExprIds.containsAll(equalRightExprIds)
|| leftExprIds.containsAll(equalRightExprIds) &&
rightExprIds.containsAll(equalLeftExprIds);
}
@@ -119,8 +118,8 @@ public class JoinUtils {
if (join.getOtherJoinCondition().isPresent()) {
List<Expression> onExprs = ExpressionUtils.extractConjunction(
(Expression) join.getOtherJoinCondition().get());
- List<SlotReference> leftSlots =
Utils.getOutputSlotReference(join.left());
- List<SlotReference> rightSlots =
Utils.getOutputSlotReference(join.right());
+ List<Slot> leftSlots = join.left().getOutput();
+ List<Slot> rightSlots = join.right().getOutput();
return extractExpressionForHashTable(leftSlots, rightSlots,
onExprs);
}
return Pair.of(Lists.newArrayList(), Lists.newArrayList());
@@ -133,8 +132,8 @@ public class JoinUtils {
* @param onConditions conditions to be split
* @return pair of hashCondition and otherCondition
*/
- public static Pair<List<Expression>, List<Expression>>
extractExpressionForHashTable(List<SlotReference> leftSlots,
- List<SlotReference> rightSlots, List<Expression> onConditions) {
+ public static Pair<List<Expression>, List<Expression>>
extractExpressionForHashTable(List<Slot> leftSlots,
+ List<Slot> rightSlots, List<Expression> onConditions) {
JoinSlotCoverageChecker checker = new
JoinSlotCoverageChecker(leftSlots, rightSlots);
Map<Boolean, List<Expression>> mapper = onConditions.stream()
.collect(Collectors.groupingBy(
@@ -154,19 +153,19 @@ public class JoinUtils {
Pair<List<ExprId>, List<ExprId>> childSlotsExprId =
Pair.of(Lists.newArrayList(), Lists.newArrayList());
- List<SlotReference> leftSlots =
Utils.getOutputSlotReference(join.left());
- List<SlotReference> rightSlots =
Utils.getOutputSlotReference(join.right());
+ List<Slot> leftSlots = join.left().getOutput();
+ List<Slot> rightSlots = join.right().getOutput();
List<EqualTo> equalToList = join.getHashJoinConjuncts().stream()
.map(e -> (EqualTo) e).collect(Collectors.toList());
JoinSlotCoverageChecker checker = new
JoinSlotCoverageChecker(leftSlots, rightSlots);
for (EqualTo equalTo : equalToList) {
- Set<SlotReference> leftOnSlots =
equalTo.left().collect(SlotReference.class::isInstance);
- Set<SlotReference> rightOnSlots =
equalTo.right().collect(SlotReference.class::isInstance);
+ Set<Slot> leftOnSlots =
equalTo.left().collect(Slot.class::isInstance);
+ Set<Slot> rightOnSlots =
equalTo.right().collect(Slot.class::isInstance);
List<ExprId> leftOnSlotsExprId = leftOnSlots.stream()
-
.map(SlotReference::getExprId).collect(Collectors.toList());
+ .map(Slot::getExprId).collect(Collectors.toList());
List<ExprId> rightOnSlotsExprId = rightOnSlots.stream()
-
.map(SlotReference::getExprId).collect(Collectors.toList());
+ .map(Slot::getExprId).collect(Collectors.toList());
if (checker.isCoveredByLeftSlots(leftOnSlots)
&& checker.isCoveredByRightSlots(rightOnSlots)) {
childSlotsExprId.first.addAll(leftOnSlotsExprId);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
index 217b224dc7..2adcbe9ab4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
@@ -21,7 +21,6 @@ import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
-import org.apache.doris.nereids.trees.plans.Plan;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -116,15 +115,6 @@ public class Utils {
return new HashSet<>(one).containsAll(other) && new
HashSet<>(other).containsAll(one);
}
- /**
- * Get SlotReference from output of plam.
- * Warning, plan must have bound, because exists Slot Cast to
SlotReference.
- */
- public static List<SlotReference> getOutputSlotReference(Plan plan) {
- return plan.getOutput().stream().map(SlotReference.class::cast)
- .collect(Collectors.toList());
- }
-
/**
* Get sql string for plan.
*
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]