package net.sourceforge.mayfly.evaluation.from;
import net.sourceforge.mayfly.evaluation.ResultRow;
import net.sourceforge.mayfly.evaluation.ResultRows;
import net.sourceforge.mayfly.evaluation.condition.Condition;
import net.sourceforge.mayfly.evaluation.select.Evaluator;
import net.sourceforge.mayfly.util.L;
import java.util.Iterator;
public class LeftJoin extends Join {
public LeftJoin(FromElement left, FromElement right, Condition condition) {
super(left, right, condition);
}
@Override
public ResultRows tableContents(Evaluator evaluator) {
ResultRows leftRows = left.tableContents(evaluator);
ResultRows rightRows = right.tableContents(evaluator);
final L joinResult = new L();
Iterator leftIter = leftRows.iterator();
while (leftIter.hasNext()) {
ResultRow leftRow = (ResultRow) leftIter.next();
boolean haveJoinedThisLeftRow = false;
Iterator rightIter = rightRows.iterator();
while (rightIter.hasNext()) {
ResultRow rightRow = (ResultRow) rightIter.next();
ResultRow combined = leftRow.combine(rightRow);
if (condition.evaluate(combined, evaluator)) {
joinResult.append(combined);
haveJoinedThisLeftRow = true;
}
}
if (!haveJoinedThisLeftRow) {
ResultRow nullRightRow = right.dummyRow(evaluator);
ResultRow withNulls = leftRow.combine(nullRightRow);
joinResult.append(withNulls);
}
}
return new ResultRows(joinResult.asImmutable());
}
@Override
public FromElement addToCondition(Condition conditionToAndIn) {
return new LeftJoin(left, right, condition.makeAnd(conditionToAndIn));
}
}