Remove subtasks in chunk when moving tasks

pull/1012/head
Alex Baker 6 years ago
parent 45920a8035
commit a1df03ddd1

@ -144,7 +144,7 @@ class TaskDaoTests : InjectingTestCase() {
fun findChildrenInList() { fun findChildrenInList() {
taskDao.createNew(newTask(with(ID, 1L))) taskDao.createNew(newTask(with(ID, 1L)))
taskDao.createNew(newTask(with(ID, 2L), with(PARENT, 1L))) taskDao.createNew(newTask(with(ID, 2L), with(PARENT, 1L)))
assertEquals(listOf(2L), taskDao.findChildrenInList(listOf(1, 2))) assertEquals(listOf(2L), taskDao.getChildren(listOf(1L, 2L)))
} }
@Test @Test
@ -152,7 +152,7 @@ class TaskDaoTests : InjectingTestCase() {
taskDao.createNew(newTask(with(ID, 1L))) taskDao.createNew(newTask(with(ID, 1L)))
taskDao.createNew(newTask(with(ID, 2L), with(PARENT, 1L))) taskDao.createNew(newTask(with(ID, 2L), with(PARENT, 1L)))
taskDao.createNew(newTask(with(ID, 3L), with(PARENT, 2L))) taskDao.createNew(newTask(with(ID, 3L), with(PARENT, 2L)))
assertEquals(listOf(2L, 3L), taskDao.findChildrenInList(listOf(1, 2, 3))) assertEquals(listOf(2L, 3L, 3L), taskDao.getChildren(listOf(1L, 2L, 3L)))
} }
@Test @Test
@ -160,7 +160,7 @@ class TaskDaoTests : InjectingTestCase() {
taskDao.createNew(newTask(with(ID, 1L))) taskDao.createNew(newTask(with(ID, 1L)))
taskDao.createNew(newTask(with(ID, 2L), with(PARENT, 1L))) taskDao.createNew(newTask(with(ID, 2L), with(PARENT, 1L)))
taskDao.createNew(newTask(with(ID, 3L), with(PARENT, 2L))) taskDao.createNew(newTask(with(ID, 3L), with(PARENT, 2L)))
assertEquals(listOf(3L), taskDao.findChildrenInList(listOf(1, 3))) assertEquals(listOf(2L, 3L), taskDao.getChildren(listOf(1L, 3L)))
} }
override fun inject(component: TestComponent) = component.inject(this) override fun inject(component: TestComponent) = component.inject(this)

@ -150,7 +150,7 @@ class GoogleTaskDaoTests : InjectingTestCase() {
fun findChildrenInList() { fun findChildrenInList() {
googleTaskDao.insert(newGoogleTask(with(TASK, 1), with(LIST, "1"))) googleTaskDao.insert(newGoogleTask(with(TASK, 1), with(LIST, "1")))
googleTaskDao.insert(newGoogleTask(with(TASK, 2), with(LIST, "1"), with(PARENT, 1L))) googleTaskDao.insert(newGoogleTask(with(TASK, 2), with(LIST, "1"), with(PARENT, 1L)))
assertEquals(listOf(2L), googleTaskDao.findChildrenInList(listOf(1, 2))) assertEquals(listOf(2L), googleTaskDao.getChildren(listOf(1L, 2L)))
} }
private fun insertTop(googleTask: GoogleTask) { private fun insertTop(googleTask: GoogleTask) {

@ -29,7 +29,6 @@ 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
import timber.log.Timber import timber.log.Timber
import java.util.*
@Dao @Dao
abstract class TaskDao(private val database: Database) { abstract class TaskDao(private val database: Database) {
@ -194,12 +193,6 @@ abstract class TaskDao(private val database: Database) {
+ "SELECT task FROM recursive_tasks") + "SELECT task FROM recursive_tasks")
abstract fun getChildren(ids: List<Long>): List<Long> abstract fun getChildren(ids: List<Long>): List<Long>
fun findChildrenInList(ids: List<Long>): List<Long> {
val result = ArrayList(ids)
result.retainAll(getChildren(ids))
return result
}
@Query("UPDATE tasks SET collapsed = :collapsed WHERE _id = :id") @Query("UPDATE tasks SET collapsed = :collapsed WHERE _id = :id")
abstract fun setCollapsed(id: Long, collapsed: Boolean) abstract fun setCollapsed(id: Long, collapsed: Boolean)

@ -10,6 +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.injection.ForApplication import org.tasks.injection.ForApplication
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import java.util.* import java.util.*
@ -39,11 +40,12 @@ class TaskMover @Inject constructor(
return null return null
} }
fun move(tasks: List<Long>, selectedList: Filter) { fun move(ids: List<Long>, selectedList: Filter) {
var tasks = tasks val tasks = ArrayList(ids)
tasks = ArrayList(tasks) ids.dbchunk().forEach {
tasks.removeAll(googleTaskDao.findChildrenInList(tasks)) tasks.removeAll(googleTaskDao.getChildren(it))
tasks.removeAll(taskDao.findChildrenInList(tasks)) tasks.removeAll(taskDao.getChildren(it))
}
taskDao.setParent(0, tasks) taskDao.setParent(0, tasks)
for (task in taskDao.fetch(tasks)) { for (task in taskDao.fetch(tasks)) {
performMove(task, selectedList) performMove(task, selectedList)

@ -88,15 +88,12 @@ abstract class GoogleTaskDao {
@Query("SELECT DISTINCT gt_list_id FROM google_tasks WHERE gt_deleted = 0 AND gt_task IN (:tasks)") @Query("SELECT DISTINCT gt_list_id FROM google_tasks WHERE gt_deleted = 0 AND gt_task IN (:tasks)")
abstract fun getLists(tasks: List<Long>): List<String> abstract fun getLists(tasks: List<Long>): List<String>
@Query("SELECT gt_task FROM google_tasks WHERE gt_parent IN (:ids)") @Query("SELECT gt_task FROM google_tasks WHERE gt_parent IN (:ids) AND gt_deleted = 0")
abstract fun getChildren(ids: List<Long>): List<Long> abstract fun getChildren(ids: List<Long>): List<Long>
@Query("SELECT tasks.* FROM tasks JOIN google_tasks ON tasks._id = gt_task WHERE gt_parent = :taskId") @Query("SELECT tasks.* FROM tasks JOIN google_tasks ON tasks._id = gt_task WHERE gt_parent = :taskId")
abstract fun getChildTasks(taskId: Long): List<Task> abstract fun getChildTasks(taskId: Long): List<Task>
@Query("SELECT gt_task FROM google_tasks WHERE gt_task IN (:taskIds) AND gt_parent IN (:taskIds) AND gt_deleted = 0")
abstract fun findChildrenInList(taskIds: List<Long>): List<Long>
@Query("SELECT * FROM google_tasks WHERE gt_parent = :id AND gt_deleted = 0") @Query("SELECT * FROM google_tasks WHERE gt_parent = :id AND gt_deleted = 0")
abstract fun getChildren(id: Long): List<GoogleTask> abstract fun getChildren(id: Long): List<GoogleTask>

Loading…
Cancel
Save