in exposed-core/src/main/kotlin/org/jetbrains/exposed/v1/core/ops/InListOps.kt [147:185]
override fun toQueryBuilder(queryBuilder: QueryBuilder) {
// SQL Server does not support IN operator with tuples (or any more than 1 expression on the left-hand side)
if (currentDialectIfAvailable !is SQLServerDialect) return super.toQueryBuilder(queryBuilder)
queryBuilder {
val iterator = list.iterator()
if (!iterator.hasNext()) {
if (isInList) {
+FALSE
} else {
+TRUE
}
} else {
// Generates compound AND & OR operators for each values list:
// WHERE
// ((tester.num_1 = 0) AND (tester.num_2 = 0.0) AND (tester.num_3 = '0') AND (tester.num_4 = 0)) OR
// ((tester.num_1 = 1) AND (tester.num_2 = 1.0) AND (tester.num_3 = '1') AND (tester.num_4 = 1)) OR
// ((tester.num_1 = 2) AND (tester.num_2 = 2.0) AND (tester.num_3 = '2') AND (tester.num_4 = 2))
// Alternative: EXISTS (SELECT * FROM (VALUES (...), (...), ...) v(...) WHERE v.?=? AND ...)
// Built-in exists(AbstractQuery) cannot be used because above row value constructors are not supported
val valueEqualityOps = mutableListOf<Op<Boolean>>()
iterator.forEach { value ->
val valueEqualityOp = expr.zip(value).map { (column, value) ->
EqOp(column, column.wrap(value))
}.compoundAnd()
valueEqualityOps.add(if (isInList) valueEqualityOp else not(valueEqualityOp))
}
if (isInList) {
+valueEqualityOps.compoundOr()
} else {
+valueEqualityOps.compoundAnd()
}
}
}
}