diff --git a/app/src/main/java/com/todoroo/andlib/sql/Functions.java b/app/src/main/java/com/todoroo/andlib/sql/Functions.java index 38d339040..9705626d5 100644 --- a/app/src/main/java/com/todoroo/andlib/sql/Functions.java +++ b/app/src/main/java/com/todoroo/andlib/sql/Functions.java @@ -7,14 +7,6 @@ package com.todoroo.andlib.sql; public final class Functions { - public static String caseStatement(Criterion when, Object ifTrue, Object ifFalse) { - return "(CASE WHEN " + when.toString() + " THEN " + value(ifTrue) + " ELSE " + value(ifFalse) + " END)"; - } - - private static String value(Object value) { - return value.toString(); - } - public static Field upper(Field title) { return new Field("UPPER(" + title.toString() + ")"); } diff --git a/app/src/main/java/com/todoroo/astrid/core/SortHelper.java b/app/src/main/java/com/todoroo/astrid/core/SortHelper.java index 01a3cc814..f005e492f 100644 --- a/app/src/main/java/com/todoroo/astrid/core/SortHelper.java +++ b/app/src/main/java/com/todoroo/astrid/core/SortHelper.java @@ -73,19 +73,20 @@ public class SortHelper { order = ORDER_TITLE; break; case SORT_DUE: - order = Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0), - Functions.now() + "*2", adjustedDueDateFunction()) + "+" + Task.IMPORTANCE); + order = Order.asc("(CASE WHEN (dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE (CASE WHEN (dueDate / 60000) > 0 THEN dueDate ELSE (dueDate + 43140000) END) END)+importance"); break; case SORT_IMPORTANCE: - order = Order.asc(Task.IMPORTANCE + "*" + (2*DateUtilities.now()) + - "+" + Functions.caseStatement(Task.DUE_DATE.eq(0), 2 * DateUtilities.now(), Task.DUE_DATE)); + order = Order.asc("importance*(strftime('%s','now')*1000)+(CASE WHEN (dueDate=0) THEN (strftime('%s','now')*1000) ELSE dueDate END)"); break; case SORT_MODIFIED: order = Order.desc(Task.MODIFICATION_DATE); break; case SORT_WIDGET: default: - order = defaultTaskOrder(); + order = Order.asc("(CASE WHEN (dueDate=0) " + // if no due date + "THEN (strftime('%s','now')*1000)*2 " + // then now * 2 + "ELSE (" + adjustedDueDateFunction() + ") END) " + // else due time + "+ 172800000 * importance"); // add 2 days * importance } if (sortType != SORT_ALPHA) { order.addSecondaryExpression(ORDER_TITLE); @@ -94,18 +95,8 @@ public class SortHelper { return order; } - /** - * Returns SQL task ordering that is astrid's default algorithm - */ - public static Order defaultTaskOrder() { - return Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0), - Functions.now() + "*2", - adjustedDueDateFunction()) + " + " + (2 * DateUtilities.ONE_DAY) + " * " + - Task.IMPORTANCE); - } - private static String adjustedDueDateFunction() { - return "(CASE WHEN (" + Task.DUE_DATE.name + " / 60000) > 0" + " THEN " + Task.DUE_DATE.name + " ELSE " + "(" + Task.DUE_DATE.name + " + " + (DateUtilities.ONE_HOUR * 11 + DateUtilities.ONE_MINUTE * 59) + ") END)"; + // if no due time use 11:59AM + return "(CASE WHEN (dueDate / 60000) > 0 THEN dueDate ELSE (dueDate + 43140000) END)"; } - } diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java index 7c7eb18fb..2fbe4efdf 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java @@ -17,7 +17,6 @@ import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.PermaSql; -import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.data.Task; import org.tasks.BuildConfig; @@ -206,11 +205,11 @@ public abstract class TaskDao { return false; } - public List getAstrid2TaskProviderTasks() { - return toList(query(Query.select() - .where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible())) - .orderBy(SortHelper.defaultTaskOrder()).limit(100))); - } + @android.arch.persistence.room.Query("SELECT * FROM tasks " + + "WHERE completed = 0 AND deleted = 0 AND hideUntil < (strftime('%s','now')*1000) " + + "ORDER BY (CASE WHEN (dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE ((CASE WHEN (dueDate / 60000) > 0 THEN dueDate ELSE (dueDate + 43140000) END)) END) + 172800000 * importance ASC " + + "LIMIT 100") + public abstract List getAstrid2TaskProviderTasks(); /** * Mark the given task as completed and save it. @@ -239,14 +238,7 @@ public abstract class TaskDao { } public List fetchFiltered(String query) { - return toList(fetchFiltered(query, Task.PROPERTIES)); - } - - public Cursor fetchFiltered(String queryTemplate, Property... properties) { - return query(Query.select(properties).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate))); - } - - private List toList(Cursor cursor) { + Cursor cursor = fetchFiltered(query, Task.PROPERTIES); List result = new ArrayList<>(); try { for (cursor.moveToFirst() ; !cursor.isAfterLast() ; cursor.moveToNext()) { @@ -258,10 +250,8 @@ public abstract class TaskDao { return result; } - /** - * Construct a query with SQL DSL objects - */ - private Cursor query(Query query) { + public Cursor fetchFiltered(String queryTemplate, Property... properties) { + Query query = Query.select(properties).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate)); String queryString = query.from(Task.TABLE).toString(); if (BuildConfig.DEBUG) { Timber.v(queryString); diff --git a/app/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java b/app/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java index 5e9ef5f97..80ce7c757 100644 --- a/app/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java +++ b/app/src/main/java/com/todoroo/astrid/provider/Astrid2TaskProvider.java @@ -52,8 +52,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider { private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); - private static final int MAX_NUMBER_OF_TASKS = 100; - private final static String NAME = "name"; private final static String IMPORTANCE_COLOR = "importance_color"; private final static String IDENTIFIER = "identifier"; @@ -163,7 +161,8 @@ public class Astrid2TaskProvider extends InjectingContentProvider { private Cursor getTasks() { MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); List importanceColors = checkBoxes.get().getPriorityColors(); - for (Task task : taskDao.get().getAstrid2TaskProviderTasks()) { + List tasks = taskDao.get().getAstrid2TaskProviderTasks(); + for (Task task : tasks) { String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR); Object[] values = new Object[7]; diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java index fa76e0339..efd4c459f 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java @@ -30,6 +30,8 @@ import javax.inject.Inject; import timber.log.Timber; +import static com.todoroo.andlib.utility.DateUtilities.now; + public class TaskCreator { private final GCalHelper gcalHelper; @@ -81,6 +83,8 @@ public class TaskCreator { */ public Task createWithValues(Map values, String title) { Task task = new Task(); + task.setCreationDate(now()); + task.setModificationDate(now()); if (title != null) { task.setTitle(title.trim()); }