From e248aee25c34b758e490ae51807f2e57c7f9151e Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 11 May 2026 16:25:06 -0400 Subject: [PATCH] Improve quote query performance for conversation open. --- .../securesms/database/MessageTable.kt | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 1f9e487038..0bb8b60a79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -32,7 +32,6 @@ import org.signal.core.util.Base64 import org.signal.core.util.CursorUtil import org.signal.core.util.SqlUtil import org.signal.core.util.SqlUtil.buildArgs -import org.signal.core.util.SqlUtil.buildCustomCollectionQuery import org.signal.core.util.SqlUtil.buildSingleCollectionQuery import org.signal.core.util.SqlUtil.buildTrueUpdateQuery import org.signal.core.util.SqlUtil.getNextAutoIncrementId @@ -4909,37 +4908,39 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } val byQuoteDescriptor: MutableMap = HashMap(records.size) - val args: MutableList> = ArrayList(records.size) + val timestamps: MutableList = ArrayList(records.size) for (record in records) { val timestamp = record.dateSent byQuoteDescriptor[QuoteDescriptor(timestamp, record.fromRecipient.id)] = record - args.add(buildArgs(timestamp, record.fromRecipient.id, -1)) + timestamps.add(timestamp) } val quotedIds: MutableSet = mutableSetOf() val pastRevisionMessageIds = records.mapNotNull { it.originalMessageId?.id }.toSet() - buildCustomCollectionQuery("$QUOTE_ID = ? AND $QUOTE_AUTHOR = ? AND $SCHEDULED_DATE = ?", args).forEach { query -> - readableDatabase - .select(ID, QUOTE_ID, QUOTE_AUTHOR) - .from(TABLE_NAME) - .where(query.where, query.whereArgs) - .run() - .forEach { cursor -> - val messageId = cursor.requireLong(ID) - if (messageId !in pastRevisionMessageIds) { - val quoteLocator = QuoteDescriptor( - timestamp = cursor.requireLong(QUOTE_ID), - author = RecipientId.from(cursor.requireNonNullString(QUOTE_AUTHOR)) - ) + val quoteIdQuery = SqlUtil.buildFastCollectionQuery(QUOTE_ID, timestamps) + readableDatabase + .select(ID, QUOTE_ID, QUOTE_AUTHOR) + .from(TABLE_NAME) + .where("${quoteIdQuery.where} AND $SCHEDULED_DATE = -1", quoteIdQuery.whereArgs) + .run() + .forEach { cursor -> + val messageId = cursor.requireLong(ID) + if (messageId !in pastRevisionMessageIds) { + val quoteLocator = QuoteDescriptor( + timestamp = cursor.requireLong(QUOTE_ID), + author = RecipientId.from(cursor.requireNonNullString(QUOTE_AUTHOR)) + ) + + if (byQuoteDescriptor.containsKey(quoteLocator)) { quotedIds += byQuoteDescriptor[quoteLocator]!!.id } } - } + } return quotedIds }