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.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 {

@ -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()
}

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

@ -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()
}

@ -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()
}

@ -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()
}

@ -280,30 +280,60 @@ GROUP BY caldav_lists.cdl_uuid
""")
abstract suspend fun getCaldavFilters(uuid: String, now: Long = currentTimeMillis()): List<CaldavFilters>
@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

Loading…
Cancel
Save