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.TagDataDao
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.DialogBuilder
import org.tasks.dialogs.SortDialog
@ -630,8 +630,7 @@ class TaskListFragment : InjectingFragment(), OnRefreshListener, Toolbar.OnMenuI
true
}
R.id.menu_share -> {
DbUtils
.collect(selected) { taskDao.fetchTasks(preferences, IdListFilter(it)) }
selected.chunkedMap { taskDao.fetchTasks(preferences, IdListFilter(it)) }
.apply(this::send)
true
}

@ -22,9 +22,8 @@ import org.tasks.data.Place
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.db.DbUtils.chunkedMap
import org.tasks.db.DbUtils.eachChunk
import org.tasks.jobs.WorkManager
import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils.currentTimeMillis
@ -198,12 +197,10 @@ abstract class TaskDao(private val database: Database) {
@Transaction
open fun setCollapsed(preferences: Preferences, filter: Filter, collapsed: Boolean) {
val tasks = fetchTasks(preferences, filter)
fetchTasks(preferences, filter)
.filter(TaskContainer::hasChildren)
.map(TaskContainer::getId)
DbUtils.batch(tasks) {
collapse(it, collapsed)
}
.eachChunk { collapse(it, collapsed) }
}
@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 org.tasks.LocalBroadcastManager
import org.tasks.data.*
import org.tasks.db.DbUtils
import org.tasks.db.DbUtils.chunkedMap
import org.tasks.db.QueryUtils
import org.tasks.jobs.WorkManager
import org.tasks.preferences.Preferences
@ -25,13 +25,13 @@ class TaskDeleter @Inject constructor(
fun markDeleted(taskIds: List<Long>): List<Task> {
val ids: MutableSet<Long> = HashSet(taskIds)
ids.addAll(DbUtils.collect(taskIds) { googleTaskDao.getChildren(it!!) })
ids.addAll(DbUtils.collect(taskIds) { taskDao.getChildren(it!!) })
ids.addAll(taskIds.chunkedMap(googleTaskDao::getChildren))
ids.addAll(taskIds.chunkedMap(taskDao::getChildren))
deletionDao.markDeleted(ids)
workManager.cleanup(ids)
workManager.sync(false)
localBroadcastManager.broadcastRefresh()
return DbUtils.collect(ids) { taskDao.fetch(it!!) }
return ids.chunkedMap(taskDao::fetch)
}
fun clearCompleted(filter: Filter): Int {

@ -10,7 +10,7 @@ import com.todoroo.astrid.data.Task
import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.data.*
import org.tasks.db.DbUtilsKt.dbchunk
import org.tasks.db.DbUtils.dbchunk
import org.tasks.injection.ForApplication
import org.tasks.preferences.Preferences
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.order
import org.tasks.data.*
import org.tasks.db.DbUtils
import org.tasks.injection.ForApplication
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
@ -132,7 +131,7 @@ class Upgrader @Inject constructor(
val geo = remoteTask.geoPosition ?: continue
iCal.setPlace(taskId, geo)
}
DbUtils.batch(tasksWithLocations) { ids: List<Long>? -> taskDao.touch(ids!!) }
taskDao.touch(tasksWithLocations)
}
private fun applyCaldavSubtasks() {
@ -156,7 +155,7 @@ class Upgrader @Inject constructor(
tagDao.insert(container.task, iCal.getTags(remoteTask.categories))
}
}
DbUtils.batch(tasksWithTags) { ids: List<Long> -> taskDao.touch(ids) }
taskDao.touch(tasksWithTags)
}
private fun removeDuplicateTags() {

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

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

@ -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
object DbUtilsKt {
fun <T> Iterable<T>.dbchunk(): List<List<T>> = chunked(DbUtils.MAX_SQLITE_ARGS)
object DbUtils {
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)
Loading…
Cancel
Save