Prevent infinite recursion in queries

pull/3371/head
Alex Baker 9 months ago
parent 3364e8c8ee
commit e796da6e37

@ -8,7 +8,6 @@ import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Ignore
import org.junit.Test import org.junit.Test
import org.tasks.data.TaskListQuery.getQuery import org.tasks.data.TaskListQuery.getQuery
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
@ -35,7 +34,6 @@ class RecursiveLoopTest : InjectingTestCase() {
} }
@Test @Test
@Ignore("infinite loop")
fun handleSelfLoop() = runBlocking { fun handleSelfLoop() = runBlocking {
addTask(with(DUE_DATE, newDateTime()), with(PARENT, 1L)) addTask(with(DUE_DATE, newDateTime()), with(PARENT, 1L))
@ -46,7 +44,6 @@ class RecursiveLoopTest : InjectingTestCase() {
} }
@Test @Test
@Ignore("infinite loop")
fun handleSingleLevelLoop() = runBlocking { fun handleSingleLevelLoop() = runBlocking {
val parent = addTask(with(DUE_DATE, newDateTime())) val parent = addTask(with(DUE_DATE, newDateTime()))
val child = addTask(with(PARENT, parent)) val child = addTask(with(PARENT, parent))
@ -60,7 +57,6 @@ class RecursiveLoopTest : InjectingTestCase() {
} }
@Test @Test
@Ignore("infinite loop")
fun handleMultiLevelLoop() = runBlocking { fun handleMultiLevelLoop() = runBlocking {
val parent = addTask(with(DUE_DATE, newDateTime())) val parent = addTask(with(DUE_DATE, newDateTime()))
val child = addTask(with(PARENT, parent)) val child = addTask(with(PARENT, parent))

@ -17,11 +17,6 @@ import org.tasks.preferences.QueryPreferences
internal object TaskListQueryRecursive { internal object TaskListQueryRecursive {
private val RECURSIVE = Table("recursive_tasks") private val RECURSIVE = Table("recursive_tasks")
private val RECURSIVE_TASK = field("$RECURSIVE.task") private val RECURSIVE_TASK = field("$RECURSIVE.task")
private val SUBTASK_QUERY =
QueryTemplate()
.join(Join.inner(RECURSIVE, Task.PARENT.eq(RECURSIVE_TASK)))
.where(activeAndVisible())
.toString()
fun getRecursiveQuery( fun getRecursiveQuery(
filter: Filter, filter: Filter,
@ -78,7 +73,8 @@ internal object TaskListQueryRecursive {
${SortHelper.orderSelectForSortTypeRecursive(groupMode, true)} AS primary_group, ${SortHelper.orderSelectForSortTypeRecursive(groupMode, true)} AS primary_group,
${SortHelper.orderSelectForSortTypeRecursive(sortMode, false)} AS primary_sort, ${SortHelper.orderSelectForSortTypeRecursive(sortMode, false)} AS primary_sort,
NULL as secondary_sort, NULL as secondary_sort,
${SortHelper.getSortGroup(groupMode)} AS sort_group ${SortHelper.getSortGroup(groupMode)} AS sort_group,
'/' || tasks._id || '/' as recursive_path
FROM tasks FROM tasks
${ ${
if (groupMode == SortHelper.SORT_LIST) { if (groupMode == SortHelper.SORT_LIST) {
@ -104,9 +100,13 @@ internal object TaskListQueryRecursive {
recursive_tasks.primary_group AS primary_group, recursive_tasks.primary_group AS primary_group,
recursive_tasks.primary_sort AS primary_sort, recursive_tasks.primary_sort AS primary_sort,
${SortHelper.orderSelectForSortTypeRecursive(subtaskMode, false)} AS secondary_sort, ${SortHelper.orderSelectForSortTypeRecursive(subtaskMode, false)} AS secondary_sort,
recursive_tasks.sort_group AS sort_group recursive_tasks.sort_group AS sort_group,
recursive_tasks.recursive_path || tasks._id || '/' AS recursive_path
FROM tasks FROM tasks
$SUBTASK_QUERY INNER JOIN recursive_tasks ON tasks.parent = recursive_tasks.task
WHERE
${activeAndVisible()}
AND recursive_tasks.recursive_path NOT LIKE '%/' || tasks._id || '/%'
ORDER BY ORDER BY
parent_complete, parent_complete,
indent DESC, indent DESC,

Loading…
Cancel
Save