override fun toQueryBuilder()

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()
                }
            }
        }
    }