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;
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.GtasksFilter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.tasks.data.GoogleTaskAccount;
import org.tasks.data.GoogleTaskList;
import org.tasks.data.GoogleTaskListDao;
import org.tasks.filters.GoogleTaskFilters;
import org.tasks.sync.SyncAdapters;
/**
@ -40,26 +40,25 @@ public class GtasksFilterExposer {
this.googleTaskListDao = googleTaskListDao;
}
public List<Pair<GoogleTaskAccount, List<Filter>>> getFilters() {
List<Pair<GoogleTaskAccount, List<Filter>>> listFilters = newArrayList();
for (GoogleTaskAccount account : googleTaskListDao.getAccounts()) {
List<GoogleTaskList> lists = googleTaskListDao.getLists(account.getAccount());
listFilters.add(new Pair<>(account, transform(lists, GtasksFilter::new)));
public Map<GoogleTaskAccount, List<Filter>> getFilters() {
List<GoogleTaskFilters> googleTaskFilters = googleTaskListDao.getGoogleTaskFilters();
LinkedHashMap<GoogleTaskAccount, List<Filter>> filters = new LinkedHashMap<>();
for (GoogleTaskFilters filter : googleTaskFilters) {
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) {
if (syncAdapters.isGoogleTaskSyncEnabled()) {
GoogleTaskList list = gtasksListService.getList(id);
if (list != null) {
return filterFromList(list);
return new GtasksFilter(list);
}
}
return null;
}
private Filter filterFromList(GoogleTaskList list) {
return new GtasksFilter(list);
}
}

@ -6,13 +6,16 @@
package com.todoroo.astrid.tags;
import static com.google.common.collect.Lists.transform;
import com.google.common.base.Strings;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TagFilter;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.tasks.data.TagData;
import org.tasks.data.TagDataDao;
import org.tasks.filters.TagFilters;
/**
* Exposes filters based on tags
@ -22,9 +25,11 @@ import org.tasks.data.TagData;
public class TagFilterExposer {
private final TagService tagService;
private final TagDataDao tagDataDao;
@Inject
public TagFilterExposer(TagService tagService) {
public TagFilterExposer(TagDataDao tagDataDao, TagService tagService) {
this.tagDataDao = tagDataDao;
this.tagService = tagService;
}
@ -37,21 +42,10 @@ public class TagFilterExposer {
}
public List<Filter> getFilters() {
return filterFromTags(tagService.getTagList());
return transform(tagDataDao.getTagFilters(), TagFilters::toTagFilter);
}
public Filter getFilterByUuid(String 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;
}
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
* that. Otherwise, return the argument

@ -1,16 +1,16 @@
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.Filter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao;
import org.tasks.filters.CaldavFilters;
import org.tasks.sync.SyncAdapters;
public class CaldavFilterExposer {
@ -24,11 +24,14 @@ public class CaldavFilterExposer {
this.syncAdapters = syncAdapters;
}
public List<Pair<CaldavAccount, List<Filter>>> getFilters() {
List<Pair<CaldavAccount, List<Filter>>> filters = new ArrayList<>();
for (CaldavAccount account : caldavDao.getAccounts()) {
List<CaldavCalendar> calendars = caldavDao.getCalendarsByAccount(account.getUuid());
filters.add(new Pair<>(account, transform(calendars, CaldavFilter::new)));
public Map<CaldavAccount, List<Filter>> getFilters() {
List<CaldavFilters> caldavFilters = caldavDao.getCaldavFilters();
LinkedHashMap<CaldavAccount, List<Filter>> filters = new LinkedHashMap<>();
for (CaldavFilters filter : caldavFilters) {
if (!filters.containsKey(filter.caldavAccount)) {
filters.put(filter.caldavAccount, new ArrayList<>());
}
filters.get(filter.caldavAccount).add(new CaldavFilter(filter.caldavCalendar));
}
return filters;
}

@ -8,6 +8,7 @@ import androidx.room.Query;
import androidx.room.Update;
import io.reactivex.Single;
import java.util.List;
import org.tasks.filters.CaldavFilters;
@Dao
public interface CaldavDao {
@ -66,9 +67,6 @@ public interface CaldavDao {
@Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE")
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")
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)")
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 io.reactivex.Single;
import java.util.List;
import org.tasks.filters.GoogleTaskFilters;
@Dao
public abstract class GoogleTaskListDao {
@ -54,4 +55,14 @@ public abstract class GoogleTaskListDao {
@Update
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.helper.UUIDHelper;
import java.util.List;
import org.tasks.filters.TagFilters;
@Dao
public abstract class TagDataDao {
@ -45,4 +46,14 @@ public abstract class TagDataDao {
}
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.Intent;
import android.net.Uri;
import androidx.core.util.Pair;
import com.google.common.collect.ImmutableList;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
@ -23,6 +22,9 @@ import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.timers.TimerFilterExposer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.inject.Inject;
import org.tasks.BuildConfig;
import org.tasks.R;
@ -78,17 +80,18 @@ public class FilterProvider {
item.icon = R.drawable.ic_outline_cloud_off_24px;
items.add(item);
for (Pair<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) {
GoogleTaskAccount account = filters.first;
for (Map.Entry<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) {
GoogleTaskAccount account = filters.getKey();
items.addAll(
getSubmenu(
account.getAccount(), !isNullOrEmpty(account.getError()), filters.second, true));
account.getAccount(), !isNullOrEmpty(account.getError()), filters.getValue(), true));
}
for (Pair<CaldavAccount, List<Filter>> filters : getCaldavFilters()) {
CaldavAccount account = filters.first;
for (Map.Entry<CaldavAccount, List<Filter>> filters : getCaldavFilters()) {
CaldavAccount account = filters.getKey();
items.addAll(
getSubmenu(account.getName(), !isNullOrEmpty(account.getError()), filters.second, true));
getSubmenu(
account.getName(), !isNullOrEmpty(account.getError()), filters.getValue(), true));
}
return items;
@ -123,13 +126,13 @@ public class FilterProvider {
NavigationDrawerFragment.REQUEST_NEW_LIST));
}
for (Pair<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) {
GoogleTaskAccount account = filters.first;
for (Map.Entry<GoogleTaskAccount, List<Filter>> filters : getGoogleTaskFilters()) {
GoogleTaskAccount account = filters.getKey();
items.addAll(
getSubmenu(
account.getAccount(),
!isNullOrEmpty(account.getError()),
filters.second,
filters.getValue(),
!navigationDrawer));
if (navigationDrawer) {
@ -143,13 +146,13 @@ public class FilterProvider {
}
}
for (Pair<CaldavAccount, List<Filter>> filters : getCaldavFilters()) {
CaldavAccount account = filters.first;
for (Map.Entry<CaldavAccount, List<Filter>> filters : getCaldavFilters()) {
CaldavAccount account = filters.getKey();
items.addAll(
getSubmenu(
account.getName(),
!isNullOrEmpty(account.getError()),
filters.second,
filters.getValue(),
!navigationDrawer));
if (navigationDrawer) {
@ -202,12 +205,12 @@ public class FilterProvider {
return filters;
}
private List<Pair<GoogleTaskAccount, List<Filter>>> getGoogleTaskFilters() {
return gtasksFilterExposer.getFilters();
private Set<Entry<GoogleTaskAccount, List<Filter>>> getGoogleTaskFilters() {
return gtasksFilterExposer.getFilters().entrySet();
}
private List<Pair<CaldavAccount, List<Filter>>> getCaldavFilters() {
return caldavFilterExposer.getFilters();
private Set<Entry<CaldavAccount, List<Filter>>> getCaldavFilters() {
return caldavFilterExposer.getFilters().entrySet();
}
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