throw new IllegalArgumentException("mismatched columns count in IN "
+ "left : " + leftOperands.size() + ", right: " + operands.size());
for (int i = 0; i < leftOperands.size(); i++) {
ExpressionNode left = toExpression(leftOperands.get(i)
, projects);
TInstance type = typesTranslator.typeForSQLType(subqueryNode.getType());
ConditionExpression cond = new ComparisonCondition(comp, left, operands.get(i),
subqueryNode.getType(), null, type);
inner = andConditions(inner, cond);
}
}
else {
if (operands.size() != 1)
throw new IllegalArgumentException("Subquery must have exactly one column");
multipleOperands = false;
}
}
if (!multipleOperands) {
ExpressionNode left = toExpression(leftOperand, projects);
TInstance type = typesTranslator.typeForSQLType(subqueryNode.getType());
inner = new ComparisonCondition(comp, left, operand,
subqueryNode.getType(),
subqueryNode,
type);
}
// We take this condition back off from the top of the
// physical plan and move it to the expression, but it's
// easier to think about the scoping as evaluated at the
// end of the inner query.
List<ExpressionNode> fields = new ArrayList<>(1);
fields.add(inner);
subquery = new Project(subquery, fields);
if (distinct)
// See InConditionReverser#convert(Select,AnyCondition).
subquery = new Distinct(subquery);
TInstance type = typesTranslator.typeForSQLType(subqueryNode.getType());
condition = new AnyCondition(new Subquery(subquery, peekEquivalenceFinder()),
subqueryNode.getType(), subqueryNode, type);
}
else if (subqueryNode.getSubqueryType() == SubqueryNode.SubqueryType.EXPRESSION) {
ExpressionNode expression = toExpression(subqueryNode);
condition = new BooleanCastExpression(expression, subqueryNode.getType(),
subqueryNode, expression.getType());
}
else {
TInstance type = typesTranslator.typeForSQLType(subqueryNode.getType());
condition = new ExistsCondition(new Subquery(subquery, peekEquivalenceFinder()),
subqueryNode.getType(), subqueryNode, type);
}
if (negate) {
condition = negateCondition(condition, subqueryNode);