The number of params varies but a good limit seems to be 1000. This breaks the tag insert into many 1000 param inserts

This commit is contained in:
Vitor Pamplona
2025-12-09 09:20:17 -05:00
parent e44322adaa
commit f4a0cd5af3
@@ -22,6 +22,7 @@ package com.vitorpamplona.quartz.nip01Core.store.sqlite
import android.database.Cursor import android.database.Cursor
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteStatement
import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent
import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.core.OptimizedJsonMapper import com.vitorpamplona.quartz.nip01Core.core.OptimizedJsonMapper
@@ -127,19 +128,27 @@ class EventIndexesModule(
val tagsToIndex = event.indexableTags() val tagsToIndex = event.indexableTags()
if (tagsToIndex.isNotEmpty()) { val reuseStatements = mutableMapOf<Int, SQLiteStatement>()
for (chunk in tagsToIndex.chunked(300)) {
if (chunk.isNotEmpty()) {
val stmtTags =
reuseStatements.get(chunk.size - 1) ?: run {
val sql = val sql =
buildString { buildString {
append(sqlInsertTags) append(sqlInsertTags)
repeat(tagsToIndex.size - 1) { repeat(chunk.size - 1) {
append(",(?,?,?)") append(",(?,?,?)")
} }
} }
val stmtTags = db.compileStatement(sql) val new = db.compileStatement(sql)
reuseStatements[chunk.size - 1] = new
new
}
var index = 1 var index = 1
tagsToIndex.forEach { tag -> chunk.forEach { tag ->
stmtTags.bindLong(index++, headerId) stmtTags.bindLong(index++, headerId)
stmtTags.bindString(index++, tag[0]) stmtTags.bindString(index++, tag[0])
stmtTags.bindString(index++, tag[1]) stmtTags.bindString(index++, tag[1])
@@ -147,6 +156,7 @@ class EventIndexesModule(
stmtTags.executeInsert() stmtTags.executeInsert()
} }
}
return headerId return headerId
} }