From 65082893db0f456e7698bf1e55e97ba3bd0266be Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 4 Jun 2026 12:47:26 -0400 Subject: [PATCH] Add index for scheduled message queries. --- .../thoughtcrime/securesms/database/MessageTable.kt | 12 +++++++----- .../database/helpers/SignalDatabaseMigrations.kt | 6 ++++-- .../migration/V321_AddScheduledMessageIndex.kt | 11 +++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V321_AddScheduledMessageIndex.kt 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 219d3cd527..e17c1d9e7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -320,6 +320,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat private const val INDEX_STARRED = "message_starred_index" private const val INDEX_NOTIFICATION_STATE = "message_notification_state_index" private const val INDEX_RATE_LIMITED = "message_rate_limited_index" + private const val INDEX_SCHEDULED_NON_STORY = "message_scheduled_non_story_index" @JvmField val CREATE_INDEXS = arrayOf( @@ -356,7 +357,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat "CREATE INDEX IF NOT EXISTS $INDEX_NOTIFICATION_STATE ON $TABLE_NAME ($DATE_RECEIVED) WHERE $NOTIFIED = 0 AND $STORY_TYPE = 0 AND $LATEST_REVISION_ID IS NULL", "CREATE INDEX IF NOT EXISTS message_expire_started_index ON $TABLE_NAME ($EXPIRE_STARTED) WHERE $EXPIRE_STARTED > 0", "CREATE INDEX IF NOT EXISTS message_view_once_index ON $TABLE_NAME ($VIEW_ONCE) WHERE $VIEW_ONCE > 0", - "CREATE INDEX IF NOT EXISTS $INDEX_RATE_LIMITED ON $TABLE_NAME ($ID) WHERE ($TYPE & ${MessageTypes.MESSAGE_RATE_LIMITED_BIT}) != 0" + "CREATE INDEX IF NOT EXISTS $INDEX_RATE_LIMITED ON $TABLE_NAME ($ID) WHERE ($TYPE & ${MessageTypes.MESSAGE_RATE_LIMITED_BIT}) != 0", + "CREATE INDEX IF NOT EXISTS $INDEX_SCHEDULED_NON_STORY ON $TABLE_NAME ($SCHEDULED_DATE) WHERE $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE != -1" ) private val MMS_PROJECTION_BASE = arrayOf( @@ -5722,8 +5724,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat fun getScheduledMessagesBefore(time: Long): List { val cursor = readableDatabase .select(*MMS_PROJECTION) - .from(TABLE_NAME) - .where("$STORY_TYPE = ? AND $PARENT_STORY_ID <= ? AND $SCHEDULED_DATE != ? AND $SCHEDULED_DATE <= ?", 0, 0, -1, time) + .from("$TABLE_NAME INDEXED BY $INDEX_SCHEDULED_NON_STORY") + .where("$STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE != -1 AND $SCHEDULED_DATE <= ?", time) .orderBy("$SCHEDULED_DATE ASC, $ID ASC") .run() @@ -5735,8 +5737,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat fun getOldestScheduledSendTimestamp(): MessageRecord? { val cursor = readableDatabase .select(*MMS_PROJECTION) - .from(TABLE_NAME) - .where("$STORY_TYPE = ? AND $PARENT_STORY_ID <= ? AND $SCHEDULED_DATE != ?", 0, 0, -1) + .from("$TABLE_NAME INDEXED BY $INDEX_SCHEDULED_NON_STORY") + .where("$STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE != -1") .orderBy("$SCHEDULED_DATE ASC, $ID ASC") .limit(1) .run() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt index 2d5180c8fd..ef31bfa0a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt @@ -173,6 +173,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V317_AddMessageThre import org.thoughtcrime.securesms.database.helpers.migration.V318_AddMessageNotificationStateIndex import org.thoughtcrime.securesms.database.helpers.migration.V319_AddAttachmentAndMessageIndexes import org.thoughtcrime.securesms.database.helpers.migration.V320_AddAttachmentThumbnailFileAndUuidIndexes +import org.thoughtcrime.securesms.database.helpers.migration.V321_AddScheduledMessageIndex import org.thoughtcrime.securesms.database.SQLiteDatabase as SignalSqliteDatabase /** @@ -353,10 +354,11 @@ object SignalDatabaseMigrations { 317 to V317_AddMessageThreadDateReceivedUnreadIndex, 318 to V318_AddMessageNotificationStateIndex, 319 to V319_AddAttachmentAndMessageIndexes, - 320 to V320_AddAttachmentThumbnailFileAndUuidIndexes + 320 to V320_AddAttachmentThumbnailFileAndUuidIndexes, + 321 to V321_AddScheduledMessageIndex ) - const val DATABASE_VERSION = 320 + const val DATABASE_VERSION = 321 @JvmStatic fun migrate(context: Application, db: SignalSqliteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V321_AddScheduledMessageIndex.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V321_AddScheduledMessageIndex.kt new file mode 100644 index 0000000000..02a6a789b2 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V321_AddScheduledMessageIndex.kt @@ -0,0 +1,11 @@ +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import org.thoughtcrime.securesms.database.SQLiteDatabase + +@Suppress("ClassName") +object V321_AddScheduledMessageIndex : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("CREATE INDEX IF NOT EXISTS message_scheduled_non_story_index ON message (scheduled_date) WHERE story_type = 0 AND parent_story_id <= 0 AND scheduled_date != -1") + } +}