Use batch in DeletionDao and TaskDeleter

pull/848/head
Alex Baker 6 years ago
parent 3d83bd381b
commit c959049848

@ -1,9 +1,9 @@
package com.todoroo.astrid.service; 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.andlib.sql.Criterion.all;
import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.isVisible; import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.isVisible;
import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.notCompleted; import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.notCompleted;
import static org.tasks.db.DbUtils.batch;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -57,9 +57,7 @@ public class TaskDeleter {
public List<Task> markDeleted(List<Long> taskIds) { public List<Task> markDeleted(List<Long> taskIds) {
Set<Long> ids = new HashSet<>(taskIds); Set<Long> ids = new HashSet<>(taskIds);
for (List<Long> partition : partition(taskIds, 999)) { batch(taskIds, i -> ids.addAll(googleTaskDao.getChildren(i)));
ids.addAll(googleTaskDao.getChildren(partition));
}
deletionDao.markDeleted(ids); deletionDao.markDeleted(ids);
workManager.cleanup(taskIds); workManager.cleanup(taskIds);
workManager.sync(false); workManager.sync(false);

@ -1,7 +1,6 @@
package org.tasks.data; package org.tasks.data;
import static com.google.common.collect.Iterables.partition; import static org.tasks.db.DbUtils.batch;
import static com.todoroo.andlib.utility.DateUtilities.now;
import androidx.room.Dao; import androidx.room.Dao;
import androidx.room.Delete; import androidx.room.Delete;
@ -36,24 +35,23 @@ public abstract class DeletionDao {
@Transaction @Transaction
public void delete(List<Long> ids) { public void delete(List<Long> ids) {
for (List<Long> partition : partition(ids, 999)) { batch(ids, b -> {
deleteAlarms(partition); deleteAlarms(b);
deleteGeofences(partition); deleteGeofences(b);
deleteTags(partition); deleteTags(b);
deleteGoogleTasks(partition); deleteGoogleTasks(b);
deleteCaldavTasks(partition); deleteCaldavTasks(b);
deleteTasks(partition); deleteTasks(b);
} });
} }
@Query("UPDATE tasks SET modified = :timestamp, deleted = :timestamp WHERE _id IN(:ids)") @Query("UPDATE tasks "
abstract void markDeleted(long timestamp, List<Long> ids); + "SET modified = datetime('now', 'localtime'), deleted = datetime('now', 'localtime') "
+ "WHERE _id IN(:ids)")
abstract void markDeletedInternal(List<Long> ids);
public void markDeleted(Iterable<Long> ids) { public void markDeleted(Iterable<Long> ids) {
long now = now(); batch(ids, this::markDeletedInternal);
for (List<Long> partition : partition(ids, 997)) {
markDeleted(now, partition);
}
} }
@Query("SELECT gt_task FROM google_tasks WHERE gt_deleted = 0 AND gt_list_id = :listId") @Query("SELECT gt_task FROM google_tasks WHERE gt_deleted = 0 AND gt_list_id = :listId")

@ -2,6 +2,7 @@ package org.tasks.db;
import static com.google.common.collect.Lists.partition; import static com.google.common.collect.Lists.partition;
import com.google.common.collect.Iterables;
import java.util.List; import java.util.List;
import org.tasks.Callback; import org.tasks.Callback;
@ -13,6 +14,10 @@ public class DbUtils {
batch(items, MAX_SQLITE_ARGS, callback); batch(items, MAX_SQLITE_ARGS, callback);
} }
public static <T> void batch(Iterable<T> items, Callback<List<T>> callback) {
batch(items, MAX_SQLITE_ARGS, callback);
}
public static <T> void batch(List<T> items, int size, Callback<List<T>> callback) { public static <T> void batch(List<T> items, int size, Callback<List<T>> callback) {
if (items.isEmpty()) { if (items.isEmpty()) {
return; return;
@ -25,4 +30,13 @@ public class DbUtils {
} }
} }
} }
public static <T> void batch(Iterable<T> items, int size, Callback<List<T>> callback) {
if (!items.iterator().hasNext()) {
return;
}
for (List<T> sublist : Iterables.partition(items, size)) {
callback.call(sublist);
}
}
} }

Loading…
Cancel
Save