Fetch tags and lists with counts

pull/848/head
Alex Baker 7 years ago
parent c7b7e13768
commit ead60643be

@ -6,17 +6,17 @@
package com.todoroo.astrid.gtasks; package com.todoroo.astrid.gtasks;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import androidx.core.util.Pair;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter; import com.todoroo.astrid.api.GtasksFilter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskAccount;
import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskList;
import org.tasks.data.GoogleTaskListDao; import org.tasks.data.GoogleTaskListDao;
import org.tasks.filters.GoogleTaskFilters;
import org.tasks.sync.SyncAdapters; import org.tasks.sync.SyncAdapters;
/** /**
@ -40,26 +40,25 @@ public class GtasksFilterExposer {
this.googleTaskListDao = googleTaskListDao; this.googleTaskListDao = googleTaskListDao;
} }
public List<Pair<GoogleTaskAccount, List<Filter>>> getFilters() { public Map<GoogleTaskAccount, List<Filter>> getFilters() {
List<Pair<GoogleTaskAccount, List<Filter>>> listFilters = newArrayList(); List<GoogleTaskFilters> googleTaskFilters = googleTaskListDao.getGoogleTaskFilters();
for (GoogleTaskAccount account : googleTaskListDao.getAccounts()) { LinkedHashMap<GoogleTaskAccount, List<Filter>> filters = new LinkedHashMap<>();
List<GoogleTaskList> lists = googleTaskListDao.getLists(account.getAccount()); for (GoogleTaskFilters filter : googleTaskFilters) {
listFilters.add(new Pair<>(account, transform(lists, GtasksFilter::new))); if (!filters.containsKey(filter.googleTaskAccount)) {
filters.put(filter.googleTaskAccount, new ArrayList<>());
}
filters.get(filter.googleTaskAccount).add(new GtasksFilter(filter.googleTaskList));
} }
return listFilters; return filters;
} }
public Filter getFilter(long id) { public Filter getFilter(long id) {
if (syncAdapters.isGoogleTaskSyncEnabled()) { if (syncAdapters.isGoogleTaskSyncEnabled()) {
GoogleTaskList list = gtasksListService.getList(id); GoogleTaskList list = gtasksListService.getList(id);
if (list != null) { if (list != null) {
return filterFromList(list); return new GtasksFilter(list);
} }
} }
return null; return null;
} }
private Filter filterFromList(GoogleTaskList list) {
return new GtasksFilter(list);
}
} }

@ -6,13 +6,16 @@
package com.todoroo.astrid.tags; package com.todoroo.astrid.tags;
import static com.google.common.collect.Lists.transform;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TagFilter; import com.todoroo.astrid.api.TagFilter;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.data.TagData; import org.tasks.data.TagData;
import org.tasks.data.TagDataDao;
import org.tasks.filters.TagFilters;
/** /**
* Exposes filters based on tags * Exposes filters based on tags
@ -22,9 +25,11 @@ import org.tasks.data.TagData;
public class TagFilterExposer { public class TagFilterExposer {
private final TagService tagService; private final TagService tagService;
private final TagDataDao tagDataDao;
@Inject @Inject
public TagFilterExposer(TagService tagService) { public TagFilterExposer(TagDataDao tagDataDao, TagService tagService) {
this.tagDataDao = tagDataDao;
this.tagService = tagService; this.tagService = tagService;
} }
@ -37,21 +42,10 @@ public class TagFilterExposer {
} }
public List<Filter> getFilters() { public List<Filter> getFilters() {
return filterFromTags(tagService.getTagList()); return transform(tagDataDao.getTagFilters(), TagFilters::toTagFilter);
} }
public Filter getFilterByUuid(String uuid) { public Filter getFilterByUuid(String uuid) {
return filterFromTag(tagService.tagFromUUID(uuid)); return filterFromTag(tagService.tagFromUUID(uuid));
} }
private List<Filter> filterFromTags(List<TagData> tags) {
List<Filter> filters = new ArrayList<>();
for (TagData tag : tags) {
Filter f = filterFromTag(tag);
if (f != null) {
filters.add(f);
}
}
return filters;
}
} }

@ -70,10 +70,6 @@ public final class TagService {
return tagList; return tagList;
} }
public TagData getTagByUuid(String uuid) {
return tagDataDao.getByUuid(uuid);
}
/** /**
* If a tag already exists in the database that case insensitively matches the given tag, return * If a tag already exists in the database that case insensitively matches the given tag, return
* that. Otherwise, return the argument * that. Otherwise, return the argument

@ -1,16 +1,16 @@
package org.tasks.caldav; package org.tasks.caldav;
import static com.google.common.collect.Lists.transform;
import androidx.core.util.Pair;
import com.todoroo.astrid.api.CaldavFilter; import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.data.CaldavAccount; import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar; import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao; import org.tasks.data.CaldavDao;
import org.tasks.filters.CaldavFilters;
import org.tasks.sync.SyncAdapters; import org.tasks.sync.SyncAdapters;
public class CaldavFilterExposer { public class CaldavFilterExposer {
@ -24,11 +24,14 @@ public class CaldavFilterExposer {
this.syncAdapters = syncAdapters; this.syncAdapters = syncAdapters;
} }
public List<Pair<CaldavAccount, List<Filter>>> getFilters() { public Map<CaldavAccount, List<Filter>> getFilters() {
List<Pair<CaldavAccount, List<Filter>>> filters = new ArrayList<>(); List<CaldavFilters> caldavFilters = caldavDao.getCaldavFilters();
for (CaldavAccount account : caldavDao.getAccounts()) { LinkedHashMap<CaldavAccount, List<Filter>> filters = new LinkedHashMap<>();
List<CaldavCalendar> calendars = caldavDao.getCalendarsByAccount(account.getUuid()); for (CaldavFilters filter : caldavFilters) {
filters.add(new Pair<>(account, transform(calendars, CaldavFilter::new))); if (!filters.containsKey(filter.caldavAccount)) {
filters.put(filter.caldavAccount, new ArrayList<>());
}
filters.get(filter.caldavAccount).add(new CaldavFilter(filter.caldavCalendar));
} }
return filters; return filters;
} }

@ -8,6 +8,7 @@ import androidx.room.Query;
import androidx.room.Update; import androidx.room.Update;
import io.reactivex.Single; import io.reactivex.Single;
import java.util.List; import java.util.List;
import org.tasks.filters.CaldavFilters;
@Dao @Dao
public interface CaldavDao { public interface CaldavDao {
@ -66,9 +67,6 @@ public interface CaldavDao {
@Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE") @Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE")
List<CaldavCalendar> getCalendars(); List<CaldavCalendar> getCalendars();
@Query("SELECT * FROM caldav_lists WHERE cdl_account = :account ORDER BY cdl_name COLLATE NOCASE")
List<CaldavCalendar> getCalendarsByAccount(String account);
@Query("SELECT * FROM caldav_lists WHERE cdl_uuid = :uuid LIMIT 1") @Query("SELECT * FROM caldav_lists WHERE cdl_uuid = :uuid LIMIT 1")
CaldavCalendar getCalendar(String uuid); CaldavCalendar getCalendar(String uuid);
@ -93,4 +91,14 @@ public interface CaldavDao {
@Query("SELECT DISTINCT cd_calendar FROM caldav_tasks WHERE cd_deleted = 0 AND cd_task IN (:tasks)") @Query("SELECT DISTINCT cd_calendar FROM caldav_tasks WHERE cd_deleted = 0 AND cd_task IN (:tasks)")
List<String> getCalendars(List<Long> tasks); List<String> getCalendars(List<Long> tasks);
@Query(
"SELECT caldav_lists.*, caldav_accounts.*, COUNT(tasks._id) AS count"
+ " FROM caldav_lists"
+ " LEFT JOIN caldav_accounts ON caldav_lists.cdl_account = caldav_accounts.cda_uuid"
+ " LEFT JOIN caldav_tasks ON caldav_tasks.cd_calendar = caldav_lists.cdl_uuid"
+ " LEFT JOIN tasks ON caldav_tasks.cd_task = tasks._id AND tasks.deleted = 0 AND tasks.completed = 0 AND tasks.hideUntil = 0"
+ " GROUP BY caldav_lists.cdl_uuid"
+ " ORDER BY caldav_accounts.cda_name COLLATE NOCASE, caldav_lists.cdl_name COLLATE NOCASE")
List<CaldavFilters> getCaldavFilters();
} }

@ -8,6 +8,7 @@ import androidx.room.Query;
import androidx.room.Update; import androidx.room.Update;
import io.reactivex.Single; import io.reactivex.Single;
import java.util.List; import java.util.List;
import org.tasks.filters.GoogleTaskFilters;
@Dao @Dao
public abstract class GoogleTaskListDao { public abstract class GoogleTaskListDao {
@ -54,4 +55,14 @@ public abstract class GoogleTaskListDao {
@Update @Update
public abstract void update(GoogleTaskAccount account); public abstract void update(GoogleTaskAccount account);
@Query(
"SELECT google_task_lists.*, google_task_accounts.*, COUNT(tasks._id) AS count"
+ " FROM google_task_lists"
+ " LEFT JOIN google_task_accounts ON google_task_lists.gtl_account = google_task_accounts.gta_account"
+ " LEFT JOIN google_tasks ON google_tasks.gt_list_id = google_task_lists.gtl_remote_id"
+ " LEFT JOIN tasks ON google_tasks.gt_task = tasks._id AND tasks.deleted = 0 AND tasks.completed = 0 AND tasks.hideUntil = 0"
+ " GROUP BY google_task_lists.gtl_remote_id"
+ " ORDER BY google_task_lists.gtl_account COLLATE NOCASE, google_task_lists.gtl_title COLLATE NOCASE")
public abstract List<GoogleTaskFilters> getGoogleTaskFilters();
} }

@ -8,6 +8,7 @@ import androidx.room.Update;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.helper.UUIDHelper;
import java.util.List; import java.util.List;
import org.tasks.filters.TagFilters;
@Dao @Dao
public abstract class TagDataDao { public abstract class TagDataDao {
@ -45,4 +46,14 @@ public abstract class TagDataDao {
} }
tag.setId(insert(tag)); tag.setId(insert(tag));
} }
@Query(
"SELECT tagdata.*, COUNT(tasks._id) AS count"
+ " FROM tagdata"
+ " LEFT JOIN tags ON tags.tag_uid = tagdata.remoteId"
+ " LEFT JOIN tasks ON tags.task = tasks._id AND tasks.deleted = 0 AND tasks.completed = 0 AND tasks.hideUntil = 0"
+ " WHERE tagdata.name IS NOT NULL AND tagdata.name != ''"
+ " GROUP BY tagdata.remoteId"
+ " ORDER BY tagdata.name COLLATE NOCASE")
public abstract List<TagFilters> getTagFilters();
} }

@ -0,0 +1,55 @@
package org.tasks.filters;
import androidx.room.Embedded;
import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar;
public class CaldavFilters {
@Embedded public CaldavCalendar caldavCalendar;
@Embedded public CaldavAccount caldavAccount;
public int count;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CaldavFilters that = (CaldavFilters) o;
if (count != that.count) {
return false;
}
if (caldavCalendar != null
? !caldavCalendar.equals(that.caldavCalendar)
: that.caldavCalendar != null) {
return false;
}
return caldavAccount != null
? caldavAccount.equals(that.caldavAccount)
: that.caldavAccount == null;
}
@Override
public int hashCode() {
int result = caldavCalendar != null ? caldavCalendar.hashCode() : 0;
result = 31 * result + (caldavAccount != null ? caldavAccount.hashCode() : 0);
result = 31 * result + count;
return result;
}
@Override
public String toString() {
return "CaldavFilters{"
+ "caldavCalendar="
+ caldavCalendar
+ ", caldavAccount="
+ caldavAccount
+ ", count="
+ count
+ '}';
}
}

@ -11,7 +11,6 @@ import static org.tasks.caldav.CaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOU
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import androidx.core.util.Pair;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
@ -23,6 +22,9 @@ import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.timers.TimerFilterExposer; import com.todoroo.astrid.timers.TimerFilterExposer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import org.tasks.R; import org.tasks.R;
@ -78,17 +80,18 @@ public class FilterProvider {
item.icon = R.drawable.ic_outline_cloud_off_24px; item.icon = R.drawable.ic_outline_cloud_off_24px;
items.add(item); items.add(item);
for (Pair<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) { for (Map.Entry<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) {
GoogleTaskAccount account = filters.first; GoogleTaskAccount account = filters.getKey();
items.addAll( items.addAll(
getSubmenu( getSubmenu(
account.getAccount(), !isNullOrEmpty(account.getError()), filters.second, true)); account.getAccount(), !isNullOrEmpty(account.getError()), filters.getValue(), true));
} }
for (Pair<CaldavAccount, List<Filter>> filters : getCaldavFilters()) { for (Map.Entry<CaldavAccount, List<Filter>> filters : getCaldavFilters()) {
CaldavAccount account = filters.first; CaldavAccount account = filters.getKey();
items.addAll( items.addAll(
getSubmenu(account.getName(), !isNullOrEmpty(account.getError()), filters.second, true)); getSubmenu(
account.getName(), !isNullOrEmpty(account.getError()), filters.getValue(), true));
} }
return items; return items;
@ -123,13 +126,13 @@ public class FilterProvider {
NavigationDrawerFragment.REQUEST_NEW_LIST)); NavigationDrawerFragment.REQUEST_NEW_LIST));
} }
for (Pair<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) { for (Map.Entry<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) {
GoogleTaskAccount account = filters.first; GoogleTaskAccount account = filters.getKey();
items.addAll( items.addAll(
getSubmenu( getSubmenu(
account.getAccount(), account.getAccount(),
!isNullOrEmpty(account.getError()), !isNullOrEmpty(account.getError()),
filters.second, filters.getValue(),
!navigationDrawer)); !navigationDrawer));
if (navigationDrawer) { if (navigationDrawer) {
@ -143,13 +146,13 @@ public class FilterProvider {
} }
} }
for (Pair<CaldavAccount, List<Filter>> filters : getCaldavFilters()) { for (Map.Entry<CaldavAccount, List<Filter>> filters : getCaldavFilters()) {
CaldavAccount account = filters.first; CaldavAccount account = filters.getKey();
items.addAll( items.addAll(
getSubmenu( getSubmenu(
account.getName(), account.getName(),
!isNullOrEmpty(account.getError()), !isNullOrEmpty(account.getError()),
filters.second, filters.getValue(),
!navigationDrawer)); !navigationDrawer));
if (navigationDrawer) { if (navigationDrawer) {
@ -202,12 +205,12 @@ public class FilterProvider {
return filters; return filters;
} }
private List<Pair<GoogleTaskAccount, List<Filter>>> getGoogleTaskFilters() { private Set<Entry<GoogleTaskAccount, List<Filter>>> getGoogleTaskFilters() {
return gtasksFilterExposer.getFilters(); return gtasksFilterExposer.getFilters().entrySet();
} }
private List<Pair<CaldavAccount, List<Filter>>> getCaldavFilters() { private Set<Entry<CaldavAccount, List<Filter>>> getCaldavFilters() {
return caldavFilterExposer.getFilters(); return caldavFilterExposer.getFilters().entrySet();
} }
private List<FilterListItem> getSubmenu(int title, List<Filter> filters) { private List<FilterListItem> getSubmenu(int title, List<Filter> filters) {

@ -0,0 +1,55 @@
package org.tasks.filters;
import androidx.room.Embedded;
import org.tasks.data.GoogleTaskAccount;
import org.tasks.data.GoogleTaskList;
public class GoogleTaskFilters {
@Embedded public GoogleTaskList googleTaskList;
@Embedded public GoogleTaskAccount googleTaskAccount;
public int count;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
GoogleTaskFilters that = (GoogleTaskFilters) o;
if (count != that.count) {
return false;
}
if (googleTaskList != null
? !googleTaskList.equals(that.googleTaskList)
: that.googleTaskList != null) {
return false;
}
return googleTaskAccount != null
? googleTaskAccount.equals(that.googleTaskAccount)
: that.googleTaskAccount == null;
}
@Override
public int hashCode() {
int result = googleTaskList != null ? googleTaskList.hashCode() : 0;
result = 31 * result + (googleTaskAccount != null ? googleTaskAccount.hashCode() : 0);
result = 31 * result + count;
return result;
}
@Override
public String toString() {
return "GoogleTaskFilters{"
+ "googleTaskList="
+ googleTaskList
+ ", googleTaskAccount="
+ googleTaskAccount
+ ", count="
+ count
+ '}';
}
}

@ -0,0 +1,43 @@
package org.tasks.filters;
import androidx.room.Embedded;
import com.todoroo.astrid.api.TagFilter;
import org.tasks.data.TagData;
public class TagFilters {
@Embedded public TagData tagData;
public int count;
public TagFilter toTagFilter() {
return new TagFilter(tagData);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof TagFilters)) {
return false;
}
TagFilters that = (TagFilters) o;
if (count != that.count) {
return false;
}
return tagData != null ? tagData.equals(that.tagData) : that.tagData == null;
}
@Override
public int hashCode() {
int result = tagData != null ? tagData.hashCode() : 0;
result = 31 * result + count;
return result;
}
@Override
public String toString() {
return "TagFilters{" + "tagData=" + tagData + ", count=" + count + '}';
}
}
Loading…
Cancel
Save