* foreach table1 generate flatten(GFCross(0, 2)), flatten(*); B = foreach
* table2 generate flatten(GFCross(1, 2)), flatten(*); C = cogroup A by ($0,
* $1), B by ($0, $1); result = foreach C generate flatten(A), flatten(B);
*/
PTypeFamily ltf = left.getTypeFamily();
PTypeFamily rtf = right.getTypeFamily();
PTable<Pair<Integer, Integer>, Pair<K1, U>> leftCross = left.parallelDo(new GFCross<Pair<K1, U>>(0, parallelism),
ltf.tableOf(ltf.pairs(ltf.ints(), ltf.ints()), ltf.pairs(left.getKeyType(), left.getValueType())));
PTable<Pair<Integer, Integer>, Pair<K2, V>> rightCross = right.parallelDo(new GFCross<Pair<K2, V>>(1, parallelism),
rtf.tableOf(rtf.pairs(rtf.ints(), rtf.ints()), rtf.pairs(right.getKeyType(), right.getValueType())));
PTable<Pair<Integer, Integer>, Pair<Pair<K1, U>, Pair<K2, V>>> cg = leftCross.join(rightCross);
PTypeFamily ctf = cg.getTypeFamily();
return cg.parallelDo(
new MapFn<Pair<Pair<Integer, Integer>, Pair<Pair<K1, U>, Pair<K2, V>>>, Pair<Pair<K1, K2>, Pair<U, V>>>() {
@Override
public Pair<Pair<K1, K2>, Pair<U, V>> map(Pair<Pair<Integer, Integer>, Pair<Pair<K1, U>, Pair<K2, V>>> input) {
Pair<Pair<K1, U>, Pair<K2, V>> valuePair = input.second();
return Pair.of(Pair.of(valuePair.first().first(), valuePair.second().first()),
Pair.of(valuePair.first().second(), valuePair.second().second()));
}
},
ctf.tableOf(ctf.pairs(left.getKeyType(), right.getKeyType()),
ctf.pairs(left.getValueType(), right.getValueType())));
}