}
}
private PTable<K, Pair<U,V>> joinInternal(PTable<K, U> left, PTable<K, V> right, boolean includeUnmatchedLeftValues) {
PTypeFamily tf = left.getTypeFamily();
Iterable<Pair<K, V>> iterable = right.materialize();
if (iterable instanceof MaterializableIterable) {
MaterializableIterable<Pair<K, V>> mi = (MaterializableIterable<Pair<K, V>>) iterable;
MapsideJoinDoFn<K, U, V> mapJoinDoFn = new MapsideJoinDoFn<K, U, V>(mi.getPath().toString(),
includeUnmatchedLeftValues, right.getPType());
ParallelDoOptions.Builder optionsBuilder = ParallelDoOptions.builder();
if (mi.isSourceTarget()) {
optionsBuilder.sourceTargets((SourceTarget) mi.getSource());
}
return left.parallelDo("mapjoin", mapJoinDoFn,
tf.tableOf(left.getKeyType(), tf.pairs(left.getValueType(), right.getValueType())),
optionsBuilder.build());
} else { // in-memory pipeline
return left.parallelDo(new InMemoryJoinFn<K, U, V>(iterable, includeUnmatchedLeftValues),
tf.tableOf(left.getKeyType(), tf.pairs(left.getValueType(), right.getValueType())));
}
}