Remove Java DbUtils

pull/1012/head
Alex Baker 4 years ago
parent 1b891f2d7e
commit 2b8b16e72a

@ -58,7 +58,7 @@ import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.db.DbUtils import org.tasks.db.DbUtils.chunkedMap
import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.SortDialog import org.tasks.dialogs.SortDialog
@ -630,8 +630,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI
true true
} }
R.id.menu_share -> { R.id.menu_share -> {
DbUtils selected.chunkedMap { taskDao.fetchTasks(preferences, IdListFilter(it)) }
.collect(selected) { taskDao.fetchTasks(preferences, IdListFilter(it)) }
.apply(this::send) .apply(this::send)
true true
} }

@ -22,9 +22,8 @@ import org.tasks.data.Place
import org.tasks.data.SubtaskInfo import org.tasks.data.SubtaskInfo
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.TaskListQuery import org.tasks.data.TaskListQuery
import org.tasks.db.DbUtils import org.tasks.db.DbUtils.chunkedMap
import org.tasks.db.DbUtilsKt.chunkedMap import org.tasks.db.DbUtils.eachChunk
import org.tasks.db.DbUtilsKt.eachChunk
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils.currentTimeMillis
@ -198,12 +197,10 @@ abstract class TaskDao(private val database: Database) {
@Transaction @Transaction
open fun setCollapsed(preferences: Preferences, filter: Filter, collapsed: Boolean) { open fun setCollapsed(preferences: Preferences, filter: Filter, collapsed: Boolean) {
val tasks = fetchTasks(preferences, filter) fetchTasks(preferences, filter)
.filter(TaskContainer::hasChildren) .filter(TaskContainer::hasChildren)
.map(TaskContainer::getId) .map(TaskContainer::getId)
DbUtils.batch(tasks) { .eachChunk { collapse(it, collapsed) }
collapse(it, collapsed)
}
} }
@Query("UPDATE tasks SET collapsed = :collapsed WHERE _id IN (:ids)") @Query("UPDATE tasks SET collapsed = :collapsed WHERE _id IN (:ids)")

@ -6,7 +6,7 @@ import com.todoroo.astrid.data.Task
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.* import org.tasks.data.*
import org.tasks.db.DbUtils import org.tasks.db.DbUtils.chunkedMap
import org.tasks.db.QueryUtils import org.tasks.db.QueryUtils
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -25,13 +25,13 @@ class TaskDeleter @Inject constructor(
fun markDeleted(taskIds: List<Long>): List<Task> { fun markDeleted(taskIds: List<Long>): List<Task> {
val ids: MutableSet<Long> = HashSet(taskIds) val ids: MutableSet<Long> = HashSet(taskIds)
ids.addAll(DbUtils.collect(taskIds) { googleTaskDao.getChildren(it!!) }) ids.addAll(taskIds.chunkedMap(googleTaskDao::getChildren))
ids.addAll(DbUtils.collect(taskIds) { taskDao.getChildren(it!!) }) ids.addAll(taskIds.chunkedMap(taskDao::getChildren))
deletionDao.markDeleted(ids) deletionDao.markDeleted(ids)
workManager.cleanup(ids) workManager.cleanup(ids)
workManager.sync(false) workManager.sync(false)
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
return DbUtils.collect(ids) { taskDao.fetch(it!!) } return ids.chunkedMap(taskDao::fetch)
} }
fun clearCompleted(filter: Filter): Int { fun clearCompleted(filter: Filter): Int {

@ -10,7 +10,7 @@ import com.todoroo.astrid.data.Task
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.* import org.tasks.data.*
import org.tasks.db.DbUtilsKt.dbchunk import org.tasks.db.DbUtils.dbchunk
import org.tasks.injection.ForApplication import org.tasks.injection.ForApplication
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import java.util.* import java.util.*

@ -14,7 +14,6 @@ import org.tasks.caldav.iCalendar.Companion.fromVtodo
import org.tasks.caldav.iCalendar.Companion.getParent import org.tasks.caldav.iCalendar.Companion.getParent
import org.tasks.caldav.iCalendar.Companion.order import org.tasks.caldav.iCalendar.Companion.order
import org.tasks.data.* import org.tasks.data.*
import org.tasks.db.DbUtils
import org.tasks.injection.ForApplication import org.tasks.injection.ForApplication
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -132,7 +131,7 @@ class Upgrader @Inject constructor(
val geo = remoteTask.geoPosition ?: continue val geo = remoteTask.geoPosition ?: continue
iCal.setPlace(taskId, geo) iCal.setPlace(taskId, geo)
} }
DbUtils.batch(tasksWithLocations) { ids: List<Long>? -> taskDao.touch(ids!!) } taskDao.touch(tasksWithLocations)
} }
private fun applyCaldavSubtasks() { private fun applyCaldavSubtasks() {
@ -156,7 +155,7 @@ class Upgrader @Inject constructor(
tagDao.insert(container.task, iCal.getTags(remoteTask.categories)) tagDao.insert(container.task, iCal.getTags(remoteTask.categories))
} }
} }
DbUtils.batch(tasksWithTags) { ids: List<Long> -> taskDao.touch(ids) } taskDao.touch(tasksWithTags)
} }
private fun removeDuplicateTags() { private fun removeDuplicateTags() {

@ -9,7 +9,7 @@ import com.todoroo.astrid.data.Task
import com.todoroo.astrid.helper.UUIDHelper import com.todoroo.astrid.helper.UUIDHelper
import org.tasks.R import org.tasks.R
import org.tasks.date.DateTimeUtils.toAppleEpoch import org.tasks.date.DateTimeUtils.toAppleEpoch
import org.tasks.db.DbUtils import org.tasks.db.DbUtils.chunkedMap
import org.tasks.filters.CaldavFilters import org.tasks.filters.CaldavFilters
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils.currentTimeMillis
@ -148,9 +148,8 @@ abstract class CaldavDao {
@Query("SELECT cd_object FROM caldav_tasks WHERE cd_calendar = :calendar") @Query("SELECT cd_object FROM caldav_tasks WHERE cd_calendar = :calendar")
abstract fun getObjects(calendar: String): List<String> abstract fun getObjects(calendar: String): List<String>
fun getTasks(calendar: String, objects: List<String>): List<Long> { fun getTasks(calendar: String, objects: List<String>): List<Long> =
return DbUtils.collect(objects) { getTasksInternal(calendar, it!!) } objects.chunkedMap { getTasksInternal(calendar, it) }
}
@Query("SELECT cd_task FROM caldav_tasks WHERE cd_calendar = :calendar AND cd_object IN (:objects)") @Query("SELECT cd_task FROM caldav_tasks WHERE cd_calendar = :calendar AND cd_object IN (:objects)")
abstract fun getTasksInternal(calendar: String, objects: List<String>): List<Long> abstract fun getTasksInternal(calendar: String, objects: List<String>): List<Long>

@ -5,7 +5,7 @@ import androidx.room.Delete
import androidx.room.Query import androidx.room.Query
import androidx.room.Transaction import androidx.room.Transaction
import org.tasks.data.CaldavDao.Companion.LOCAL import org.tasks.data.CaldavDao.Companion.LOCAL
import org.tasks.db.DbUtils import org.tasks.db.DbUtils.eachChunk
import java.util.* import java.util.*
@Dao @Dao
@ -30,7 +30,7 @@ abstract class DeletionDao {
@Transaction @Transaction
open fun delete(ids: List<Long>) { open fun delete(ids: List<Long>) {
DbUtils.batch(ids) { ids.eachChunk {
deleteAlarms(it) deleteAlarms(it)
deleteGeofences(it) deleteGeofences(it)
deleteTags(it) deleteTags(it)
@ -46,7 +46,7 @@ abstract class DeletionDao {
abstract fun markDeletedInternal(ids: List<Long>) abstract fun markDeletedInternal(ids: List<Long>)
fun markDeleted(ids: Iterable<Long>) { fun markDeleted(ids: Iterable<Long>) {
DbUtils.batch(ids, this::markDeletedInternal) ids.eachChunk(this::markDeletedInternal)
} }
@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")

@ -1,54 +0,0 @@
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.Collection;
import java.util.List;
import org.tasks.Callback;
public class DbUtils {
public static final int MAX_SQLITE_ARGS = 990;
public static <F, T> List<T> collect(Collection<F> items, Function<List<F>, List<T>> func) {
if (items.size() < MAX_SQLITE_ARGS) {
return func.apply(items instanceof List ? (List<F>) items : new ArrayList<>(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);
}
public static <T> void batch(Iterable<T> items, Callback<List<T>> callback) {
batch(items, MAX_SQLITE_ARGS, callback);
}
private static <T> void batch(List<T> items, int size, Callback<List<T>> callback) {
if (items.isEmpty()) {
return;
}
if (items.size() <= size) {
callback.call(items);
} else {
for (List<T> sublist : partition(items, size)) {
callback.call(sublist);
}
}
}
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);
}
}
}

@ -1,7 +1,9 @@
package org.tasks.db package org.tasks.db
object DbUtilsKt { object DbUtils {
fun <T> Iterable<T>.dbchunk(): List<List<T>> = chunked(DbUtils.MAX_SQLITE_ARGS) const val MAX_SQLITE_ARGS = 990
fun <T> Iterable<T>.dbchunk(): List<List<T>> = chunked(MAX_SQLITE_ARGS)
fun <T> Iterable<T>.eachChunk(action: (List<T>) -> Unit) = dbchunk().forEach(action) fun <T> Iterable<T>.eachChunk(action: (List<T>) -> Unit) = dbchunk().forEach(action)
Loading…
Cancel
Save