Improve recursive query performance

gtask_related_email
Alex Baker 6 years ago
parent 1c99a94906
commit 765d5ba776

@ -124,10 +124,12 @@ public class TaskListViewModel extends ViewModel {
+ Tag.TASK; + Tag.TASK;
fields.add(field("(" + tagQuery + ")").as("tags")); fields.add(field("(" + tagQuery + ")").as("tags"));
fields.add(INDENT); fields.add(INDENT);
fields.add(field("(SELECT count(distinct task) FROM recursive_tasks WHERE parent = tasks._id GROUP BY parent)").as("children")); fields.add(CHILDREN);
String joinedQuery = Join.inner(RECURSIVE, Task.ID.eq(RECURSIVE_TASK)) + JOINS + String joinedQuery = Join.inner(RECURSIVE, Task.ID.eq(RECURSIVE_TASK))
" WHERE recursive_tasks.hidden = 0"; + " LEFT JOIN (SELECT parent, count(recursive_tasks.task) AS children FROM recursive_tasks GROUP BY parent) AS recursive_children ON recursive_children.parent = tasks._id "
+ JOINS;
String where = " WHERE recursive_tasks.hidden = 0";
String parentQuery; String parentQuery;
QueryTemplate subtaskQuery = new QueryTemplate(); QueryTemplate subtaskQuery = new QueryTemplate();
if (filter instanceof CaldavFilter) { if (filter instanceof CaldavFilter) {
@ -150,8 +152,6 @@ public class TaskListViewModel extends ViewModel {
Join.inner( Join.inner(
CaldavTask.TABLE, CaldavTask.TABLE,
Criterion.and( Criterion.and(
CaldavTask.CALENDAR.eq(calendar.getUuid()),
CaldavTask.PARENT.gt(0),
CaldavTask.TASK.eq(Task.ID), CaldavTask.TASK.eq(Task.ID),
CaldavTask.DELETED.eq(0)))) CaldavTask.DELETED.eq(0))))
.where(TaskCriteria.activeAndVisible()); .where(TaskCriteria.activeAndVisible());
@ -175,8 +175,6 @@ public class TaskListViewModel extends ViewModel {
Join.inner( Join.inner(
GoogleTask.TABLE, GoogleTask.TABLE,
Criterion.and( Criterion.and(
GoogleTask.LIST.eq(list.getRemoteId()),
GoogleTask.PARENT.gt(0),
GoogleTask.TASK.eq(Task.ID), GoogleTask.TASK.eq(Task.ID),
GoogleTask.DELETED.eq(0)))) GoogleTask.DELETED.eq(0))))
.where(TaskCriteria.activeAndVisible()); .where(TaskCriteria.activeAndVisible());
@ -190,8 +188,10 @@ public class TaskListViewModel extends ViewModel {
addCaldavSubtasks(subtaskQuery); addCaldavSubtasks(subtaskQuery);
} }
subtaskQuery.where(TaskCriteria.activeAndVisible()); subtaskQuery.where(TaskCriteria.activeAndVisible());
joinedQuery += " AND indent = (select max(indent) from recursive_tasks where tasks._id = recursive_tasks.task) "; 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;
String sortSelect = SortHelper.orderSelectForSortTypeRecursive(preferences.getSortMode()); String sortSelect = SortHelper.orderSelectForSortTypeRecursive(preferences.getSortMode());
String withClause = "CREATE TEMPORARY TABLE `recursive_tasks` AS\n" String withClause = "CREATE TEMPORARY TABLE `recursive_tasks` AS\n"

Loading…
Cancel
Save