Fix potentially slow migration query.

This commit is contained in:
Greyson Parrelli
2024-10-04 12:48:46 -04:00
parent b0a1e69109
commit 957f17836a

View File

@@ -284,6 +284,8 @@ class AttachmentTable(
) )
""" """
private const val DATA_FILE_INDEX = "attachment_data_index"
@JvmField @JvmField
val CREATE_INDEXS = arrayOf( val CREATE_INDEXS = arrayOf(
"CREATE INDEX IF NOT EXISTS attachment_message_id_index ON $TABLE_NAME ($MESSAGE_ID);", "CREATE INDEX IF NOT EXISTS attachment_message_id_index ON $TABLE_NAME ($MESSAGE_ID);",
@@ -291,7 +293,7 @@ class AttachmentTable(
"CREATE INDEX IF NOT EXISTS attachment_sticker_pack_id_index ON $TABLE_NAME ($STICKER_PACK_ID);", "CREATE INDEX IF NOT EXISTS attachment_sticker_pack_id_index ON $TABLE_NAME ($STICKER_PACK_ID);",
"CREATE INDEX IF NOT EXISTS attachment_data_hash_start_index ON $TABLE_NAME ($DATA_HASH_START);", "CREATE INDEX IF NOT EXISTS attachment_data_hash_start_index ON $TABLE_NAME ($DATA_HASH_START);",
"CREATE INDEX IF NOT EXISTS attachment_data_hash_end_index ON $TABLE_NAME ($DATA_HASH_END);", "CREATE INDEX IF NOT EXISTS attachment_data_hash_end_index ON $TABLE_NAME ($DATA_HASH_END);",
"CREATE INDEX IF NOT EXISTS attachment_data_index ON $TABLE_NAME ($DATA_FILE);", "CREATE INDEX IF NOT EXISTS $DATA_FILE_INDEX ON $TABLE_NAME ($DATA_FILE);",
"CREATE INDEX IF NOT EXISTS attachment_archive_media_id_index ON $TABLE_NAME ($ARCHIVE_MEDIA_ID);", "CREATE INDEX IF NOT EXISTS attachment_archive_media_id_index ON $TABLE_NAME ($ARCHIVE_MEDIA_ID);",
"CREATE INDEX IF NOT EXISTS attachment_archive_transfer_state ON $TABLE_NAME ($ARCHIVE_TRANSFER_STATE);" "CREATE INDEX IF NOT EXISTS attachment_archive_transfer_state ON $TABLE_NAME ($ARCHIVE_TRANSFER_STATE);"
) )
@@ -1420,24 +1422,24 @@ class AttachmentTable(
* This is basically all attachments that have data and are finished downloading. * This is basically all attachments that have data and are finished downloading.
*/ */
fun getDataFilesWithMultipleValidAttachments(): List<String> { fun getDataFilesWithMultipleValidAttachments(): List<String> {
val targetDataFile = "target_data_file"
return readableDatabase return readableDatabase
.select("DISTINCT($DATA_FILE) AS $targetDataFile") .select("DISTINCT(a1.$DATA_FILE)")
.from(TABLE_NAME) .from("$TABLE_NAME a1 INDEXED BY $DATA_FILE_INDEX")
.where( .where(
""" """
$targetDataFile NOT NULL AND a1.$DATA_FILE NOT NULL AND
$TRANSFER_STATE = $TRANSFER_PROGRESS_DONE AND ( a1.$TRANSFER_STATE = $TRANSFER_PROGRESS_DONE AND EXISTS (
SELECT COUNT(*) SELECT 1
FROM $TABLE_NAME FROM $TABLE_NAME a2 INDEXED BY $DATA_FILE_INDEX
WHERE WHERE
$DATA_FILE = $targetDataFile AND a1.$DATA_FILE = a2.$DATA_FILE AND
$TRANSFER_STATE = $TRANSFER_PROGRESS_DONE a2.$TRANSFER_STATE = $TRANSFER_PROGRESS_DONE AND
) > 1 a2.$ID != a1.$ID
)
""" """
) )
.run() .run()
.readToList { it.requireNonNullString(targetDataFile) } .readToList { it.requireNonNullString(DATA_FILE) }
} }
/** /**