From 978fe0271818cfabf5f23ac023900913f48a7283 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 14 Sep 2012 15:00:46 -0700 Subject: [PATCH] Cherry pick some code for migration to using uuids --- .../todoroo/andlib/data/AbstractModel.java | 2 +- .../astrid/tags/Astrid44SyncMigrator.java | 100 ++++++++++++++++++ .../com/todoroo/astrid/tags/TagService.java | 1 + .../astrid/tags/TagsTableMigrator.java | 59 ----------- .../astrid/service/UpgradeService.java | 4 +- 5 files changed, 104 insertions(+), 62 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java delete mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/TagsTableMigrator.java diff --git a/api/src/com/todoroo/andlib/data/AbstractModel.java b/api/src/com/todoroo/andlib/data/AbstractModel.java index 132b2a168..afb935ac4 100644 --- a/api/src/com/todoroo/andlib/data/AbstractModel.java +++ b/api/src/com/todoroo/andlib/data/AbstractModel.java @@ -164,7 +164,7 @@ public abstract class AbstractModel implements Parcelable, Cloneable { /** * Reads all properties from the supplied cursor and store */ - protected synchronized void readPropertiesFromCursor(TodorooCursor cursor) { + public synchronized void readPropertiesFromCursor(TodorooCursor cursor) { if (values == null) values = new ContentValues(); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java b/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java new file mode 100644 index 000000000..cfc5887c3 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java @@ -0,0 +1,100 @@ +package com.todoroo.astrid.tags; + +import android.util.Log; + +import com.todoroo.andlib.data.DatabaseDao; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.utility.Pair; +import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; +import com.todoroo.astrid.dao.TagDataDao; +import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.dao.UpdateDao; +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.RemoteModel; +import com.todoroo.astrid.data.TagData; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.data.Update; +import com.todoroo.astrid.helper.UUIDHelper; +import com.todoroo.astrid.service.MetadataService; +import com.todoroo.astrid.service.TagDataService; +import com.todoroo.astrid.utility.Constants; + +public class Astrid44SyncMigrator { + + @Autowired private MetadataService metadataService; + @Autowired private TagDataService tagDataService; + @Autowired private TagDataDao tagDataDao; + @Autowired private TaskDao taskDao; + @Autowired private UpdateDao updateDao; + + private static final String PREF_MIGRATED_TASKS_TO_TAGS = "tasks_to_tags_migration"; //$NON-NLS-1$ + + public Astrid44SyncMigrator() { + DependencyInjectionService.getInstance().inject(this); + } + + @SuppressWarnings("nls") + public void migrateTagMetadataToTable() { + if (Preferences.getBoolean(PREF_MIGRATED_TASKS_TO_TAGS, false)) + return; + + // -------------- + // First assert that a TagData object exists for each tag metadata + // -------------- + Query noTagDataQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and( + MetadataCriteria.withKey(TagService.KEY), + Criterion.not(TagService.TAG.in(Query.select(TagData.NAME).from(TagData.TABLE))))).groupBy(TagService.TAG); + + TodorooCursor noTagData = metadataService.query(noTagDataQuery); + try { + Metadata tag = new Metadata(); + for (noTagData.moveToFirst(); !noTagData.isAfterLast(); noTagData.moveToNext()) { + tag.readFromCursor(noTagData); + + if (Constants.DEBUG) + Log.w("tag-link-migrate", "CREATING TAG DATA " + tag.getValue(TagService.TAG)); + + TagData newTagData = new TagData(); + newTagData.setValue(TagData.NAME, tag.getValue(TagService.TAG)); + tagDataService.save(newTagData); + } + } finally { + noTagData.close(); + } + + // -------------- + // Then assert that every remote model has a remote id, by generating one using the uuid generator for all those without one + // -------------- + Query tagsWithoutUUIDQuery = Query.select(TagData.ID, TagData.REMOTE_ID).where(Criterion.or(TagData.REMOTE_ID.isNull(), TagData.REMOTE_ID.eq(0))); + assertUUIDsExist(tagsWithoutUUIDQuery, new TagData(), tagDataDao); + + Query tasksWithoutUUIDQuery = Query.select(Task.ID, Task.REMOTE_ID).where(Criterion.or(Task.REMOTE_ID.isNull(), Task.REMOTE_ID.eq(0))); + assertUUIDsExist(tasksWithoutUUIDQuery, new Task(), taskDao); + + Query updatesWithoutUUIDQuery = Query.select(Update.ID, Update.REMOTE_ID).where(Criterion.or(Update.REMOTE_ID.isNull(), Update.REMOTE_ID.eq(0))); + assertUUIDsExist(updatesWithoutUUIDQuery, new Update(), updateDao); + + Preferences.setBoolean(PREF_MIGRATED_TASKS_TO_TAGS, true); + } + + private void assertUUIDsExist(Query query, TYPE instance, DatabaseDao dao) { + TodorooCursor cursor = dao.query(query); + try { + for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + instance.readPropertiesFromCursor(cursor); + Pair uuidPair = UUIDHelper.newUUID(); + instance.setValue(RemoteModel.REMOTE_ID_PROPERTY, uuidPair.getLeft()); + instance.setValue(RemoteModel.PROOF_TEXT_PROPERTY, uuidPair.getRight()); + dao.saveExisting(instance); + } + } finally { + cursor.close(); + } + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index b0a8f65ea..47937a893 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -448,6 +448,7 @@ public final class TagService { return renameHelper(oldTag, newTag, true); } + @Deprecated private int renameHelper(String oldTag, String newTag, boolean caseSensitive) { // First remove newTag from all tasks that have both oldTag and newTag. MetadataService metadataService = PluginServices.getMetadataService(); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagsTableMigrator.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagsTableMigrator.java deleted file mode 100644 index 0b7b6ba7f..000000000 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagsTableMigrator.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.todoroo.astrid.tags; - -import android.util.Log; - -import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.DependencyInjectionService; -import com.todoroo.andlib.sql.Criterion; -import com.todoroo.andlib.sql.Query; -import com.todoroo.andlib.utility.Preferences; -import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; -import com.todoroo.astrid.data.Metadata; -import com.todoroo.astrid.data.TagData; -import com.todoroo.astrid.service.MetadataService; -import com.todoroo.astrid.service.TagDataService; -import com.todoroo.astrid.utility.Constants; - -public class TagsTableMigrator { - - @Autowired private MetadataService metadataService; - @Autowired private TagDataService tagDataService; - - private static final String PREF_MIGRATED_TASKS_TO_TAGS = "tasks_to_tags_migration"; //$NON-NLS-1$ - - public TagsTableMigrator() { - DependencyInjectionService.getInstance().inject(this); - } - - @SuppressWarnings("nls") - public void migrateTagMetadataToTable() { - if (Preferences.getBoolean(PREF_MIGRATED_TASKS_TO_TAGS, false)) - return; - - // First assert that a TagData object exists for each tag metadata - Query noTagDataQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and( - MetadataCriteria.withKey(TagService.KEY), - Criterion.not(TagService.TAG.in(Query.select(TagData.NAME).from(TagData.TABLE))))).groupBy(TagService.TAG); - - TodorooCursor noTagData = metadataService.query(noTagDataQuery); - try { - Metadata tag = new Metadata(); - for (noTagData.moveToFirst(); !noTagData.isAfterLast(); noTagData.moveToNext()) { - tag.readFromCursor(noTagData); - - if (Constants.DEBUG) - Log.w("tag-link-migrate", "CREATING TAG DATA " + tag.getValue(TagService.TAG)); - - TagData newTagData = new TagData(); - newTagData.setValue(TagData.NAME, tag.getValue(TagService.TAG)); - tagDataService.save(newTagData); - } - } finally { - noTagData.close(); - } - - Preferences.setBoolean(PREF_MIGRATED_TASKS_TO_TAGS, true); - } - -} diff --git a/astrid/src/com/todoroo/astrid/service/UpgradeService.java b/astrid/src/com/todoroo/astrid/service/UpgradeService.java index 46f686c9c..ddf82a376 100644 --- a/astrid/src/com/todoroo/astrid/service/UpgradeService.java +++ b/astrid/src/com/todoroo/astrid/service/UpgradeService.java @@ -42,7 +42,7 @@ import com.todoroo.astrid.notes.NoteMetadata; import com.todoroo.astrid.producteev.sync.ProducteevDataService; import com.todoroo.astrid.service.abtesting.ABChooser; import com.todoroo.astrid.tags.TagCaseMigrator; -import com.todoroo.astrid.tags.TagsTableMigrator; +import com.todoroo.astrid.tags.Astrid44SyncMigrator; import com.todoroo.astrid.utility.AstridPreferences; @@ -198,7 +198,7 @@ public final class UpgradeService { new DueDateTimeMigrator().migrateDueTimes(); if (from < V4_4_0) - new TagsTableMigrator().migrateTagMetadataToTable(); + new Astrid44SyncMigrator().migrateTagMetadataToTable(); } finally { DialogUtilities.dismissDialog((Activity)context, dialog);