From 5d79aff22dc33b277913bbb29d245e327186965d Mon Sep 17 00:00:00 2001 From: Tim Su Date: Thu, 6 May 2010 02:32:18 -0700 Subject: [PATCH] More work in migrating dao stuff. Almost done. heh. --- .../astrid/api/AstridContentProvider.java | 5 +- external-src/com/thoughtworks/sql/Table.java | 6 +- src/com/todoroo/astrid/dao/MetadataDao.java | 39 ++++----- src/com/todoroo/astrid/dao/TaskDao.java | 85 ++++++------------- src/com/todoroo/astrid/model/Task.java | 4 + .../todoroo/astrid/service/TaskService.java | 11 ++- 6 files changed, 58 insertions(+), 92 deletions(-) diff --git a/api-src/com/todoroo/astrid/api/AstridContentProvider.java b/api-src/com/todoroo/astrid/api/AstridContentProvider.java index 8e581258a..e975c018a 100644 --- a/api-src/com/todoroo/astrid/api/AstridContentProvider.java +++ b/api-src/com/todoroo/astrid/api/AstridContentProvider.java @@ -141,11 +141,13 @@ public class AstridContentProvider { /** int: unixtime Task was completed, 0 if task not completed */ public static final String COMPLETION_DATE = AstridApiConstants.TASK_TABLE + ".completionDate"; - + /** int: unixtime Task was deleted, 0 if task not deleted */ public static final String DELETION_DATE = AstridApiConstants.TASK_TABLE + ".deletionDate"; + public static final String MODIFICATION_DATE = null; + // --- urgency settings public static final int URGENCY_NONE = 0; @@ -165,6 +167,7 @@ public class AstridContentProvider { public static final int IMPORTANCE_SHOULD_DO = 2; public static final int IMPORTANCE_NONE = 3; + } // --- internal methods diff --git a/external-src/com/thoughtworks/sql/Table.java b/external-src/com/thoughtworks/sql/Table.java index 54bff107f..73a9c6087 100644 --- a/external-src/com/thoughtworks/sql/Table.java +++ b/external-src/com/thoughtworks/sql/Table.java @@ -11,10 +11,10 @@ public class Table extends DBObject { } @SuppressWarnings("nls") - public Field field(String fieldName) { + protected String fieldExpression(String fieldName) { if (hasAlias()) { - return Field.field(alias + "." + fieldName); + return alias + "." + fieldName; } - return Field.field(expression+"."+fieldName); + return expression+"."+fieldName; } } diff --git a/src/com/todoroo/astrid/dao/MetadataDao.java b/src/com/todoroo/astrid/dao/MetadataDao.java index 7d322d1c4..f244176f7 100644 --- a/src/com/todoroo/astrid/dao/MetadataDao.java +++ b/src/com/todoroo/astrid/dao/MetadataDao.java @@ -6,12 +6,14 @@ package com.todoroo.astrid.dao; import android.database.Cursor; -import android.database.DatabaseUtils; -import com.todoroo.android.data.AbstractDao; -import com.todoroo.android.data.AbstractDatabase; -import com.todoroo.android.data.Property; -import com.todoroo.android.data.TodorooCursor; +import com.thoughtworks.sql.Criterion; +import com.thoughtworks.sql.Join; +import com.thoughtworks.sql.Query; +import com.todoroo.andlib.data.AbstractDao; +import com.todoroo.andlib.data.AbstractDatabase; +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -32,18 +34,16 @@ public class MetadataDao extends AbstractDao { /** * Generates SQL clauses */ - public static class MetadataSql { + public static class MetadataCriteria { /** Returns all metadata associated with a given task */ - public static String byTask(long taskId) { - return String.format("(%s = %d)", Metadata.TASK, //$NON-NLS-1$ - taskId); + public static Criterion byTask(long taskId) { + return Metadata.TASK.eq(taskId); } /** Returns all metadata associated with a given key */ - public static String withKey(String key) { - return String.format("(%s = %s)", Metadata.KEY, //$NON-NLS-1$ - DatabaseUtils.sqlEscapeString(key)); + public static Criterion withKey(String key) { + return Metadata.KEY.eq(key); } } @@ -54,8 +54,9 @@ public class MetadataDao extends AbstractDao { * @param where * @return # of deleted items */ - public int deleteWhere(AbstractDatabase database, String where) { - return database.getDatabase().delete(Database.METADATA_TABLE, where, null); + public int deleteWhere(AbstractDatabase database, Criterion where) { + return database.getDatabase().delete(Metadata.TABLE.getName(), + where.toString(), null); } /** @@ -65,13 +66,9 @@ public class MetadataDao extends AbstractDao { * @return */ public TodorooCursor fetchDangling(AbstractDatabase database, Property[] properties) { - String sql = String.format("SELECT %s FROM %s LEFT JOIN %s ON %s.%s = %s.%s WHERE %s.%s ISNULL", //$NON-NLS-1$ - propertiesForSelect(properties, true), - Database.METADATA_TABLE, Database.TASK_TABLE, - Database.METADATA_TABLE, Metadata.TASK, Database.TASK_TABLE, - Task.ID, - Database.TASK_TABLE, Task.TITLE); - Cursor cursor = database.getDatabase().rawQuery(sql, null); + Query sql = Query.select(properties).from(Metadata.TABLE).join(Join.left(Task.TABLE, + Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull()); + Cursor cursor = database.getDatabase().rawQuery(sql.toString(), null); return new TodorooCursor(cursor); } diff --git a/src/com/todoroo/astrid/dao/TaskDao.java b/src/com/todoroo/astrid/dao/TaskDao.java index 6d2f7a804..a6e719d09 100644 --- a/src/com/todoroo/astrid/dao/TaskDao.java +++ b/src/com/todoroo/astrid/dao/TaskDao.java @@ -8,19 +8,16 @@ package com.todoroo.astrid.dao; import android.content.ContentValues; import android.content.Context; import android.content.Intent; -import android.database.Cursor; +import com.thoughtworks.sql.Criterion; import com.todoroo.andlib.data.AbstractDao; import com.todoroo.andlib.data.AbstractDatabase; -import com.todoroo.andlib.data.Property; -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.utility.DateUtilities; import com.todoroo.astrid.api.AstridApiConstants; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.dao.MetadataDao.MetadataSql; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.model.Task; /** @@ -44,76 +41,48 @@ public class TaskDao extends AbstractDao { /** * Generates SQL clauses */ - public static class TaskSql { + public static class TaskCriteria { /** Returns tasks by id */ - public static String byId(long id) { - return String.format("(%s = %d)", Task.ID, //$NON-NLS-1$ - id); + public static Criterion byId(long id) { + return Task.ID.eq(id); } /** Return tasks that have not yet been completed */ - public static String isActive() { - return String.format("(%s = 0 AND %s = 0)", Task.COMPLETION_DATE, //$NON-NLS-1$ - Task.DELETION_DATE); + public static Criterion isActive() { + return Criterion.and(Task.COMPLETION_DATE.eq(0), + Task.DELETION_DATE.eq(0)); } /** Return tasks that are not hidden at given unixtime */ - public static String isVisible(int time) { - return String.format("(%s < %d)", Task.HIDDEN_UNTIL, time); //$NON-NLS-1$ + public static Criterion isVisible(int time) { + return Task.HIDDEN_UNTIL.lt(time); } /** Returns tasks that have a due date */ - public static String hasDeadlines() { - return String.format("(%s != 0)", Task.DUE_DATE); //$NON-NLS-1$ + public static Criterion hasDeadlines() { + return Task.DUE_DATE.neq(0); } /** Returns tasks that are due before a certain unixtime */ - public static String dueBefore(int time) { - return String.format("(%s > 0 AND %s <= %d)", Task.DUE_DATE, //$NON-NLS-1$ - Task.DUE_DATE, time); + public static Criterion dueBefore(int time) { + return Criterion.and(Task.DUE_DATE.gt(0), Task.DUE_DATE.lt(time)); } /** Returns tasks that are due after a certain unixtime */ - public static String dueAfter(int time) { - return String.format("(%s > %d)", Task.DUE_DATE, time); //$NON-NLS-1$ + public static Criterion dueAfter(int time) { + return Task.DUE_DATE.gt(time); } /** Returns tasks completed before a given unixtime */ - public static String completedBefore(int time) { - return String.format("(%s > 0 AND %s < %d)", Task.COMPLETION_DATE, //$NON-NLS-1$ - Task.COMPLETION_DATE, time); + public static Criterion completedBefore(int time) { + return Criterion.and(Task.COMPLETION_DATE.gt(0), Task.COMPLETION_DATE.lt(time)); } - public static String hasNoName() { - return String.format("(%s = \"\")", Task.TITLE); //$NON-NLS-1$ - } - } // --- custom operations - /** - * Return cursor to all tasks matched by given filter - * - * @param database - * @param properties - * properties to read from task - * @param filter - * {@link Filter} object to use - * @return - */ - public TodorooCursor fetch(Database database, Property[] properties, - Filter filter) { - - String query = String.format( - "SELECT %s FROM %s %s ", //$NON-NLS-1$ - propertiesForSelect(properties, true), - Database.TASK_TABLE, - filter.sqlQuery); - Cursor cursor = database.getDatabase().rawQuery(query, null); - return new TodorooCursor(cursor); - } // --- delete @@ -131,7 +100,7 @@ public class TaskDao extends AbstractDao { return false; // delete all metadata - metadataDao.deleteWhere(database, MetadataSql.byTask(id)); + metadataDao.deleteWhere(database, MetadataCriteria.byTask(id)); return true; } @@ -149,22 +118,16 @@ public class TaskDao extends AbstractDao { if (task.getId() == Task.NO_ID) { task.setValue(Task.CREATION_DATE, DateUtilities.now()); - saveSuccessful = createItem(database, Database.TASK_TABLE, task); - - Context context = ContextManager.getContext(); - Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_CREATED); - broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId()); - context.sendOrderedBroadcast(broadcastIntent, null); + task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); + saveSuccessful = createItem(database, Task.TABLE, task); } else { ContentValues values = task.getSetValues(); - - if(values.size() == 0) // nothing changed + if(values.size() == 0) return true; - + task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); beforeSave(database, task, values, duringSync); - saveSuccessful = saveItem(database, Database.TASK_TABLE, task); + saveSuccessful = saveItem(database, Task.TABLE, task); afterSave(database, task, values, duringSync); - } return saveSuccessful; diff --git a/src/com/todoroo/astrid/model/Task.java b/src/com/todoroo/astrid/model/Task.java index 824909d6e..009d6d20a 100644 --- a/src/com/todoroo/astrid/model/Task.java +++ b/src/com/todoroo/astrid/model/Task.java @@ -61,6 +61,10 @@ public class Task extends AbstractModel { public static final IntegerProperty CREATION_DATE = new IntegerProperty( TABLE, AstridTask.CREATION_DATE); + /** Unixtime Task was last touched */ + public static final IntegerProperty MODIFICATION_DATE = new IntegerProperty( + TABLE, AstridTask.MODIFICATION_DATE); + /** Unixtime Task was completed. 0 means active */ public static final IntegerProperty COMPLETION_DATE = new IntegerProperty( TABLE, AstridTask.COMPLETION_DATE); diff --git a/src/com/todoroo/astrid/service/TaskService.java b/src/com/todoroo/astrid/service/TaskService.java index 14a299c37..694ea5775 100644 --- a/src/com/todoroo/astrid/service/TaskService.java +++ b/src/com/todoroo/astrid/service/TaskService.java @@ -1,14 +1,13 @@ package com.todoroo.astrid.service; -import com.todoroo.android.data.Property; -import com.todoroo.android.data.TodorooCursor; -import com.todoroo.android.service.Autowired; -import com.todoroo.android.service.DependencyInjectionService; -import com.todoroo.android.utility.DateUtilities; +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.dao.TaskDao.TaskSql; import com.todoroo.astrid.model.Task; /**