package net.sourceforge.mayfly.evaluation.condition;
import net.sourceforge.mayfly.MayflyResultSet;
import net.sourceforge.mayfly.datastore.Cell;
import net.sourceforge.mayfly.evaluation.Expression;
import net.sourceforge.mayfly.evaluation.NoColumn;
import net.sourceforge.mayfly.evaluation.ResultRow;
import net.sourceforge.mayfly.evaluation.expression.ScalarSubselect;
import net.sourceforge.mayfly.evaluation.select.Evaluator;
import net.sourceforge.mayfly.evaluation.select.Select;
public class SubselectedIn extends Condition {
private final Expression leftSide;
private final Select subselect;
public SubselectedIn(Expression leftSide, Select subselect) {
this.leftSide = leftSide;
this.subselect = subselect;
}
@Override
public boolean evaluate(ResultRow row, Evaluator evaluator) {
Cell leftCell = leftSide.evaluate(row, evaluator);
MayflyResultSet rows =
ScalarSubselect.subselect(row, evaluator, subselect);
while (rows.next()) {
Cell aRightSideValue = rows.singleColumn(subselect.location);
if (leftCell.sqlEquals(aRightSideValue)) {
return true;
}
}
return false;
}
@Override
public Condition resolve(ResultRow row, Evaluator evaluator) {
Expression newLeftSide = leftSide.resolve(row, evaluator);
// Probably should be resolving the subselect too.
if (newLeftSide != leftSide) {
return new SubselectedIn(leftSide, subselect);
}
else {
return this;
}
}
@Override
public String firstAggregate() {
return leftSide.firstAggregate();
}
@Override
public void check(ResultRow row) {
leftSide.check(row);
throw NoColumn.dummyExceptionForSubselect(subselect.location);
}
}