Improve updating parents query

pull/3313/head
Alex Baker 10 months ago
parent 0098c69f67
commit 88217e50c7

@ -14,6 +14,7 @@ import org.tasks.filters.Filter
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.sync.SyncAdapters import org.tasks.sync.SyncAdapters
import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class TaskMover @Inject constructor( class TaskMover @Inject constructor(
@ -56,6 +57,7 @@ class TaskMover @Inject constructor(
taskDao.setParent(0, ids.intersect(taskIds.toSet()).toList()) taskDao.setParent(0, ids.intersect(taskIds.toSet()).toList())
tasks.forEach { performMove(it, selectedList) } tasks.forEach { performMove(it, selectedList) }
if (!selectedList.isGoogleTasks) { if (!selectedList.isGoogleTasks) {
Timber.d("Updating parents for ${selectedList.uuid}")
caldavDao.updateParents(selectedList.uuid) caldavDao.updateParents(selectedList.uuid)
} }
taskIds.dbchunk().forEach { taskIds.dbchunk().forEach {

@ -38,6 +38,7 @@ import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.widget.AppWidgetManager import org.tasks.widget.AppWidgetManager
import org.tasks.widget.WidgetPreferences import org.tasks.widget.WidgetPreferences
import timber.log.Timber
import java.io.File import java.io.File
import javax.inject.Inject import javax.inject.Inject
@ -85,7 +86,10 @@ class Upgrader @Inject constructor(
taskMover.migrateLocalTasks() taskMover.migrateLocalTasks()
} }
run(from, V9_7) { caldavDao.resetOrders() } 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) { run(from, V10_0_2) {
filterDao.getFilters() filterDao.getFilters()
.filter { it.dirtyHack.trim() == "WHERE" } .filter { it.dirtyHack.trim() == "WHERE" }
@ -110,6 +114,7 @@ class Upgrader @Inject constructor(
setInstallDetails(from) setInstallDetails(from)
} }
run(from, Upgrade_13_2.VERSION) { run(from, Upgrade_13_2.VERSION) {
Timber.d("Updating parents")
caldavDao.updateParents() caldavDao.updateParents()
upgrade_13_2.get().rebuildFilters() upgrade_13_2.get().rebuildFilters()
} }
@ -205,6 +210,7 @@ class Upgrader @Inject constructor(
} }
} }
caldavDao.update(updated) caldavDao.update(updated)
Timber.d("Updating parents")
caldavDao.updateParents() caldavDao.updateParents()
} }

@ -305,6 +305,7 @@ class TasksJsonImporter @Inject constructor(
} }
result.importCount++ result.importCount++
} }
Timber.d("Updating parents")
caldavDao.updateParents() caldavDao.updateParents()
val ignoreKeys = ignorePrefs.map { context.getString(it) } val ignoreKeys = ignorePrefs.map { context.getString(it) }
backupContainer backupContainer

@ -300,6 +300,7 @@ class CaldavSynchronizer @Inject constructor(
caldavCalendar.ctag = remoteCtag caldavCalendar.ctag = remoteCtag
Timber.d("UPDATE %s", caldavCalendar) Timber.d("UPDATE %s", caldavCalendar)
caldavDao.update(caldavCalendar) caldavDao.update(caldavCalendar)
Timber.d("Updating parents for ${caldavCalendar.uuid}")
caldavDao.updateParents(caldavCalendar.uuid!!) caldavDao.updateParents(caldavCalendar.uuid!!)
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
} }

@ -135,6 +135,7 @@ class EtebaseSynchronizer @Inject constructor(
} }
Timber.d("UPDATE %s", caldavCalendar) Timber.d("UPDATE %s", caldavCalendar)
caldavDao.update(caldavCalendar) caldavDao.update(caldavCalendar)
Timber.d("Updating parents for ${caldavCalendar.uuid}")
caldavDao.updateParents(caldavCalendar.uuid!!) caldavDao.updateParents(caldavCalendar.uuid!!)
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
} }

@ -182,6 +182,7 @@ class OpenTasksSynchronizer @Inject constructor(
calendar.ctag = ctag calendar.ctag = ctag
Timber.d("UPDATE $calendar") Timber.d("UPDATE $calendar")
caldavDao.update(calendar) caldavDao.update(calendar)
Timber.d("Updating parents for ${calendar.uuid}")
caldavDao.updateParents(calendar.uuid!!) caldavDao.updateParents(calendar.uuid!!)
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
} }

@ -280,30 +280,60 @@ GROUP BY caldav_lists.cdl_uuid
""") """)
abstract suspend fun getCaldavFilters(uuid: String, now: Long = currentTimeMillis()): List<CaldavFilters> abstract suspend fun getCaldavFilters(uuid: String, now: Long = currentTimeMillis()): List<CaldavFilters>
@Query("UPDATE tasks SET parent = IFNULL((" @Query("""
+ " SELECT p.cd_task FROM caldav_tasks AS p" WITH parent_map AS (
+ " INNER JOIN caldav_tasks ON caldav_tasks.cd_task = tasks._id" SELECT
+ " WHERE p.cd_remote_id = caldav_tasks.cd_remote_parent" c.cd_task AS task_id,
+ " AND p.cd_calendar = caldav_tasks.cd_calendar" p.cd_task AS parent_id
+ " AND p.cd_deleted = 0" FROM caldav_tasks AS c
+ " AND caldav_tasks.cd_remote_parent IS NOT NULL" INNER JOIN caldav_tasks AS p
+ " AND caldav_tasks.cd_remote_parent != ''" ON p.cd_remote_id = c.cd_remote_parent
+ "), 0)" AND p.cd_calendar = c.cd_calendar
+ "WHERE _id IN (SELECT _id FROM tasks INNER JOIN caldav_tasks ON _id = cd_task WHERE cd_deleted = 0)") 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() abstract suspend fun updateParents()
@Query("UPDATE tasks SET parent = IFNULL((" @Query("""
+ " SELECT p.cd_task FROM caldav_tasks AS p" WITH parent_map AS (
+ " INNER JOIN caldav_tasks " SELECT
+ " ON caldav_tasks.cd_task = tasks._id" c.cd_task AS task_id,
+ " AND caldav_tasks.cd_calendar = :calendar" p.cd_task AS parent_id
+ " WHERE p.cd_remote_id = caldav_tasks.cd_remote_parent" FROM caldav_tasks AS c
+ " AND p.cd_calendar = caldav_tasks.cd_calendar" INNER JOIN caldav_tasks AS p
+ " AND p.cd_deleted = 0" ON p.cd_remote_id = c.cd_remote_parent
+ " AND caldav_tasks.cd_remote_parent IS NOT NULL" AND p.cd_calendar = c.cd_calendar
+ " AND caldav_tasks.cd_remote_parent != ''" AND p.cd_deleted = 0
+ "), 0)" WHERE c.cd_calendar = :calendar
+ "WHERE _id IN (SELECT _id FROM tasks INNER JOIN caldav_tasks ON _id = cd_task WHERE cd_deleted = 0 AND 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) abstract suspend fun updateParents(calendar: String)
@Transaction @Transaction

Loading…
Cancel
Save