From c959049848829afa55880eedce4f80b4e46aee99 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 19 Sep 2019 16:02:10 -0500 Subject: [PATCH] Use batch in DeletionDao and TaskDeleter --- .../todoroo/astrid/service/TaskDeleter.java | 6 ++-- .../main/java/org/tasks/data/DeletionDao.java | 30 +++++++++---------- app/src/main/java/org/tasks/db/DbUtils.java | 14 +++++++++ 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java b/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java index 74363e9da..8d101b87a 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java @@ -1,9 +1,9 @@ package com.todoroo.astrid.service; -import static com.google.common.collect.Lists.partition; import static com.todoroo.andlib.sql.Criterion.all; import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.isVisible; import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.notCompleted; +import static org.tasks.db.DbUtils.batch; import com.google.common.collect.ImmutableList; import com.todoroo.astrid.api.Filter; @@ -57,9 +57,7 @@ public class TaskDeleter { public List markDeleted(List taskIds) { Set ids = new HashSet<>(taskIds); - for (List partition : partition(taskIds, 999)) { - ids.addAll(googleTaskDao.getChildren(partition)); - } + batch(taskIds, i -> ids.addAll(googleTaskDao.getChildren(i))); deletionDao.markDeleted(ids); workManager.cleanup(taskIds); workManager.sync(false); diff --git a/app/src/main/java/org/tasks/data/DeletionDao.java b/app/src/main/java/org/tasks/data/DeletionDao.java index 77001c444..c77761f0c 100644 --- a/app/src/main/java/org/tasks/data/DeletionDao.java +++ b/app/src/main/java/org/tasks/data/DeletionDao.java @@ -1,7 +1,6 @@ package org.tasks.data; -import static com.google.common.collect.Iterables.partition; -import static com.todoroo.andlib.utility.DateUtilities.now; +import static org.tasks.db.DbUtils.batch; import androidx.room.Dao; import androidx.room.Delete; @@ -36,24 +35,23 @@ public abstract class DeletionDao { @Transaction public void delete(List ids) { - for (List partition : partition(ids, 999)) { - deleteAlarms(partition); - deleteGeofences(partition); - deleteTags(partition); - deleteGoogleTasks(partition); - deleteCaldavTasks(partition); - deleteTasks(partition); - } + batch(ids, b -> { + deleteAlarms(b); + deleteGeofences(b); + deleteTags(b); + deleteGoogleTasks(b); + deleteCaldavTasks(b); + deleteTasks(b); + }); } - @Query("UPDATE tasks SET modified = :timestamp, deleted = :timestamp WHERE _id IN(:ids)") - abstract void markDeleted(long timestamp, List ids); + @Query("UPDATE tasks " + + "SET modified = datetime('now', 'localtime'), deleted = datetime('now', 'localtime') " + + "WHERE _id IN(:ids)") + abstract void markDeletedInternal(List ids); public void markDeleted(Iterable ids) { - long now = now(); - for (List partition : partition(ids, 997)) { - markDeleted(now, partition); - } + batch(ids, this::markDeletedInternal); } @Query("SELECT gt_task FROM google_tasks WHERE gt_deleted = 0 AND gt_list_id = :listId") diff --git a/app/src/main/java/org/tasks/db/DbUtils.java b/app/src/main/java/org/tasks/db/DbUtils.java index 825cfa37b..acd119960 100644 --- a/app/src/main/java/org/tasks/db/DbUtils.java +++ b/app/src/main/java/org/tasks/db/DbUtils.java @@ -2,6 +2,7 @@ package org.tasks.db; import static com.google.common.collect.Lists.partition; +import com.google.common.collect.Iterables; import java.util.List; import org.tasks.Callback; @@ -13,6 +14,10 @@ public class DbUtils { batch(items, MAX_SQLITE_ARGS, callback); } + public static void batch(Iterable items, Callback> callback) { + batch(items, MAX_SQLITE_ARGS, callback); + } + public static void batch(List items, int size, Callback> callback) { if (items.isEmpty()) { return; @@ -25,4 +30,13 @@ public class DbUtils { } } } + + public static void batch(Iterable items, int size, Callback> callback) { + if (!items.iterator().hasNext()) { + return; + } + for (List sublist : Iterables.partition(items, size)) { + callback.call(sublist); + } + } }