Add call log index to call table.

This commit is contained in:
Alex Hart 2024-10-22 15:00:36 -03:00 committed by Greyson Parrelli
parent 88b39a062c
commit c291d84738
3 changed files with 51 additions and 20 deletions

View file

@ -104,13 +104,15 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
) )
""" """
const val CALL_LOG_INDEX = "call_log_index"
val CREATE_INDEXES = arrayOf( val CREATE_INDEXES = arrayOf(
"CREATE INDEX call_call_id_index ON $TABLE_NAME ($CALL_ID)", "CREATE INDEX call_call_id_index ON $TABLE_NAME ($CALL_ID)",
"CREATE INDEX call_message_id_index ON $TABLE_NAME ($MESSAGE_ID)", "CREATE INDEX call_message_id_index ON $TABLE_NAME ($MESSAGE_ID)",
"CREATE INDEX call_peer_index ON $TABLE_NAME ($PEER)" "CREATE INDEX call_peer_index ON $TABLE_NAME ($PEER)",
"CREATE INDEX $CALL_LOG_INDEX ON $TABLE_NAME ($TIMESTAMP, $PEER, $EVENT, $TYPE, $DELETION_TIMESTAMP)"
) )
} }
fun markAllCallEventsRead(timestamp: Long = Long.MAX_VALUE) { fun markAllCallEventsRead(timestamp: Long = Long.MAX_VALUE) {
val updateCount = writableDatabase val updateCount = writableDatabase
.update(TABLE_NAME) .update(TABLE_NAME)
@ -1269,9 +1271,28 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
} }
val projection = if (isCount) { val projection = if (isCount) {
"COUNT(*) OVER() as count," "COUNT(*) OVER() as count"
} else { } else {
"p.$ID, p.$TIMESTAMP, $EVENT, $DIRECTION, $PEER, p.$TYPE, $CALL_ID, $MESSAGE_ID, $RINGER, $LOCAL_JOINED, $GROUP_CALL_ACTIVE, children, in_period, ${MessageTable.BODY}," "p.$ID, p.$TIMESTAMP, $EVENT, $DIRECTION, $PEER, p.$TYPE, $CALL_ID, $MESSAGE_ID, $RINGER, $LOCAL_JOINED, $GROUP_CALL_ACTIVE, children, in_period, ${MessageTable.BODY}"
}
val recipientSearchProjection = if (searchTerm.isNullOrEmpty()) {
""
} else {
"""
,LOWER(
COALESCE(
NULLIF(${GroupTable.TABLE_NAME}.${GroupTable.TITLE}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.NICKNAME_JOINED_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.NICKNAME_GIVEN_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.SYSTEM_JOINED_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.SYSTEM_GIVEN_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.PROFILE_JOINED_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.PROFILE_GIVEN_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.USERNAME}, '')
)
) AS sort_name
""".trimIndent()
} }
val join = if (isCount) { val join = if (isCount) {
@ -1305,18 +1326,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
//language=sql //language=sql
val statement = """ val statement = """
SELECT $projection SELECT $projection
LOWER( $recipientSearchProjection
COALESCE(
NULLIF(${GroupTable.TABLE_NAME}.${GroupTable.TITLE}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.NICKNAME_JOINED_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.NICKNAME_GIVEN_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.SYSTEM_JOINED_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.SYSTEM_GIVEN_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.PROFILE_JOINED_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.PROFILE_GIVEN_NAME}, ''),
NULLIF(${RecipientTable.TABLE_NAME}.${RecipientTable.USERNAME}, '')
)
) AS sort_name
FROM ( FROM (
WITH cte AS ( WITH cte AS (
SELECT SELECT
@ -1360,7 +1370,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
AND ${filterClause.where} AND ${filterClause.where}
) as in_period ) as in_period
FROM FROM
$TABLE_NAME c $TABLE_NAME c INDEXED BY $CALL_LOG_INDEX
WHERE ${filterClause.where} WHERE ${filterClause.where}
ORDER BY ORDER BY
$TIMESTAMP DESC $TIMESTAMP DESC
@ -1427,7 +1437,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
} }
fun getCallsCount(searchTerm: String?, filter: CallLogFilter): Int { fun getCallsCount(searchTerm: String?, filter: CallLogFilter): Int {
return getCallsCursor(true, 0, 0, searchTerm, filter).use { return getCallsCursor(true, 0, 1, searchTerm, filter).use {
if (it.moveToFirst()) { if (it.moveToFirst()) {
it.getInt(0) it.getInt(0)
} else { } else {

View file

@ -111,6 +111,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V251_ArchiveTransfe
import org.thoughtcrime.securesms.database.helpers.migration.V252_AttachmentOffloadRestoredAtColumn import org.thoughtcrime.securesms.database.helpers.migration.V252_AttachmentOffloadRestoredAtColumn
import org.thoughtcrime.securesms.database.helpers.migration.V253_CreateChatFolderTables import org.thoughtcrime.securesms.database.helpers.migration.V253_CreateChatFolderTables
import org.thoughtcrime.securesms.database.helpers.migration.V254_AddChatFolderConstraint import org.thoughtcrime.securesms.database.helpers.migration.V254_AddChatFolderConstraint
import org.thoughtcrime.securesms.database.helpers.migration.V255_AddCallTableLogIndex
/** /**
* Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness. * Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness.
@ -224,10 +225,11 @@ object SignalDatabaseMigrations {
251 to V251_ArchiveTransferStateIndex, 251 to V251_ArchiveTransferStateIndex,
252 to V252_AttachmentOffloadRestoredAtColumn, 252 to V252_AttachmentOffloadRestoredAtColumn,
253 to V253_CreateChatFolderTables, 253 to V253_CreateChatFolderTables,
254 to V254_AddChatFolderConstraint 254 to V254_AddChatFolderConstraint,
255 to V255_AddCallTableLogIndex
) )
const val DATABASE_VERSION = 254 const val DATABASE_VERSION = 255
@JvmStatic @JvmStatic
fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {

View file

@ -0,0 +1,19 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.database.helpers.migration
import android.app.Application
import net.zetetic.database.sqlcipher.SQLiteDatabase
/**
* Adds timestamp index to call table to speed up queries.
*/
@Suppress("ClassName")
object V255_AddCallTableLogIndex : SignalDatabaseMigration {
override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("CREATE INDEX IF NOT EXISTS call_log_index ON call (timestamp, peer, event, type, deletion_timestamp)")
}
}