Skip to content

Commit a0e3072

Browse files
committed
Add methods to flip join and set distribution type
1 parent aaa6de0 commit a0e3072

File tree

1 file changed

+66
-0
lines changed
  • presto-main/src/main/java/com/facebook/presto/sql/planner/plan

1 file changed

+66
-0
lines changed

presto-main/src/main/java/com/facebook/presto/sql/planner/plan/JoinNode.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@
2828
import java.util.List;
2929
import java.util.Objects;
3030
import java.util.Optional;
31+
import java.util.stream.Collectors;
3132
import java.util.stream.Stream;
3233

3334
import static com.facebook.presto.sql.planner.SortExpressionExtractor.extractSortExpression;
35+
import static com.facebook.presto.sql.planner.plan.JoinNode.Type.FULL;
3436
import static com.facebook.presto.sql.planner.plan.JoinNode.Type.INNER;
37+
import static com.facebook.presto.sql.planner.plan.JoinNode.Type.LEFT;
38+
import static com.facebook.presto.sql.planner.plan.JoinNode.Type.RIGHT;
3539
import static com.google.common.base.Preconditions.checkArgument;
3640
import static com.google.common.collect.ImmutableList.toImmutableList;
3741
import static java.util.Objects.requireNonNull;
@@ -100,6 +104,58 @@ public JoinNode(@JsonProperty("id") PlanNodeId id,
100104
checkArgument(!(criteria.isEmpty() && rightHashSymbol.isPresent()), "Right hash symbol is only valid in an equijoin");
101105
}
102106

107+
public JoinNode flipChildren()
108+
{
109+
return new JoinNode(
110+
getId(),
111+
flipType(type),
112+
right,
113+
left,
114+
flipJoinCriteria(criteria),
115+
flipOutputSymbols(getOutputSymbols(), left, right),
116+
filter,
117+
rightHashSymbol,
118+
leftHashSymbol,
119+
distributionType);
120+
}
121+
122+
private static Type flipType(Type type)
123+
{
124+
switch (type) {
125+
case INNER:
126+
return INNER;
127+
case FULL:
128+
return FULL;
129+
case LEFT:
130+
return RIGHT;
131+
case RIGHT:
132+
return LEFT;
133+
default:
134+
throw new IllegalStateException("No inverse defined for join type: " + type);
135+
}
136+
}
137+
138+
private static List<EquiJoinClause> flipJoinCriteria(List<EquiJoinClause> joinCriteria)
139+
{
140+
return joinCriteria.stream()
141+
.map(EquiJoinClause::flip)
142+
.collect(toImmutableList());
143+
}
144+
145+
private static List<Symbol> flipOutputSymbols(List<Symbol> outputSymbols, PlanNode left, PlanNode right)
146+
{
147+
List<Symbol> leftSymbols = outputSymbols.stream()
148+
.filter(symbol -> left.getOutputSymbols().contains(symbol))
149+
.collect(Collectors.toList());
150+
List<Symbol> rightSymbols = outputSymbols.stream()
151+
.filter(symbol -> right.getOutputSymbols().contains(symbol))
152+
.collect(Collectors.toList());
153+
return ImmutableList.<Symbol>builder()
154+
.addAll(rightSymbols)
155+
.addAll(leftSymbols)
156+
.build();
157+
}
158+
103159
public enum DistributionType
104160
{
105161
PARTITIONED,
@@ -230,6 +286,11 @@ public PlanNode replaceChildren(List<PlanNode> newChildren)
230286
return new JoinNode(getId(), type, newLeft, newRight, criteria, newOutputSymbols, filter, leftHashSymbol, rightHashSymbol, distributionType);
231287
}
232288

289+
public JoinNode withDistributionType(DistributionType distributionType)
290+
{
291+
return new JoinNode(getId(), type, left, right, criteria, outputSymbols, filter, leftHashSymbol, rightHashSymbol, Optional.of(distributionType));
292+
}
293+
233294
public boolean isCrossJoin()
234295
{
235296
return criteria.isEmpty() && !filter.isPresent() && type == INNER;
@@ -264,6 +325,11 @@ public ComparisonExpression toExpression()
264325
return new ComparisonExpression(ComparisonExpressionType.EQUAL, left.toSymbolReference(), right.toSymbolReference());
265326
}
266327

328+
public EquiJoinClause flip()
329+
{
330+
return new EquiJoinClause(right, left);
331+
}
332+
267333
@Override
268334
public boolean equals(Object obj)
269335
{

0 commit comments

Comments
 (0)