package net.sourceforge.mayfly.evaluation.condition; import net.sourceforge.mayfly.datastore.Cell; import net.sourceforge.mayfly.evaluation.Expression; import net.sourceforge.mayfly.evaluation.ResultRow; import net.sourceforge.mayfly.evaluation.select.Evaluator; import net.sourceforge.mayfly.util.ImmutableList; import net.sourceforge.mayfly.util.L; public class In extends Condition { public final Expression leftSide; public final ImmutableList<Expression> expressions; public In(Expression leftSide, ImmutableList<Expression> expressions) { this.leftSide = leftSide; this.expressions = expressions; } @Override public boolean evaluate(ResultRow row, Evaluator evaluator) { Cell leftSideValue = leftSide.evaluate(row, evaluator); for (Expression element : expressions) { Cell aRightSideValue = element.evaluate(row, evaluator); if (leftSideValue.sqlEquals(aRightSideValue)) { return true; } } return false; } @Override public Condition resolve(ResultRow row, Evaluator evaluator) { boolean resolvedSomething = false; Expression newLeftSide = leftSide.resolve(row, evaluator); if (newLeftSide != leftSide) { resolvedSomething = true; } L<Expression> newRightSide = new L<Expression>(); for (Expression aRightSide : expressions) { Expression resolved = aRightSide.resolve(row, evaluator); if (resolved != aRightSide) { resolvedSomething = true; } newRightSide.add(resolved); } if (resolvedSomething) { return new In(newLeftSide, newRightSide.asImmutable()); } else { return this; } } @Override public String firstAggregate() { String firstInLeft = leftSide.firstAggregate(); if (firstInLeft != null) { return firstInLeft; } for (Expression element : expressions) { String first = element.firstAggregate(); if (first != null) { return first; } } return null; } @Override public void check(ResultRow row) { leftSide.check(row); for (Expression expression : expressions) { expression.check(row); } } }