mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-23 02:10:44 +01:00
Improve backup export perf by using better batching.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user