in tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/physical/MergeJoinExec.java [98:169]
public Tuple next() throws IOException {
Tuple previous;
for (;;) {
if (!outerIterator.hasNext() && !innerIterator.hasNext()) {
if(end){
return null;
}
if(outerTuple == null){
outerTuple = leftChild.next();
}
if(innerTuple == null){
innerTuple = rightChild.next();
}
outerTupleSlots.clear();
innerTupleSlots.clear();
int cmp;
while ((cmp = joincomparator.compare(outerTuple, innerTuple)) != 0) {
if (cmp > 0) {
innerTuple = rightChild.next();
} else if (cmp < 0) {
outerTuple = leftChild.next();
}
if (innerTuple == null || outerTuple == null) {
return null;
}
}
try {
previous = outerTuple.clone();
do {
outerTupleSlots.add(outerTuple.clone());
outerTuple = leftChild.next();
if (outerTuple == null) {
end = true;
break;
}
} while (tupleComparator[0].compare(previous, outerTuple) == 0);
outerIterator = outerTupleSlots.iterator();
outerNext = outerIterator.next();
previous = innerTuple.clone();
do {
innerTupleSlots.add(innerTuple.clone());
innerTuple = rightChild.next();
if (innerTuple == null) {
end = true;
break;
}
} while (tupleComparator[1].compare(previous, innerTuple) == 0);
innerIterator = innerTupleSlots.iterator();
} catch (CloneNotSupportedException e) {
}
}
if(!innerIterator.hasNext()){
outerNext = outerIterator.next();
innerIterator = innerTupleSlots.iterator();
}
frameTuple.set(outerNext, innerIterator.next());
if (joinQual.eval(inSchema, frameTuple).isTrue()) {
projector.eval(frameTuple, outTuple);
return outTuple;
}
}
}