From e7396c39e6355d49b649a31f2c2ccc2ad94c0264 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sun, 26 Jan 2025 10:37:50 -0600 Subject: [PATCH] Move useReaderConnection to content provider --- .../tasks/activities/FilterSettingsViewModel.kt | 17 +++++++---------- .../tasks/data/ContentProviderDaoBlocking.kt | 7 ++++++- .../java/org/tasks/data/TaskDaoExtensions.kt | 8 +------- .../org/tasks/data/RoomDatabaseExtensions.kt | 5 ----- .../kotlin/org/tasks/data/dao/TaskDao.kt | 8 +++++++- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsViewModel.kt b/app/src/main/java/org/tasks/activities/FilterSettingsViewModel.kt index 7d56ba4a9..248265d80 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsViewModel.kt +++ b/app/src/main/java/org/tasks/activities/FilterSettingsViewModel.kt @@ -16,10 +16,9 @@ import kotlinx.coroutines.launch import org.tasks.activities.FilterSettingsActivity.Companion.EXTRA_CRITERIA import org.tasks.activities.FilterSettingsActivity.Companion.TOKEN_FILTER import org.tasks.data.dao.FilterDao +import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible -import org.tasks.data.db.Database import org.tasks.data.entity.Task -import org.tasks.data.rawQuery import org.tasks.data.sql.Field import org.tasks.data.sql.Query import org.tasks.data.sql.UnaryCriterion @@ -33,8 +32,8 @@ import kotlin.math.max class FilterSettingsViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val filterCriteriaProvider: FilterCriteriaProvider, - private val database: Database, private val filterDao: FilterDao, + private val taskDao: TaskDao, ) : ViewModel() { data class ViewState( val filter: CustomFilter? = null, @@ -127,13 +126,11 @@ class FilterSettingsViewModel @Inject constructor( sql.append(Task.ID).append(" IN (").append(subSql).append(")") } val sqlString = QueryUtils.showHiddenAndCompleted(sql.toString()) - database.rawQuery(sqlString) { cursor -> - cursor.step() - instance.start = if (last == -1) cursor.getInt(0) else last - instance.end = cursor.getInt(0) - last = instance.end - max = max(max, last) - } + val count = taskDao.count(sqlString) + instance.start = if (last == -1) count else last + instance.end = count + last = instance.end + max = max(max, last) newList.add(instance) } for (instance in newList) { diff --git a/app/src/main/java/org/tasks/data/ContentProviderDaoBlocking.kt b/app/src/main/java/org/tasks/data/ContentProviderDaoBlocking.kt index 33f29ab19..e75754f3e 100644 --- a/app/src/main/java/org/tasks/data/ContentProviderDaoBlocking.kt +++ b/app/src/main/java/org/tasks/data/ContentProviderDaoBlocking.kt @@ -2,6 +2,7 @@ package org.tasks.data import android.database.Cursor import android.database.MatrixCursor +import androidx.room.useReaderConnection import androidx.sqlite.SQLiteStatement import kotlinx.coroutines.runBlocking import org.tasks.data.dao.Astrid2ContentProviderDao @@ -37,7 +38,11 @@ class ContentProviderDaoBlocking @Inject constructor( ) } - fun rawQuery(query: String): Cursor = runBlocking { database.rawQuery(query) { it.toCursor() } } + fun rawQuery(query: String): Cursor = runBlocking { + database.useReaderConnection { transactor -> + transactor.usePrepared(query) { it.toCursor() } + } + } } private fun SQLiteStatement.toCursor(): Cursor { diff --git a/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt b/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt index c5eb44e16..10f9b5c86 100644 --- a/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt +++ b/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt @@ -31,13 +31,7 @@ suspend fun TaskDao.fetchFiltered(queryTemplate: String): List { return tasks.map(TaskContainer::task) } -suspend fun TaskDao.count(filter: Filter): Int { - val query = getQuery(filter.sql!!, Field.COUNT) - val start = if (BuildConfig.DEBUG) currentTimeMillis() else 0 - val count = countRaw(query) - Timber.v("%sms: %s", currentTimeMillis() - start, query) - return count -} +suspend fun TaskDao.count(filter: Filter): Int = count(getQuery(filter.sql!!, Field.COUNT)) private fun getQuery(queryTemplate: String, vararg fields: Field): String = Query.select(*fields) diff --git a/data/src/commonMain/kotlin/org/tasks/data/RoomDatabaseExtensions.kt b/data/src/commonMain/kotlin/org/tasks/data/RoomDatabaseExtensions.kt index f561572bb..e5dbc639b 100644 --- a/data/src/commonMain/kotlin/org/tasks/data/RoomDatabaseExtensions.kt +++ b/data/src/commonMain/kotlin/org/tasks/data/RoomDatabaseExtensions.kt @@ -3,9 +3,7 @@ package org.tasks.data import androidx.room.RoomDatabase import androidx.room.TransactionScope import androidx.room.Transactor -import androidx.room.useReaderConnection import androidx.room.useWriterConnection -import androidx.sqlite.SQLiteStatement suspend fun RoomDatabase.withTransaction(block: suspend TransactionScope.() -> T): T = useWriterConnection { transactor -> @@ -13,6 +11,3 @@ suspend fun RoomDatabase.withTransaction(block: suspend TransactionScope. block() } } - -suspend fun RoomDatabase.rawQuery(query: String, block: (SQLiteStatement) -> T): T = - useReaderConnection { transactor -> transactor.usePrepared(query) { block(it) } } diff --git a/data/src/commonMain/kotlin/org/tasks/data/dao/TaskDao.kt b/data/src/commonMain/kotlin/org/tasks/data/dao/TaskDao.kt index bbf1b4224..a02c32a1d 100644 --- a/data/src/commonMain/kotlin/org/tasks/data/dao/TaskDao.kt +++ b/data/src/commonMain/kotlin/org/tasks/data/dao/TaskDao.kt @@ -129,7 +129,13 @@ FROM ( @RawQuery internal abstract suspend fun fetchRaw(query: RoomRawQuery): List - suspend fun countRaw(query: String): Int = countRaw(RoomRawQuery(query)) + suspend fun count(query: String): Int { + val start = DateTimeUtils2.currentTimeMillis() + val result = countRaw(RoomRawQuery(query)) + val end = DateTimeUtils2.currentTimeMillis() + Logger.v("TaskDao") { "${end - start}ms: ${query.replace(Regex("\\s+"), " ").trim()}" } + return result + } @RawQuery internal abstract suspend fun countRaw(query: RoomRawQuery): Int