mirror of https://github.com/tasks/tasks
First pass at tasks to tags table migration
parent
d290bb15e9
commit
6060424187
@ -0,0 +1,76 @@
|
||||
package com.todoroo.astrid.data;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.todoroo.andlib.data.AbstractModel;
|
||||
import com.todoroo.andlib.data.Property;
|
||||
import com.todoroo.andlib.data.Property.LongProperty;
|
||||
import com.todoroo.andlib.data.Table;
|
||||
import com.todoroo.astrid.api.AstridApiConstants;
|
||||
|
||||
@SuppressWarnings("nls")
|
||||
public class TaskToTag extends AbstractModel {
|
||||
|
||||
/** table for this model */
|
||||
public static final Table TABLE = new Table("tasks_to_tags", TaskToTag.class);
|
||||
|
||||
/** content uri for this model */
|
||||
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
|
||||
TABLE.name);
|
||||
|
||||
// --- properties
|
||||
|
||||
/** ID */
|
||||
public static final LongProperty ID = new LongProperty(
|
||||
TABLE, ID_PROPERTY_NAME);
|
||||
|
||||
public static final LongProperty TASK_ID = new LongProperty(
|
||||
TABLE, "taskId");
|
||||
|
||||
public static final LongProperty TASK_UUID = new LongProperty(
|
||||
TABLE, "taskUuid");
|
||||
|
||||
public static final LongProperty TAG_ID = new LongProperty(
|
||||
TABLE, "tagId");
|
||||
|
||||
public static final LongProperty TAG_UUID = new LongProperty(
|
||||
TABLE, "tagUuid");
|
||||
|
||||
public static final LongProperty DELETED_AT = new LongProperty(
|
||||
TABLE, "deletedAt");
|
||||
|
||||
public static final LongProperty PUSHED_AT = new LongProperty(
|
||||
TABLE, "pushedAt");
|
||||
|
||||
/** List of all properties for this model */
|
||||
public static final Property<?>[] PROPERTIES = generateProperties(TaskToTag.class);
|
||||
|
||||
/** Default values container */
|
||||
private static final ContentValues defaultValues = new ContentValues();
|
||||
|
||||
static {
|
||||
defaultValues.put(DELETED_AT.name, 0L);
|
||||
defaultValues.put(PUSHED_AT.name, 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContentValues getDefaultValues() {
|
||||
return defaultValues;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return getIdHelper(ID);
|
||||
};
|
||||
|
||||
// --- parcelable helpers
|
||||
|
||||
private static final Creator<TaskToTag> CREATOR = new ModelCreator<TaskToTag>(TaskToTag.class);
|
||||
|
||||
@Override
|
||||
protected Creator<? extends AbstractModel> getCreator() {
|
||||
return CREATOR;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
package com.todoroo.astrid.tags;
|
||||
|
||||
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.Join;
|
||||
import com.todoroo.andlib.sql.Query;
|
||||
import com.todoroo.andlib.utility.Preferences;
|
||||
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
|
||||
import com.todoroo.astrid.dao.TaskToTagDao;
|
||||
import com.todoroo.astrid.data.Metadata;
|
||||
import com.todoroo.astrid.data.TagData;
|
||||
import com.todoroo.astrid.data.TaskToTag;
|
||||
import com.todoroo.astrid.service.MetadataService;
|
||||
import com.todoroo.astrid.service.TagDataService;
|
||||
|
||||
public class TagsTableMigrator {
|
||||
|
||||
@Autowired private MetadataService metadataService;
|
||||
@Autowired private TagDataService tagDataService;
|
||||
@Autowired private TaskToTagDao taskToTagDao;
|
||||
|
||||
private static final String PREF_MIGRATED_TASKS_TO_TAGS = "tasks_to_tags_migration"; //$NON-NLS-1$
|
||||
|
||||
public TagsTableMigrator() {
|
||||
DependencyInjectionService.getInstance().inject(this);
|
||||
}
|
||||
|
||||
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<Metadata> noTagData = metadataService.query(noTagDataQuery);
|
||||
try {
|
||||
Metadata tag = new Metadata();
|
||||
for (noTagData.moveToFirst(); !noTagData.isAfterLast(); noTagData.moveToNext()) {
|
||||
tag.readFromCursor(noTagData);
|
||||
|
||||
System.err.println("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 move all tag metadata to the new table
|
||||
Query joinedTagData = Query.select(Metadata.TASK, TagService.TAG, TagData.ID)
|
||||
.join(Join.left(TagData.TABLE,
|
||||
Criterion.and(MetadataCriteria.withKey(TagService.KEY), TagService.TAG.eq(TagData.NAME))));
|
||||
|
||||
TodorooCursor<Metadata> allTagLinks = metadataService.query(joinedTagData);
|
||||
try {
|
||||
Metadata tag = new Metadata();
|
||||
for (allTagLinks.moveToFirst(); !allTagLinks.isAfterLast(); allTagLinks.moveToNext()) {
|
||||
tag.readFromCursor(allTagLinks);
|
||||
|
||||
// Create new tag links
|
||||
TaskToTag link = new TaskToTag();
|
||||
System.err.println("LINK from task " + tag.getValue(Metadata.TASK) + " to " + tag.getValue(TagService.TAG));
|
||||
link.setValue(TaskToTag.TASK_ID, tag.getValue(Metadata.TASK));
|
||||
link.setValue(TaskToTag.TAG_ID, tag.getValue(TagData.ID));
|
||||
|
||||
taskToTagDao.createNew(link);
|
||||
}
|
||||
} finally {
|
||||
allTagLinks.close();
|
||||
}
|
||||
|
||||
Preferences.setBoolean(PREF_MIGRATED_TASKS_TO_TAGS, true);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.todoroo.astrid.dao;
|
||||
|
||||
import com.todoroo.andlib.data.DatabaseDao;
|
||||
import com.todoroo.andlib.service.Autowired;
|
||||
import com.todoroo.andlib.service.DependencyInjectionService;
|
||||
import com.todoroo.astrid.data.TaskToTag;
|
||||
|
||||
public class TaskToTagDao extends DatabaseDao<TaskToTag> {
|
||||
|
||||
@Autowired
|
||||
private Database database;
|
||||
|
||||
public TaskToTagDao() {
|
||||
super(TaskToTag.class);
|
||||
DependencyInjectionService.getInstance().inject(this);
|
||||
setDatabase(database);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue