Most databases reject WHERE id IN (...) when the list is too long — Oracle caps at 1,000, and even on PostgreSQL a 50K-element IN can blow the query plan cache. Split a flat list of IDs into chunks and emit one SQL statement per chunk.
Used in Synthesized.io's read pipeline whenever subset IDs exceed the dialect's safe IN-clause size.
//sampleStart
fun buildChunkedQueries(table: String, column: String, ids: List<Long>, chunkSize: Int): List<String> {
// Split ids into chunks of chunkSize
// For each chunk: build "SELECT * FROM table WHERE column IN (1,2,3)"
// Return list of SQL strings
TODO()
}
//sampleEnd
fun main() {
// Test 1: 10 ids, chunk 3
val r1 = buildChunkedQueries("users", "id", (1L..10L).toList(), 3)
check(r1.size == 4) { "FAIL: 10/3 = 4 chunks. Got ${r1.size}" }
check(r1[0].contains("IN (1,2,3)") || r1[0].contains("IN (1, 2, 3)")) { "FAIL: first chunk has 3 ids" }
check(r1[3].contains("10")) { "FAIL: last chunk has remaining id" }
println("✅ Test 1: ${r1.size} chunks")
// Test 2: Empty ids
val r2 = buildChunkedQueries("users", "id", emptyList(), 5)
check(r2.isEmpty()) { "FAIL: empty ids → empty result" }
println("✅ Test 2: Empty ids")
// Test 3: Chunk larger than ids
val r3 = buildChunkedQueries("users", "id", listOf(1L, 2L), 100)
check(r3.size == 1) { "FAIL: should be single query" }
println("✅ Test 3: Single query")
// Test 4: Exact multiple
val r4 = buildChunkedQueries("users", "id", (1L..9L).toList(), 3)
check(r4.size == 3) { "FAIL: 9/3 = 3 chunks exactly" }
println("✅ Test 4: Exact multiple — ${r4.size} chunks")
// Test 5: Each query is valid SQL
for (q in r1) {
check(q.startsWith("SELECT * FROM users WHERE id IN (")) { "FAIL: invalid SQL: $q" }
check(q.endsWith(")")) { "FAIL: should end with )" }
}
println("✅ Test 5: Valid SQL format")
println("\n🎉 ALL TESTS PASSED!")
}
Hint
Kotlin's stdlib has List.chunked(size). For each chunk, joinToString(",") the ids and template-string the SQL.
Solution
fun buildChunkedQueries(table: String, column: String, ids: List<Long>, chunkSize: Int): List<String> {
return ids.chunked(chunkSize).map { chunk ->
"SELECT * FROM $table WHERE $column IN (${chunk.joinToString(",")})"
}
}