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 67b9e6d16..49e4528c1 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt @@ -23,8 +23,11 @@ import org.tasks.data.SubtaskInfo import org.tasks.data.TaskContainer import org.tasks.data.TaskListQuery import org.tasks.db.DbUtils +import org.tasks.db.DbUtilsKt.chunkedMap +import org.tasks.db.DbUtilsKt.eachChunk import org.tasks.jobs.WorkManager import org.tasks.preferences.Preferences +import org.tasks.time.DateTimeUtils.currentTimeMillis import timber.log.Timber import java.util.* @@ -46,8 +49,10 @@ abstract class TaskDao(private val database: Database) { @Query("SELECT * FROM tasks WHERE _id = :id LIMIT 1") abstract fun fetch(id: Long): Task? - @Query("SELECT * FROM tasks WHERE _id IN (:taskIds)") - abstract fun fetch(taskIds: List): List + fun fetch(ids: List): List = ids.chunkedMap(this::fetchInternal) + + @Query("SELECT * FROM tasks WHERE _id IN (:ids)") + internal abstract fun fetchInternal(ids: List): List @Query("SELECT COUNT(1) FROM tasks WHERE timerStart > 0 AND deleted = 0") abstract fun activeTimers(): Int @@ -150,20 +155,21 @@ abstract class TaskDao(private val database: Database) { abstract fun getTaskFactory( query: SimpleSQLiteQuery): DataSource.Factory - fun touch(id: Long) { - touch(listOf(id)) - } + fun touch(id: Long) = touch(listOf(id)) fun touch(ids: List) { - touchInternal(ids) + ids.eachChunk { touchInternal(it) } workManager.sync(false) } - @Query("UPDATE tasks SET modified = strftime('%s','now')*1000 WHERE _id in (:ids)") - abstract fun touchInternal(ids: List) + @Query("UPDATE tasks SET modified = :now WHERE _id in (:ids)") + abstract fun touchInternal(ids: List, now: Long = currentTimeMillis()) + + fun setParent(parent: Long, tasks: List) = + tasks.eachChunk { setParentInternal(parent, it) } @Query("UPDATE tasks SET parent = :parent WHERE _id IN (:children)") - abstract fun setParent(parent: Long, children: List) + internal abstract fun setParentInternal(parent: Long, children: List) @Transaction open fun fetchChildren(id: Long): List { diff --git a/app/src/main/java/org/tasks/db/DbUtilsKt.kt b/app/src/main/java/org/tasks/db/DbUtilsKt.kt new file mode 100644 index 000000000..9ab9250dd --- /dev/null +++ b/app/src/main/java/org/tasks/db/DbUtilsKt.kt @@ -0,0 +1,10 @@ +package org.tasks.db + +object DbUtilsKt { + fun Iterable.dbchunk(): List> = chunked(DbUtils.MAX_SQLITE_ARGS) + + fun Iterable.eachChunk(action: (List) -> Unit) = dbchunk().forEach(action) + + fun Iterable.chunkedMap(transform: (List) -> Iterable): List = + dbchunk().flatMap(transform) +} \ No newline at end of file