Batch CalDAV query

gtask_related_email
Alex Baker 5 years ago
parent ed5a1f966c
commit 9dc0e74401

@ -1,6 +1,7 @@
package org.tasks.data;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static org.tasks.db.DbUtils.collect;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
@ -91,8 +92,12 @@ public abstract class CaldavDao {
@Query("SELECT cd_object FROM caldav_tasks WHERE cd_calendar = :calendar")
public abstract List<String> getObjects(String calendar);
public List<Long> getTasks(String calendar, List<String> objects) {
return collect(objects, b -> getTasksInternal(calendar, b));
}
@Query("SELECT cd_task FROM caldav_tasks WHERE cd_calendar = :calendar AND cd_object IN (:objects)")
public abstract List<Long> getTasks(String calendar, List<String> objects);
abstract List<Long> getTasksInternal(String calendar, List<String> objects);
@Query("SELECT * FROM caldav_lists WHERE cdl_account = :account AND cdl_url NOT IN (:urls)")
public abstract List<CaldavCalendar> findDeletedCalendars(String account, List<String> urls);

@ -2,13 +2,24 @@ package org.tasks.db;
import static com.google.common.collect.Lists.partition;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.List;
import org.tasks.Callback;
public class DbUtils {
private static final int MAX_SQLITE_ARGS = 999;
private static final int MAX_SQLITE_ARGS = 990;
public static <F, T> List<T> collect(List<F> items, Function<List<F>, List<T>> func) {
if (items.size() < MAX_SQLITE_ARGS) {
return func.apply(items);
}
List<T> result = new ArrayList<>();
batch(items, b -> result.addAll(func.apply(b)));
return result;
}
public static <T> void batch(List<T> items, Callback<List<T>> callback) {
batch(items, MAX_SQLITE_ARGS, callback);

Loading…
Cancel
Save