From 0223ec11a3187609f2eddb4177bf46a7a42a7698 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 27 Aug 2012 14:58:27 -0700 Subject: [PATCH] Use a single join query for the LinkActionExposer --- .../astrid/core/LinkActionExposer.java | 4 +--- .../todoroo/astrid/adapter/TaskAdapter.java | 23 ++++++++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java index 3dbe5f7c3..0e69643b8 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java @@ -28,7 +28,6 @@ import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.api.TaskAction; import com.todoroo.astrid.api.TaskDecoration; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.files.FileMetadata; import com.todoroo.astrid.files.FilesAction; import com.todoroo.astrid.notes.NotesAction; @@ -42,7 +41,7 @@ public class LinkActionExposer { private PackageManager pm; - public List getActionsForTask(Context context, Task task) { + public List getActionsForTask(Context context, Task task, boolean hasAttachments) { List result = new ArrayList(); if (task == null) return result; @@ -51,7 +50,6 @@ public class LinkActionExposer { Linkify.addLinks(titleSpan, Linkify.ALL); URLSpan[] urlSpans = titleSpan.getSpans(0, titleSpan.length(), URLSpan.class); - boolean hasAttachments = FileMetadata.taskHasAttachments(task.getId()); if(urlSpans.length == 0 && TextUtils.isEmpty(notes) && !hasAttachments) return result; diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 8beaed655..1ec813ff0 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -61,6 +61,9 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Join; +import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Pair; @@ -71,7 +74,9 @@ import com.todoroo.astrid.api.TaskAction; import com.todoroo.astrid.api.TaskDecoration; import com.todoroo.astrid.api.TaskDecorationExposer; import com.todoroo.astrid.core.LinkActionExposer; +import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.files.FileMetadata; import com.todoroo.astrid.files.FilesAction; import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.helper.AsyncImageView; @@ -771,25 +776,37 @@ public class TaskAdapter extends CursorAdapter implements Filterable { private final Map taskActionLoader = Collections.synchronizedMap(new HashMap()); + + @SuppressWarnings("nls") public class ActionsLoaderThread extends Thread { + public static final String FILE_COLUMN = "fileId"; + @Override public void run() { AndroidUtilities.sleepDeep(500L); - final TodorooCursor fetchCursor = taskService.fetchFiltered( - query.get(), null, Task.ID, Task.TITLE, Task.NOTES, Task.COMPLETION_DATE); + String groupedQuery; + if (query.get().contains("ORDER BY")) //$NON-NLS-1$ + groupedQuery = query.get().replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY"); //$NON-NLS-1$ + else + groupedQuery = query.get() + " GROUP BY " + Task.ID; + + final TodorooCursor fetchCursor = taskService.query(Query.select(Task.ID, Task.TITLE, Task.NOTES, Task.COMPLETION_DATE, Metadata.ID.as(FILE_COLUMN)).join(Join.left(Metadata.TABLE, + Criterion.and(Metadata.KEY.eq(FileMetadata.METADATA_KEY), Task.ID.eq(Metadata.TASK)))).withQueryTemplate(groupedQuery)); try { Task task = new Task(); LinkActionExposer linkActionExposer = new LinkActionExposer(); + int filesIndex = fetchCursor.getColumnIndex(FILE_COLUMN); for(fetchCursor.moveToFirst(); !fetchCursor.isAfterLast(); fetchCursor.moveToNext()) { task.clear(); task.readFromCursor(fetchCursor); if(task.isCompleted()) continue; + boolean hasAttachments = (filesIndex > 0 && fetchCursor.getLong(filesIndex) > 0); List actions = linkActionExposer. - getActionsForTask(ContextManager.getContext(), task); + getActionsForTask(ContextManager.getContext(), task, hasAttachments); if (actions.size() > 0) taskActionLoader.put(task.getId(), actions.get(0)); }