From d34780d770bb58b68892c0778f5ccde05147840a Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sun, 24 Nov 2019 10:35:03 -0600 Subject: [PATCH] Clean up query builder --- .../java/org/tasks/ui/TaskListViewModel.java | 66 +++++++++---------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.java b/app/src/main/java/org/tasks/ui/TaskListViewModel.java index 50b37a089..cddade094 100644 --- a/app/src/main/java/org/tasks/ui/TaskListViewModel.java +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.java @@ -49,6 +49,21 @@ import timber.log.Timber; public class TaskListViewModel extends ViewModel { + private static final Criterion JOIN_GTASK = + Criterion.and( + Task.ID.eq(field(GTASK_METADATA_JOIN + ".gt_task")), + field(GTASK_METADATA_JOIN + ".gt_deleted").eq(0)); + private static final Criterion JOIN_CALDAV = + Criterion.and( + Task.ID.eq(field(CALDAV_METADATA_JOIN + ".cd_task")), + field(CALDAV_METADATA_JOIN + ".cd_deleted").eq(0)); + private static final Criterion JOIN_TAGS = Task.ID.eq(field(TAGS_METADATA_JOIN + ".task")); + private static final String JOINS = + Join.left(GoogleTask.TABLE.as(GTASK_METADATA_JOIN), JOIN_GTASK).toString() + + Join.left(CaldavTask.TABLE.as(CALDAV_METADATA_JOIN), JOIN_CALDAV) + + Join.left(Geofence.TABLE, Geofence.TASK.eq(Task.ID)) + + Join.left(Place.TABLE, Place.UID.eq(Geofence.PLACE)); + private static final Table RECURSIVE = new Table("recursive_tasks"); private static final Field RECURSIVE_TASK = field(RECURSIVE + ".task"); private static final Field TASKS = field("tasks.*"); @@ -95,39 +110,6 @@ public class TaskListViewModel extends ViewModel { public static List getQuery(Preferences preferences, Filter filter) { List fields = newArrayList(TASKS, GTASK, CALDAV, GEOFENCE, PLACE); - Criterion tagsJoinCriterion = Criterion.and(Task.ID.eq(field(TAGS_METADATA_JOIN + ".task"))); - Criterion gtaskJoinCriterion = - Criterion.and( - Task.ID.eq(field(GTASK_METADATA_JOIN + ".gt_task")), - field(GTASK_METADATA_JOIN + ".gt_deleted").eq(0)); - Criterion caldavJoinCriterion = - Criterion.and( - Task.ID.eq(field(CALDAV_METADATA_JOIN + ".cd_task")), - field(CALDAV_METADATA_JOIN + ".cd_deleted").eq(0)); - if (filter instanceof TagFilter) { - String uuid = ((TagFilter) filter).getUuid(); - tagsJoinCriterion = - Criterion.and(tagsJoinCriterion, field(TAGS_METADATA_JOIN + ".tag_uid").neq(uuid)); - } else if (filter instanceof GtasksFilter) { - if (preferences.isManualSort()) { - fields.add(INDENT); - fields.add(CHILDREN); - fields.add(SIBLINGS); - fields.add(PRIMARY_SORT); - fields.add(SECONDARY_SORT); - } - } else if (filter instanceof CaldavFilter) { - String uuid = ((CaldavFilter) filter).getUuid(); - caldavJoinCriterion = - Criterion.and(caldavJoinCriterion, field(CALDAV_METADATA_JOIN + ".cd_calendar").eq(uuid)); - } - - String joins = - Join.left(GoogleTask.TABLE.as(GTASK_METADATA_JOIN), gtaskJoinCriterion).toString() - + Join.left(CaldavTask.TABLE.as(CALDAV_METADATA_JOIN), caldavJoinCriterion) - + Join.left(Geofence.TABLE, Geofence.TASK.eq(Task.ID)) - + Join.left(Place.TABLE, Place.UID.eq(Geofence.PLACE)); - if (atLeastLollipop() && (filter instanceof CaldavFilter || (!preferences.isManualSort() && filter instanceof GtasksFilter))) { @@ -142,7 +124,7 @@ public class TaskListViewModel extends ViewModel { fields.add(TAGS_RECURSIVE); fields.add(INDENT); - String joinedQuery = Join.inner(RECURSIVE, Task.ID.eq(RECURSIVE_TASK)) + joins; + String joinedQuery = Join.inner(RECURSIVE, Task.ID.eq(RECURSIVE_TASK)) + JOINS; String parentQuery; QueryTemplate subtaskQuery = new QueryTemplate(); if (filter instanceof CaldavFilter) { @@ -224,12 +206,26 @@ public class TaskListViewModel extends ViewModel { } else { fields.add(TAGS); + if (filter instanceof GtasksFilter && preferences.isManualSort()) { + fields.add(INDENT); + fields.add(CHILDREN); + fields.add(SIBLINGS); + fields.add(PRIMARY_SORT); + fields.add(SECONDARY_SORT); + } // TODO: For now, we'll modify the query to join and include the things like tag data here. // Eventually, we might consider restructuring things so that this query is constructed // elsewhere. + Criterion tagsJoinCriterion = + filter instanceof TagFilter + ? Criterion.and( + JOIN_TAGS, + field(TAGS_METADATA_JOIN + ".tag_uid").neq(((TagFilter) filter).getUuid())) + : JOIN_TAGS; + String joinedQuery = Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), tagsJoinCriterion).toString() - + joins + + JOINS + filter.getSqlQuery(); String query =