Improve backup export perf by using better batching.

This commit is contained in:
Greyson Parrelli
2024-10-24 13:46:13 -04:00
parent ec736afde4
commit ebca386dcb
9 changed files with 252 additions and 142 deletions

View File

@@ -434,7 +434,7 @@ class AttachmentTable(
return emptyMap()
}
val query = SqlUtil.buildSingleCollectionQuery(MESSAGE_ID, mmsIds)
val query = SqlUtil.buildFastCollectionQuery(MESSAGE_ID, mmsIds)
return readableDatabase
.select(*PROJECTION)

View File

@@ -140,20 +140,17 @@ class GroupReceiptTable(context: Context?, databaseHelper: SignalDatabase?) : Da
val messageIdsToGroupReceipts: MutableMap<Long, MutableList<GroupReceiptInfo>> = mutableMapOf()
val args: List<Array<String>> = ids.map { SqlUtil.buildArgs(it) }
SqlUtil.buildCustomCollectionQuery("$MMS_ID = ?", args).forEach { query ->
readableDatabase
.select()
.from(TABLE_NAME)
.where(query.where, query.whereArgs)
.run()
.forEach { cursor ->
val messageId = cursor.requireLong(MMS_ID)
val receipts = messageIdsToGroupReceipts.getOrPut(messageId) { mutableListOf() }
receipts += cursor.toGroupReceiptInfo()
}
}
val query = SqlUtil.buildFastCollectionQuery(MMS_ID, ids)
readableDatabase
.select()
.from(TABLE_NAME)
.where(query.where, query.whereArgs)
.run()
.forEach { cursor ->
val messageId = cursor.requireLong(MMS_ID)
val receipts = messageIdsToGroupReceipts.getOrPut(messageId) { mutableListOf() }
receipts += cursor.toGroupReceiptInfo()
}
return messageIdsToGroupReceipts
}

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.database
import android.content.Context
import android.database.Cursor
import org.signal.core.util.SqlUtil
import org.signal.core.util.delete
import org.signal.core.util.deleteAll
import org.signal.core.util.insertInto
@@ -77,12 +78,16 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
}
fun getMentionsForMessages(messageIds: Collection<Long>): Map<Long, List<Mention>> {
val ids = messageIds.joinToString(separator = ",") { it.toString() }
if (messageIds.isEmpty()) {
return emptyMap()
}
val query = SqlUtil.buildFastCollectionQuery(MESSAGE_ID, messageIds)
return readableDatabase
.select()
.from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID IN ($ids)")
.where(query.where, query.whereArgs)
.run()
.use { cursor -> readMentions(cursor) }
}

View File

@@ -6,6 +6,8 @@ import android.database.Cursor
import org.signal.core.util.CursorUtil
import org.signal.core.util.SqlUtil
import org.signal.core.util.delete
import org.signal.core.util.forEach
import org.signal.core.util.select
import org.signal.core.util.update
import org.thoughtcrime.securesms.database.model.MessageId
import org.thoughtcrime.securesms.database.model.ReactionRecord
@@ -77,25 +79,25 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
val messageIdToReactions: MutableMap<Long, MutableList<ReactionRecord>> = mutableMapOf()
val args: List<Array<String>> = messageIds.map { SqlUtil.buildArgs(it) }
val query = SqlUtil.buildFastCollectionQuery(MESSAGE_ID, messageIds)
readableDatabase
.select()
.from(TABLE_NAME)
.where(query.where, query.whereArgs)
.run()
.forEach { cursor ->
val reaction: ReactionRecord = readReaction(cursor)
val messageId = CursorUtil.requireLong(cursor, MESSAGE_ID)
for (query: SqlUtil.Query in SqlUtil.buildCustomCollectionQuery("$MESSAGE_ID = ?", args)) {
readableDatabase.query(TABLE_NAME, null, query.where, query.whereArgs, null, null, null).use { cursor ->
while (cursor.moveToNext()) {
val reaction: ReactionRecord = readReaction(cursor)
val messageId = CursorUtil.requireLong(cursor, MESSAGE_ID)
var reactionsList: MutableList<ReactionRecord>? = messageIdToReactions[messageId]
var reactionsList: MutableList<ReactionRecord>? = messageIdToReactions[messageId]
if (reactionsList == null) {
reactionsList = mutableListOf()
messageIdToReactions[messageId] = reactionsList
}
reactionsList.add(reaction)
if (reactionsList == null) {
reactionsList = mutableListOf()
messageIdToReactions[messageId] = reactionsList
}
reactionsList.add(reaction)
}
}
return messageIdToReactions
}