From e8f5a72a089897c7a998d6b0ccfbacba3ef484df Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 4 Feb 2025 02:16:23 -0600 Subject: [PATCH] Improve recursive task list query --- .../org/tasks/data/TaskListQueryRecursive.kt | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQueryRecursive.kt b/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQueryRecursive.kt index 7230d4395..3063aa852 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQueryRecursive.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/data/TaskListQueryRecursive.kt @@ -117,24 +117,19 @@ internal object TaskListQueryRecursive { ), max_indent AS ( SELECT - task, - MAX(recursive_tasks.indent) OVER (PARTITION BY task) AS max_indent - FROM recursive_tasks - ), - numbered_tasks AS ( - SELECT - recursive_tasks.task, - max_indent, + *, + MAX(recursive_tasks.indent) OVER (PARTITION BY task) AS max_indent, ROW_NUMBER() OVER () AS sequence FROM recursive_tasks - INNER JOIN max_indent ON max_indent.task = recursive_tasks.task - WHERE recursive_tasks.indent = max_indent ), child_counts AS ( - SELECT DISTINCT(parent), - COUNT(*) OVER (PARTITION BY parent) AS children - FROM recursive_tasks - WHERE parent > 0 + SELECT parent, + COUNT(*) AS children + FROM max_indent + WHERE + parent > 0 + AND indent = max_indent + GROUP BY parent ) SELECT ${TaskListQuery.FIELDS.joinToString(",\n") { it.toStringInSelect() }}, @@ -146,14 +141,13 @@ internal object TaskListQueryRecursive { secondary_sort, parent_complete FROM tasks - INNER JOIN recursive_tasks ON recursive_tasks.task = tasks._id - INNER JOIN numbered_tasks ON tasks._id = numbered_tasks.task + INNER JOIN max_indent + ON tasks._id = max_indent.task + AND indent = max_indent + AND hidden = 0 LEFT JOIN child_counts ON child_counts.parent = tasks._id LEFT JOIN tags ON tags.task = tasks._id ${TaskListQuery.JOINS} - WHERE - recursive_tasks.hidden = 0 - AND recursive_tasks.indent = max_indent GROUP BY tasks._id ORDER BY sequence """.trimIndent()