@ -39,44 +39,22 @@ internal object TaskListQueryRecursive {
. where ( activeAndVisible ( ) )
. where ( activeAndVisible ( ) )
fun getRecursiveQuery (
fun getRecursiveQuery (
filter : Filter ,
filter : Filter ,
preferences : QueryPreferences ,
preferences : QueryPreferences ,
) : MutableList < String > {
) : MutableList < String > {
var joinedQuery = JOINS
val parentQuery = when ( filter ) {
var where = " WHERE recursive_tasks.hidden = 0 "
is CaldavFilter -> newCaldavQuery ( filter . uuid )
val parentQuery : String
is GtasksFilter -> newCaldavQuery ( filter . list . uuid !! )
when ( filter ) {
else -> PermaSql . replacePlaceholdersForQuery ( filter . getSqlQuery ( ) )
is CaldavFilter -> {
parentQuery = newCaldavQuery ( filter . uuid )
}
is GtasksFilter -> {
parentQuery = newCaldavQuery ( filter . list . uuid !! )
}
else -> {
parentQuery = PermaSql . replacePlaceholdersForQuery ( filter . getSqlQuery ( ) )
joinedQuery += " LEFT JOIN (SELECT task, max(indent) AS max_indent FROM recursive_tasks GROUP BY task) AS recursive_indents ON recursive_indents.task = tasks._id "
where += " AND indent = max_indent "
}
}
}
joinedQuery += where
val manualSort = preferences . isManualSort
val manualSort = preferences . isManualSort
val sortMode : Int
val sortMode = when {
val sortField : String
manualSort && filter is GtasksFilter -> SortHelper . SORT _GTASKS
when {
manualSort && filter is CaldavFilter -> SortHelper . SORT _CALDAV
manualSort && filter is GtasksFilter -> {
else -> preferences . sortMode
sortMode = SortHelper . SORT _GTASKS
sortField = " tasks.`order` "
}
manualSort && filter is CaldavFilter -> {
sortMode = SortHelper . SORT _CALDAV
sortField = SortHelper . CALDAV _ORDER _COLUMN
}
else -> {
sortMode = preferences . sortMode
sortField = " NULL "
}
}
}
val reverseSort = preferences . isReverseSort && sortMode != SortHelper . SORT _GTASKS && sortMode != SortHelper . SORT _CALDAV
val reverseSort =
preferences . isReverseSort && sortMode != SortHelper . SORT _GTASKS && sortMode != SortHelper . SORT _CALDAV
val sortSelect = SortHelper . orderSelectForSortTypeRecursive ( sortMode )
val sortSelect = SortHelper . orderSelectForSortTypeRecursive ( sortMode )
val parentCompleted = if ( preferences . completedTasksAtBottom ) " tasks.completed > 0 " else " 0 "
val parentCompleted = if ( preferences . completedTasksAtBottom ) " tasks.completed > 0 " else " 0 "
val completionSort =
val completionSort =
@ -85,26 +63,29 @@ internal object TaskListQueryRecursive {
} else {
} else {
" 0 "
" 0 "
}
}
val withClause = """
val withClause = """
CREATE TEMPORARY TABLE ` recursive _tasks ` AS
CREATE TEMPORARY TABLE ` recursive _tasks ` AS
WITH RECURSIVE recursive _tasks ( task , parent _complete , subtask _complete , completion _sort , parent , collapsed , hidden , indent , title , sortField , primary _sort , secondary _sort , sort _group ) AS (
WITH RECURSIVE recursive _tasks ( task , parent _complete , subtask _complete , completion _sort , parent , collapsed , hidden , indent , title , primary _sort , secondary _sort , sort _group ) AS (
SELECT tasks . _id , $ parentCompleted as parent _complete , 0 as subtask _complete , $ completionSort as completion _sort , 0 as parent , tasks . collapsed as collapsed , 0 as hidden , 0 AS sort _indent , UPPER ( tasks . title ) AS sort _title , $ sortSelect , $ sortField as primary _sort , NULL as secondarySort , $ { SortHelper . getSortGroup ( sortMode ) } FROM tasks
SELECT tasks . _id , $ parentCompleted as parent _complete , 0 as subtask _complete , $ completionSort as completion _sort , 0 as parent , tasks . collapsed as collapsed , 0 as hidden , 0 AS sort _indent , UPPER ( tasks . title ) AS sort _title , $ sortSelect as primary _sort , NULL as secondarySort , $ { SortHelper . getSortGroup ( sortMode ) }
FROM tasks
$ parentQuery
$ parentQuery
UNION ALL SELECT tasks . _id , recursive _tasks . parent _complete , $ parentCompleted as subtask _complete , $ completionSort as completion _sort , recursive _tasks . task as parent , tasks . collapsed as collapsed , CASE WHEN recursive _tasks . collapsed > 0 OR recursive _tasks . hidden > 0 THEN 1 ELSE 0 END as hidden , recursive _tasks . indent + 1 AS sort _indent , UPPER ( tasks . title ) AS sort _title , $ sortSelect , recursive _tasks . primary _sort as primary _sort , $ sort Field as secondary _sort , recursive _tasks . sort _group FROM tasks
UNION ALL SELECT tasks . _id , recursive _tasks . parent _complete , $ parentCompleted as subtask _complete , $ completionSort as completion _sort , recursive _tasks . task as parent , tasks . collapsed as collapsed , CASE WHEN recursive _tasks . collapsed > 0 OR recursive _tasks . hidden > 0 THEN 1 ELSE 0 END as hidden , recursive _tasks . indent + 1 AS sort _indent , UPPER ( tasks . title ) AS sort _title , recursive _tasks . primary _sort as primary _sort , $ sort Select as secondary _sort , recursive _tasks . sort _group FROM tasks
$ SUBTASK _QUERY
$ SUBTASK _QUERY
ORDER BY parent _complete ASC , sort _indent DESC , subtask _complete ASC , completion _sort DESC , $ { SortHelper . orderForSortTypeRecursive ( sortMode , reverseSort ) }
ORDER BY parent _complete ASC , sort _indent DESC , subtask _complete ASC , completion _sort DESC , $ { SortHelper . orderForSortTypeRecursive ( sortMode , reverseSort ) }
) SELECT * FROM recursive _tasks
) SELECT * FROM recursive _tasks
WHERE indent = ( SELECT MAX ( indent ) FROM recursive _tasks as r WHERE r . task = recursive _tasks . task )
""" .trimIndent()
""" .trimIndent()
return mutableListOf (
return mutableListOf (
" DROP TABLE IF EXISTS `temp`.`recursive_tasks` " ,
" DROP TABLE IF EXISTS `recursive_tasks` " ,
SortHelper . adjustQueryForFlags ( preferences , withClause ) ,
SortHelper . adjustQueryForFlags ( preferences , withClause ) ,
" CREATE INDEX `r_tasks` ON `recursive_tasks` (`task`) " ,
" CREATE INDEX `r_tasks` ON `recursive_tasks` (`task`) " ,
" CREATE INDEX `r_parents` ON `recursive_tasks` (`parent`) " ,
" CREATE INDEX `r_parents` ON `recursive_tasks` (`parent`) " ,
Query . select ( * FIELDS )
Query . select ( * FIELDS )
. withQueryTemplate ( PermaSql . replacePlaceholdersForQuery ( joinedQuery ) )
. withQueryTemplate ( PermaSql . replacePlaceholdersForQuery ( " $JOINS WHERE recursive_tasks.hidden = 0 " ) )
. from ( Task . TABLE )
. from ( Task . TABLE )
. toString ( ) )
. toString ( ) ,
)
}
}
private fun newCaldavQuery ( list : String ) =
private fun newCaldavQuery ( list : String ) =