diff --git a/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt b/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt index a64fb4b02..90a065329 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt @@ -223,7 +223,7 @@ class CaldavManualSortTaskAdapterTest : InjectingTestCase() { } private fun move(from: Int, to: Int, indent: Int = 0) = runBlocking { - tasks.addAll(taskDao.fetchTasks { getQuery(preferences, filter) }) + tasks.addAll(taskDao.fetchTasks(getQuery(preferences, filter))) val adjustedTo = if (from < to) to + 1 else to // match DragAndDropRecyclerAdapter behavior adapter.moved(from, adjustedTo, indent) } diff --git a/app/src/androidTest/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapterTest.kt b/app/src/androidTest/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapterTest.kt index eca69485c..7f9ff91b9 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapterTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapterTest.kt @@ -426,7 +426,7 @@ class GoogleTaskManualSortAdapterTest : InjectingTestCase() { } private fun move(from: Int, to: Int, indent: Int = 0) = runBlocking { - tasks.addAll(taskDao.fetchTasks { getQuery(preferences, filter) }) + tasks.addAll(taskDao.fetchTasks(getQuery(preferences, filter))) val adjustedTo = if (from < to) to + 1 else to adapter.moved(from, adjustedTo, indent) } diff --git a/app/src/androidTest/java/com/todoroo/astrid/adapter/OfflineSubtaskTest.kt b/app/src/androidTest/java/com/todoroo/astrid/adapter/OfflineSubtaskTest.kt index 46a7dd543..ce10b0533 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/adapter/OfflineSubtaskTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/adapter/OfflineSubtaskTest.kt @@ -84,6 +84,6 @@ class OfflineSubtaskTest : InjectingTestCase() { } private fun query() = runBlocking { - tasks.addAll(taskDao.fetchTasks { getQuery(preferences, filter) }) + tasks.addAll(taskDao.fetchTasks(getQuery(preferences, filter))) } } \ No newline at end of file diff --git a/app/src/androidTest/java/com/todoroo/astrid/adapter/RecursiveLoopTest.kt b/app/src/androidTest/java/com/todoroo/astrid/adapter/RecursiveLoopTest.kt index c363e7612..fbb4e5991 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/adapter/RecursiveLoopTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/adapter/RecursiveLoopTest.kt @@ -75,9 +75,9 @@ class RecursiveLoopTest : InjectingTestCase() { assertEquals(grandchild, tasks[2].id) } - private suspend fun getTasks() = taskDao.fetchTasks { + private suspend fun getTasks() = taskDao.fetchTasks( getQuery(preferences, TodayFilter.create()) - } + ) private suspend fun addTask(vararg properties: PropertyValue): Long { val task = newTask(*properties) diff --git a/app/src/androidTest/java/org/tasks/data/ManualGoogleTaskQueryTest.kt b/app/src/androidTest/java/org/tasks/data/ManualGoogleTaskQueryTest.kt index a52fbb450..17ecfbfe0 100644 --- a/app/src/androidTest/java/org/tasks/data/ManualGoogleTaskQueryTest.kt +++ b/app/src/androidTest/java/org/tasks/data/ManualGoogleTaskQueryTest.kt @@ -105,7 +105,7 @@ class ManualGoogleTaskQueryTest : InjectingTestCase() { googleTaskDao.insert(newCaldavTask(with(CALENDAR, filter.uuid), with(TASK, id))) } - private suspend fun query(): List = taskDao.fetchTasks { + private suspend fun query(): List = taskDao.fetchTasks( TaskListQuery.getQuery(preferences, filter) - } + ) } \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt index 9e50cffea..bc3141cef 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt @@ -144,8 +144,8 @@ class TaskDao @Inject constructor( internal suspend fun insert(task: Task): Long = taskDao.insert(task) - internal suspend fun fetchTasks(callback: suspend () -> List): List = - taskDao.fetchTasks(callback) + internal suspend fun fetchTasks(queries: List): List = + taskDao.fetchTasks(queries) internal suspend fun getAll(): List = taskDao.getAll() diff --git a/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt b/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt index b78c5f745..c5eb44e16 100644 --- a/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt +++ b/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt @@ -12,9 +12,7 @@ import org.tasks.time.DateTimeUtils2.currentTimeMillis import timber.log.Timber suspend fun TaskDao.fetchTasks(preferences: QueryPreferences, filter: Filter): List = - fetchTasks { - TaskListQuery.getQuery(preferences, filter) - } + fetchTasks(TaskListQuery.getQuery(preferences, filter)) internal suspend fun TaskDao.setCollapsed(preferences: QueryPreferences, filter: Filter, collapsed: Boolean) { fetchTasks(preferences, filter) diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt index 2c6c20095..ca3260e7f 100644 --- a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt @@ -144,7 +144,7 @@ class TaskListViewModel @Inject constructor( it.searchQuery.isBlank() -> MyTasksFilter.create() else -> applicationContext.createSearchQuery(it.searchQuery) } - taskDao.fetchTasks { getQuery(preferences, filter) } + taskDao.fetchTasks(getQuery(preferences, filter)) } .onEach { tasks -> _state.update { diff --git a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt index 73642360b..ffda932e7 100644 --- a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt +++ b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt @@ -70,7 +70,7 @@ internal class TasksWidgetViewFactory( runBlocking { val collapsed = widgetPreferences.collapsed tasks = SectionedDataSource( - taskDao.fetchTasks { getQuery(filter) }, + taskDao.fetchTasks(getQuery(filter)), disableGroups, settings.groupMode, widgetPreferences.subtaskMode, 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 6ef15447a..bbf1b4224 100644 --- a/data/src/commonMain/kotlin/org/tasks/data/dao/TaskDao.kt +++ b/data/src/commonMain/kotlin/org/tasks/data/dao/TaskDao.kt @@ -110,10 +110,9 @@ FROM ( + "WHERE completed > 0 AND calendarUri IS NOT NULL AND calendarUri != ''") abstract suspend fun clearCompletedCalendarEvents(): Int - open suspend fun fetchTasks(callback: suspend () -> List): List = + open suspend fun fetchTasks(queries: List): List = database.withTransaction { val start = if (IS_DEBUG) DateTimeUtils2.currentTimeMillis() else 0 - val queries = callback() val last = queries.size - 1 for (i in 0 until last) { execSQL(queries[i]) diff --git a/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQuery.kt b/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQuery.kt index abafc372a..dfa2085d0 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQuery.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQuery.kt @@ -1,5 +1,6 @@ package org.tasks.data +import co.touchlab.kermit.Logger import org.tasks.data.TaskListQueryNonRecursive.getNonRecursiveQuery import org.tasks.data.TaskListQueryRecursive.getRecursiveQuery import org.tasks.data.entity.CaldavAccount @@ -14,6 +15,7 @@ import org.tasks.data.sql.Join import org.tasks.filters.AstridOrderingFilter import org.tasks.filters.Filter import org.tasks.preferences.QueryPreferences +import org.tasks.time.DateTimeUtils2.currentTimeMillis object TaskListQuery { private const val CALDAV_METADATA_JOIN = "for_caldav" @@ -41,13 +43,19 @@ object TaskListQuery { fun getQuery( preferences: QueryPreferences, filter: Filter, - ): MutableList = when { - filter.supportsManualSort() && preferences.isManualSort -> - getRecursiveQuery(filter, preferences) - filter is AstridOrderingFilter && preferences.isAstridSort -> - getNonRecursiveQuery(filter, preferences) - filter.supportsSorting() -> - getRecursiveQuery(filter, preferences) - else -> getNonRecursiveQuery(filter, preferences) + ): MutableList { + val start = currentTimeMillis() + return when { + filter.supportsManualSort() && preferences.isManualSort -> + getRecursiveQuery(filter, preferences) + + filter is AstridOrderingFilter && preferences.isAstridSort -> + getNonRecursiveQuery(filter, preferences) + + filter.supportsSorting() -> + getRecursiveQuery(filter, preferences) + + else -> getNonRecursiveQuery(filter, preferences) + }.also { Logger.v { "Building query took ${currentTimeMillis() - start}ms" } } } } \ No newline at end of file