diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt b/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt index 802d0db43..953eb2d89 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt @@ -14,6 +14,7 @@ import org.tasks.filters.Filter import org.tasks.preferences.Preferences import org.tasks.sync.SyncAdapters import org.tasks.time.DateTimeUtils2.currentTimeMillis +import timber.log.Timber import javax.inject.Inject class TaskMover @Inject constructor( @@ -56,6 +57,7 @@ class TaskMover @Inject constructor( taskDao.setParent(0, ids.intersect(taskIds.toSet()).toList()) tasks.forEach { performMove(it, selectedList) } if (!selectedList.isGoogleTasks) { + Timber.d("Updating parents for ${selectedList.uuid}") caldavDao.updateParents(selectedList.uuid) } taskIds.dbchunk().forEach { diff --git a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt index 23092dc07..cda686fe8 100644 --- a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt +++ b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt @@ -38,6 +38,7 @@ import org.tasks.preferences.Preferences import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.widget.AppWidgetManager import org.tasks.widget.WidgetPreferences +import timber.log.Timber import java.io.File import javax.inject.Inject @@ -85,7 +86,10 @@ class Upgrader @Inject constructor( taskMover.migrateLocalTasks() } run(from, V9_7) { caldavDao.resetOrders() } - run(from, V9_7_3) { caldavDao.updateParents() } + run(from, V9_7_3) { + Timber.d("Updating parents") + caldavDao.updateParents() + } run(from, V10_0_2) { filterDao.getFilters() .filter { it.dirtyHack.trim() == "WHERE" } @@ -110,6 +114,7 @@ class Upgrader @Inject constructor( setInstallDetails(from) } run(from, Upgrade_13_2.VERSION) { + Timber.d("Updating parents") caldavDao.updateParents() upgrade_13_2.get().rebuildFilters() } @@ -205,6 +210,7 @@ class Upgrader @Inject constructor( } } caldavDao.update(updated) + Timber.d("Updating parents") caldavDao.updateParents() } diff --git a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt index cb98cc0ea..278fb2b4e 100644 --- a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt +++ b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt @@ -305,6 +305,7 @@ class TasksJsonImporter @Inject constructor( } result.importCount++ } + Timber.d("Updating parents") caldavDao.updateParents() val ignoreKeys = ignorePrefs.map { context.getString(it) } backupContainer diff --git a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt index 8673e6d0f..5207d844a 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt @@ -300,6 +300,7 @@ class CaldavSynchronizer @Inject constructor( caldavCalendar.ctag = remoteCtag Timber.d("UPDATE %s", caldavCalendar) caldavDao.update(caldavCalendar) + Timber.d("Updating parents for ${caldavCalendar.uuid}") caldavDao.updateParents(caldavCalendar.uuid!!) localBroadcastManager.broadcastRefresh() } diff --git a/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt b/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt index 24c5d6bd9..be85f5d64 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt @@ -135,6 +135,7 @@ class EtebaseSynchronizer @Inject constructor( } Timber.d("UPDATE %s", caldavCalendar) caldavDao.update(caldavCalendar) + Timber.d("Updating parents for ${caldavCalendar.uuid}") caldavDao.updateParents(caldavCalendar.uuid!!) localBroadcastManager.broadcastRefresh() } diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt index 33fffe635..645ad61dc 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt @@ -182,6 +182,7 @@ class OpenTasksSynchronizer @Inject constructor( calendar.ctag = ctag Timber.d("UPDATE $calendar") caldavDao.update(calendar) + Timber.d("Updating parents for ${calendar.uuid}") caldavDao.updateParents(calendar.uuid!!) localBroadcastManager.broadcastRefresh() } diff --git a/data/src/commonMain/kotlin/org/tasks/data/dao/CaldavDao.kt b/data/src/commonMain/kotlin/org/tasks/data/dao/CaldavDao.kt index ff844c7bd..f034ce68a 100644 --- a/data/src/commonMain/kotlin/org/tasks/data/dao/CaldavDao.kt +++ b/data/src/commonMain/kotlin/org/tasks/data/dao/CaldavDao.kt @@ -280,30 +280,60 @@ GROUP BY caldav_lists.cdl_uuid """) abstract suspend fun getCaldavFilters(uuid: String, now: Long = currentTimeMillis()): List - @Query("UPDATE tasks SET parent = IFNULL((" - + " SELECT p.cd_task FROM caldav_tasks AS p" - + " INNER JOIN caldav_tasks ON caldav_tasks.cd_task = tasks._id" - + " WHERE p.cd_remote_id = caldav_tasks.cd_remote_parent" - + " AND p.cd_calendar = caldav_tasks.cd_calendar" - + " AND p.cd_deleted = 0" - + " AND caldav_tasks.cd_remote_parent IS NOT NULL" - + " AND caldav_tasks.cd_remote_parent != ''" - + "), 0)" - + "WHERE _id IN (SELECT _id FROM tasks INNER JOIN caldav_tasks ON _id = cd_task WHERE cd_deleted = 0)") + @Query(""" + WITH parent_map AS ( + SELECT + c.cd_task AS task_id, + p.cd_task AS parent_id + FROM caldav_tasks AS c + INNER JOIN caldav_tasks AS p + ON p.cd_remote_id = c.cd_remote_parent + AND p.cd_calendar = c.cd_calendar + AND p.cd_deleted = 0 + WHERE c.cd_deleted = 0 + AND c.cd_remote_parent IS NOT NULL + AND c.cd_remote_parent != '' + ) + UPDATE tasks + SET parent = IFNULL( + (SELECT parent_id FROM parent_map WHERE task_id = tasks._id), + 0 + ) + WHERE _id IN ( + SELECT cd_task + FROM caldav_tasks + WHERE cd_deleted = 0 + ) + """) abstract suspend fun updateParents() - @Query("UPDATE tasks SET parent = IFNULL((" - + " SELECT p.cd_task FROM caldav_tasks AS p" - + " INNER JOIN caldav_tasks " - + " ON caldav_tasks.cd_task = tasks._id" - + " AND caldav_tasks.cd_calendar = :calendar" - + " WHERE p.cd_remote_id = caldav_tasks.cd_remote_parent" - + " AND p.cd_calendar = caldav_tasks.cd_calendar" - + " AND p.cd_deleted = 0" - + " AND caldav_tasks.cd_remote_parent IS NOT NULL" - + " AND caldav_tasks.cd_remote_parent != ''" - + "), 0)" - + "WHERE _id IN (SELECT _id FROM tasks INNER JOIN caldav_tasks ON _id = cd_task WHERE cd_deleted = 0 AND cd_calendar = :calendar)") + @Query(""" + WITH parent_map AS ( + SELECT + c.cd_task AS task_id, + p.cd_task AS parent_id + FROM caldav_tasks AS c + INNER JOIN caldav_tasks AS p + ON p.cd_remote_id = c.cd_remote_parent + AND p.cd_calendar = c.cd_calendar + AND p.cd_deleted = 0 + WHERE c.cd_calendar = :calendar + AND c.cd_deleted = 0 + AND c.cd_remote_parent IS NOT NULL + AND c.cd_remote_parent != '' + ) + UPDATE tasks + SET parent = IFNULL( + (SELECT parent_id FROM parent_map WHERE task_id = tasks._id), + 0 + ) + WHERE _id IN ( + SELECT cd_task + FROM caldav_tasks + WHERE cd_deleted = 0 + AND cd_calendar = :calendar + ) + """) abstract suspend fun updateParents(calendar: String) @Transaction