Specify indexes for mention table queries.

This commit is contained in:
Greyson Parrelli
2024-04-05 16:54:48 -04:00
parent 8793981804
commit 713298109a

View File

@@ -36,9 +36,12 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
) )
""" """
private const val MESSAGE_ID_INDEX = "mention_message_id_index"
private const val RECIPIENT_ID_INDEX = "mention_recipient_id_thread_id_index "
val CREATE_INDEXES = arrayOf( val CREATE_INDEXES = arrayOf(
"CREATE INDEX IF NOT EXISTS mention_message_id_index ON $TABLE_NAME ($MESSAGE_ID);", "CREATE INDEX IF NOT EXISTS $MESSAGE_ID_INDEX ON $TABLE_NAME ($MESSAGE_ID);",
"CREATE INDEX IF NOT EXISTS mention_recipient_id_thread_id_index ON $TABLE_NAME ($RECIPIENT_ID, $THREAD_ID);" "CREATE INDEX IF NOT EXISTS $RECIPIENT_ID_INDEX ON $TABLE_NAME ($RECIPIENT_ID, $THREAD_ID);"
) )
} }
@@ -61,7 +64,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
fun getMentionsForMessage(messageId: Long): List<Mention> { fun getMentionsForMessage(messageId: Long): List<Mention> {
return readableDatabase return readableDatabase
.select() .select()
.from(TABLE_NAME) .from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID = $messageId") .where("$MESSAGE_ID = $messageId")
.run() .run()
.readToList { cursor -> .readToList { cursor ->
@@ -78,7 +81,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
return readableDatabase return readableDatabase
.select() .select()
.from(TABLE_NAME) .from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID IN ($ids)") .where("$MESSAGE_ID IN ($ids)")
.run() .run()
.use { cursor -> readMentions(cursor) } .use { cursor -> readMentions(cursor) }
@@ -98,7 +101,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
return readableDatabase return readableDatabase
.select() .select()
.from(TABLE_NAME) .from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where( .where(
""" """
$MESSAGE_ID IN ( $MESSAGE_ID IN (
@@ -115,18 +118,18 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
fun deleteMentionsForMessage(messageId: Long) { fun deleteMentionsForMessage(messageId: Long) {
writableDatabase writableDatabase
.delete(TABLE_NAME) .delete("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID = $messageId") .where("$MESSAGE_ID = $messageId")
.run() .run()
} }
fun deleteAbandonedMentions() { fun deleteAbandonedMentions() {
writableDatabase writableDatabase
.delete(TABLE_NAME) .delete("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where( .where(
""" """
$MESSAGE_ID NOT IN ( $MESSAGE_ID NOT IN (
SELECT $MessageTable.ID SELECT ${MessageTable.ID}
FROM ${MessageTable.TABLE_NAME} FROM ${MessageTable.TABLE_NAME}
) )
OR $THREAD_ID NOT IN ( OR $THREAD_ID NOT IN (
@@ -158,7 +161,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
override fun remapRecipient(fromId: RecipientId, toId: RecipientId) { override fun remapRecipient(fromId: RecipientId, toId: RecipientId) {
writableDatabase writableDatabase
.update(TABLE_NAME) .update("$TABLE_NAME INDEXED BY $RECIPIENT_ID_INDEX")
.values(RECIPIENT_ID to toId.serialize()) .values(RECIPIENT_ID to toId.serialize())
.where("$RECIPIENT_ID = ?", fromId) .where("$RECIPIENT_ID = ?", fromId)
.run() .run()
@@ -166,7 +169,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
override fun remapThread(fromId: Long, toId: Long) { override fun remapThread(fromId: Long, toId: Long) {
writableDatabase writableDatabase
.update(TABLE_NAME) .update("$TABLE_NAME INDEXED BY $RECIPIENT_ID_INDEX")
.values(THREAD_ID to toId) .values(THREAD_ID to toId)
.where("$THREAD_ID = $fromId") .where("$THREAD_ID = $fromId")
.run() .run()