Hard code orders

pull/618/head
Alex Baker 8 years ago
parent 2711485dab
commit 39c10a8ac9

@ -7,14 +7,6 @@ package com.todoroo.andlib.sql;
public final class Functions { 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) { public static Field upper(Field title) {
return new Field("UPPER(" + title.toString() + ")"); return new Field("UPPER(" + title.toString() + ")");
} }

@ -73,19 +73,20 @@ public class SortHelper {
order = ORDER_TITLE; order = ORDER_TITLE;
break; break;
case SORT_DUE: case SORT_DUE:
order = Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0), 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");
Functions.now() + "*2", adjustedDueDateFunction()) + "+" + Task.IMPORTANCE);
break; break;
case SORT_IMPORTANCE: case SORT_IMPORTANCE:
order = Order.asc(Task.IMPORTANCE + "*" + (2*DateUtilities.now()) + order = Order.asc("importance*(strftime('%s','now')*1000)+(CASE WHEN (dueDate=0) THEN (strftime('%s','now')*1000) ELSE dueDate END)");
"+" + Functions.caseStatement(Task.DUE_DATE.eq(0), 2 * DateUtilities.now(), Task.DUE_DATE));
break; break;
case SORT_MODIFIED: case SORT_MODIFIED:
order = Order.desc(Task.MODIFICATION_DATE); order = Order.desc(Task.MODIFICATION_DATE);
break; break;
case SORT_WIDGET: case SORT_WIDGET:
default: 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) { if (sortType != SORT_ALPHA) {
order.addSecondaryExpression(ORDER_TITLE); order.addSecondaryExpression(ORDER_TITLE);
@ -94,18 +95,8 @@ public class SortHelper {
return order; 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() { 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)";
} }
} }

@ -17,7 +17,6 @@ import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
@ -206,11 +205,11 @@ public abstract class TaskDao {
return false; return false;
} }
public List<Task> getAstrid2TaskProviderTasks() { @android.arch.persistence.room.Query("SELECT * FROM tasks " +
return toList(query(Query.select() "WHERE completed = 0 AND deleted = 0 AND hideUntil < (strftime('%s','now')*1000) " +
.where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible())) "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 " +
.orderBy(SortHelper.defaultTaskOrder()).limit(100))); "LIMIT 100")
} public abstract List<Task> getAstrid2TaskProviderTasks();
/** /**
* Mark the given task as completed and save it. * Mark the given task as completed and save it.
@ -239,14 +238,7 @@ public abstract class TaskDao {
} }
public List<Task> fetchFiltered(String query) { public List<Task> fetchFiltered(String query) {
return toList(fetchFiltered(query, Task.PROPERTIES)); Cursor cursor = fetchFiltered(query, Task.PROPERTIES);
}
public Cursor fetchFiltered(String queryTemplate, Property<?>... properties) {
return query(Query.select(properties).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate)));
}
private List<Task> toList(Cursor cursor) {
List<Task> result = new ArrayList<>(); List<Task> result = new ArrayList<>();
try { try {
for (cursor.moveToFirst() ; !cursor.isAfterLast() ; cursor.moveToNext()) { for (cursor.moveToFirst() ; !cursor.isAfterLast() ; cursor.moveToNext()) {
@ -258,10 +250,8 @@ public abstract class TaskDao {
return result; return result;
} }
/** public Cursor fetchFiltered(String queryTemplate, Property<?>... properties) {
* Construct a query with SQL DSL objects Query query = Query.select(properties).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate));
*/
private Cursor query(Query query) {
String queryString = query.from(Task.TABLE).toString(); String queryString = query.from(Task.TABLE).toString();
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Timber.v(queryString); Timber.v(queryString);

@ -52,8 +52,6 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); 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 NAME = "name";
private final static String IMPORTANCE_COLOR = "importance_color"; private final static String IMPORTANCE_COLOR = "importance_color";
private final static String IDENTIFIER = "identifier"; private final static String IDENTIFIER = "identifier";
@ -163,7 +161,8 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
private Cursor getTasks() { private Cursor getTasks() {
MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST);
List<Integer> importanceColors = checkBoxes.get().getPriorityColors(); List<Integer> importanceColors = checkBoxes.get().getPriorityColors();
for (Task task : taskDao.get().getAstrid2TaskProviderTasks()) { List<Task> tasks = taskDao.get().getAstrid2TaskProviderTasks();
for (Task task : tasks) {
String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR); String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR);
Object[] values = new Object[7]; Object[] values = new Object[7];

@ -30,6 +30,8 @@ import javax.inject.Inject;
import timber.log.Timber; import timber.log.Timber;
import static com.todoroo.andlib.utility.DateUtilities.now;
public class TaskCreator { public class TaskCreator {
private final GCalHelper gcalHelper; private final GCalHelper gcalHelper;
@ -81,6 +83,8 @@ public class TaskCreator {
*/ */
public Task createWithValues(Map<String, Object> values, String title) { public Task createWithValues(Map<String, Object> values, String title) {
Task task = new Task(); Task task = new Task();
task.setCreationDate(now());
task.setModificationDate(now());
if (title != null) { if (title != null) {
task.setTitle(title.trim()); task.setTitle(title.trim());
} }

Loading…
Cancel
Save