use of org.apache.calcite.rel.core.JoinRelType.FULL in project ignite-3 by apache.
the class IgniteMergeJoin method passThroughCollation.
/**
* {@inheritDoc}
*/
@Override
public Pair<RelTraitSet, List<RelTraitSet>> passThroughCollation(RelTraitSet required, List<RelTraitSet> inputTraits) {
RelCollation collation = TraitUtils.collation(required);
RelTraitSet left = inputTraits.get(0);
RelTraitSet right = inputTraits.get(1);
if (joinType == FULL) {
return defaultCollationPair(required, left, right);
}
int leftInputFieldCount = this.left.getRowType().getFieldCount();
List<Integer> reqKeys = RelCollations.ordinals(collation);
List<Integer> leftKeys = joinInfo.leftKeys.toIntegerList();
List<Integer> rightKeys = joinInfo.rightKeys.incr(leftInputFieldCount).toIntegerList();
ImmutableBitSet reqKeySet = ImmutableBitSet.of(reqKeys);
ImmutableBitSet leftKeySet = ImmutableBitSet.of(joinInfo.leftKeys);
ImmutableBitSet rightKeySet = ImmutableBitSet.of(rightKeys);
RelCollation nodeCollation;
RelCollation leftCollation;
RelCollation rightCollation;
if (reqKeySet.equals(leftKeySet)) {
if (joinType == RIGHT) {
return defaultCollationPair(required, left, right);
}
nodeCollation = collation;
leftCollation = collation;
rightCollation = collation.apply(buildTransposeMapping(true));
} else if (containsOrderless(leftKeys, collation)) {
if (joinType == RIGHT) {
return defaultCollationPair(required, left, right);
}
// if sort keys are subset of left join keys, we can extend collations to make sure all join
// keys are sorted.
nodeCollation = collation;
leftCollation = extendCollation(collation, leftKeys);
rightCollation = leftCollation.apply(buildTransposeMapping(true));
} else if (containsOrderless(collation, leftKeys) && reqKeys.stream().allMatch(i -> i < leftInputFieldCount)) {
if (joinType == RIGHT) {
return defaultCollationPair(required, left, right);
}
// if sort keys are superset of left join keys, and left join keys is prefix of sort keys
// (order not matter), also sort keys are all from left join input.
nodeCollation = collation;
leftCollation = collation;
rightCollation = leftCollation.apply(buildTransposeMapping(true));
} else if (reqKeySet.equals(rightKeySet)) {
if (joinType == LEFT) {
return defaultCollationPair(required, left, right);
}
nodeCollation = collation;
rightCollation = RelCollations.shift(collation, -leftInputFieldCount);
leftCollation = rightCollation.apply(buildTransposeMapping(false));
} else if (containsOrderless(rightKeys, collation)) {
if (joinType == LEFT) {
return defaultCollationPair(required, left, right);
}
nodeCollation = collation;
rightCollation = RelCollations.shift(extendCollation(collation, rightKeys), -leftInputFieldCount);
leftCollation = rightCollation.apply(buildTransposeMapping(false));
} else {
return defaultCollationPair(required, left, right);
}
return Pair.of(required.replace(nodeCollation), ImmutableList.of(left.replace(leftCollation), right.replace(rightCollation)));
}
Aggregations