Improve thread delete performance.

This commit is contained in:
Cody Henthorne
2025-01-24 11:36:49 -05:00
committed by Greyson Parrelli
parent f65cebdada
commit bc09df97b0

View File

@@ -3486,44 +3486,47 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
}
fun deleteMessagesInThread(threadIds: Collection<Long>, extraWhere: String = ""): Int {
var deletedCount = 0
var totalDeletedCount = 0
writableDatabase.withinTransaction { db ->
SignalDatabase.messageSearch.dropAfterMessageDeleteTrigger()
SignalDatabase.messageLog.dropAfterMessageDeleteTrigger()
for (threadId in threadIds) {
val subSelect = "SELECT ${TABLE_NAME}.$ID FROM $TABLE_NAME WHERE ${TABLE_NAME}.$THREAD_ID = $threadId $extraWhere"
val subSelect = "SELECT ${TABLE_NAME}.$ID FROM $TABLE_NAME WHERE ${TABLE_NAME}.$THREAD_ID = $threadId $extraWhere LIMIT 1000"
do {
// Bulk deleting FK tables for large message delete efficiency
db.delete(StorySendTable.TABLE_NAME)
.where("${StorySendTable.TABLE_NAME}.${StorySendTable.MESSAGE_ID} IN ($subSelect)")
.run()
// Bulk deleting FK tables for large message delete efficiency
db.delete(StorySendTable.TABLE_NAME)
.where("${StorySendTable.TABLE_NAME}.${StorySendTable.MESSAGE_ID} IN ($subSelect)")
.run()
db.delete(ReactionTable.TABLE_NAME)
.where("${ReactionTable.TABLE_NAME}.${ReactionTable.MESSAGE_ID} IN ($subSelect)")
.run()
db.delete(ReactionTable.TABLE_NAME)
.where("${ReactionTable.TABLE_NAME}.${ReactionTable.MESSAGE_ID} IN ($subSelect)")
.run()
db.delete(CallTable.TABLE_NAME)
.where("${CallTable.TABLE_NAME}.${CallTable.MESSAGE_ID} IN ($subSelect)")
.run()
db.delete(CallTable.TABLE_NAME)
.where("${CallTable.TABLE_NAME}.${CallTable.MESSAGE_ID} IN ($subSelect)")
.run()
// Must delete rows from FTS table before deleting from main table due to FTS requirement when deleting by rowid
db.delete(SearchTable.FTS_TABLE_NAME)
.where("${SearchTable.FTS_TABLE_NAME}.${SearchTable.ID} IN ($subSelect)")
.run()
// Must delete rows from FTS table before deleting from main table due to FTS requirement when deleting by rowid
db.delete(SearchTable.FTS_TABLE_NAME)
.where("${SearchTable.FTS_TABLE_NAME}.${SearchTable.ID} IN ($subSelect)")
.run()
// Actually delete messages
val deletedCount = db.delete(TABLE_NAME)
.where("$ID IN ($subSelect)")
.run()
// Actually delete messages
deletedCount += db.delete(TABLE_NAME)
.where("$THREAD_ID = ? $extraWhere", threadId)
.run()
totalDeletedCount += deletedCount
} while (deletedCount > 0)
}
SignalDatabase.messageSearch.restoreAfterMessageDeleteTrigger()
SignalDatabase.messageLog.restoreAfterMessageDeleteTrigger()
}
return deletedCount
return totalDeletedCount
}
fun deleteAbandonedMessages(threadId: Long? = null): Int {