Remove sync and export cursors

pull/189/head
Alex Baker 12 years ago
parent 328877a2d6
commit 8299b1aa0e

@ -95,6 +95,10 @@ public class DatabaseDao<TYPE extends AbstractModel> {
return result; return result;
} }
public void query(Query query, Callback<TYPE> callback) {
query(callback, query);
}
public void query(Callback<TYPE> callback, Query query) { public void query(Callback<TYPE> callback, Query query) {
TodorooCursor<TYPE> cursor = query(query); TodorooCursor<TYPE> cursor = query(query);
try { try {

@ -22,7 +22,6 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
@ -214,19 +213,18 @@ public class TasksXmlExporter {
} }
private synchronized void serializeMetadata(Task task) throws IOException { private synchronized void serializeMetadata(Task task) throws IOException {
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select( metadataDao.byTask(task.getId(), new Callback<Metadata>() {
Metadata.PROPERTIES).where(MetadataCriteria.byTask(task.getId()))); @Override
try { public void apply(Metadata metadata) {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { try {
Metadata metadata = new Metadata(cursor); xml.startTag(null, BackupConstants.METADATA_TAG);
serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK);
xml.startTag(null, BackupConstants.METADATA_TAG); xml.endTag(null, BackupConstants.METADATA_TAG);
serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK); } catch (IOException e) {
xml.endTag(null, BackupConstants.METADATA_TAG); throw new RuntimeException(e);
}
} }
} finally { });
cursor.close();
}
} }
/** /**

@ -75,6 +75,10 @@ public class MetadataDao extends DatabaseDao<Metadata> {
Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull()))); Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull())));
} }
public void byTask(long taskId, Callback<Metadata> callback) {
query(callback, Query.select(Metadata.PROPERTIES).where(Metadata.TASK.eq(taskId)));
}
public void byTaskAndKey(long taskId, String key, Callback<Metadata> callback) { public void byTaskAndKey(long taskId, String key, Callback<Metadata> callback) {
query(callback, Query.select(Metadata.PROPERTIES).where( query(callback, Query.select(Metadata.PROPERTIES).where(
Criterion.and(Metadata.TASK.eq(taskId), Metadata.KEY.eq(key)))); Criterion.and(Metadata.TASK.eq(taskId), Metadata.KEY.eq(key))));

@ -8,7 +8,7 @@ package com.todoroo.astrid.gtasks;
import android.text.TextUtils; import android.text.TextUtils;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
@ -45,10 +45,6 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
super(taskDao, metadataDao); super(taskDao, metadataDao);
} }
public Criterion getLocalMatchCriteria(GtasksTaskContainer remoteTask) {
return GtasksMetadata.ID.eq(remoteTask.gtaskMetadata.getValue(GtasksMetadata.ID));
}
@Override @Override
public String getMetadataKey() { public String getMetadataKey() {
return GtasksMetadata.METADATA_KEY; return GtasksMetadata.METADATA_KEY;
@ -58,35 +54,23 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
if(remoteTask.task.getId() != Task.NO_ID) { if(remoteTask.task.getId() != Task.NO_ID) {
return; return;
} }
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES). Metadata metadata = getMetadataByGtaskId(remoteTask.gtaskMetadata.getValue(GtasksMetadata.ID));
where(Criterion.and(MetadataCriteria.withKey(getMetadataKey()), if (metadata != null) {
getLocalMatchCriteria(remoteTask)))); remoteTask.task.setId(metadata.getValue(Metadata.TASK));
try {
if(cursor.getCount() == 0) {
return;
}
cursor.moveToFirst();
remoteTask.task.setId(cursor.get(Metadata.TASK));
remoteTask.task.setUuid(taskDao.uuidFromLocalId(remoteTask.task.getId())); remoteTask.task.setUuid(taskDao.uuidFromLocalId(remoteTask.task.getId()));
remoteTask.gtaskMetadata = new Metadata(cursor); remoteTask.gtaskMetadata = metadata;
} finally {
cursor.close();
} }
} }
public long localIdForGtasksId(String gtasksId) { public long localIdForGtasksId(String gtasksId) {
TodorooCursor<Metadata> metadata = metadataDao.query(Query.select(Metadata.TASK).where( Metadata metadata = getMetadataByGtaskId(gtasksId);
Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), GtasksMetadata.ID.eq(gtasksId)))); return metadata == null ? AbstractModel.NO_ID : metadata.getTask();
try { }
if (metadata.getCount() > 0) {
metadata.moveToFirst(); private Metadata getMetadataByGtaskId(String gtaskId) {
return (new Metadata(metadata).getTask()); return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(Criterion.and(
} else { Metadata.KEY.eq(getMetadataKey()),
return AbstractModel.NO_ID; GtasksMetadata.ID.eq(gtaskId))));
}
} finally {
metadata.close();
}
} }
// --- list iterating helpers // --- list iterating helpers
@ -96,7 +80,7 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
iterateThroughList(listId, iterator, 0, false); iterateThroughList(listId, iterator, 0, false);
} }
public void iterateThroughList(String listId, OrderedListIterator iterator, long startAtOrder, boolean reverse) { private void iterateThroughList(String listId, final OrderedListIterator iterator, long startAtOrder, boolean reverse) {
Field orderField = Functions.cast(GtasksMetadata.ORDER, "LONG"); Field orderField = Functions.cast(GtasksMetadata.ORDER, "LONG");
Order order = reverse ? Order.desc(orderField) : Order.asc(orderField); Order order = reverse ? Order.desc(orderField) : Order.asc(orderField);
Criterion startAtCriterion = reverse ? Functions.cast(GtasksMetadata.ORDER, "LONG").lt(startAtOrder) : Criterion startAtCriterion = reverse ? Functions.cast(GtasksMetadata.ORDER, "LONG").lt(startAtOrder) :
@ -107,20 +91,17 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
GtasksMetadata.LIST_ID.eq(listId), GtasksMetadata.LIST_ID.eq(listId),
startAtCriterion)). startAtCriterion)).
orderBy(order); orderBy(order);
TodorooCursor<Metadata> cursor = metadataDao.query(query);
try { metadataDao.query(query, new Callback<Metadata>() {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { @Override
long taskId = cursor.get(Metadata.TASK); public void apply(Metadata entry) {
long taskId = entry.getValue(Metadata.TASK);
Metadata metadata = getTaskMetadata(taskId); Metadata metadata = getTaskMetadata(taskId);
if(metadata == null) { if(metadata != null) {
continue; iterator.processTask(taskId, metadata);
} }
iterator.processTask(taskId, metadata);
} }
});
} finally {
cursor.close();
}
} }
/** /**

@ -7,7 +7,7 @@ package com.todoroo.astrid.utility;
import android.content.ContentValues; import android.content.ContentValues;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
@ -17,6 +17,7 @@ import com.todoroo.astrid.sync.SyncContainer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set;
abstract public class SyncMetadataService<TYPE extends SyncContainer> { abstract public class SyncMetadataService<TYPE extends SyncContainer> {
@ -56,17 +57,8 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
* @return null if no metadata found * @return null if no metadata found
*/ */
public Metadata getTaskMetadata(long taskId) { public Metadata getTaskMetadata(long taskId) {
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where( return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(
MetadataCriteria.byTaskAndwithKey(taskId, getMetadataKey()))); MetadataCriteria.byTaskAndwithKey(taskId, getMetadataKey())));
try {
if(cursor.getCount() == 0) {
return null;
}
cursor.moveToFirst();
return new Metadata(cursor);
} finally {
cursor.close();
}
} }
/** /**
@ -79,19 +71,16 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
* @param metadataKey metadata key * @param metadataKey metadata key
*/ */
private void synchronizeMetadata(long taskId, ArrayList<Metadata> metadata, String metadataKey) { private void synchronizeMetadata(long taskId, ArrayList<Metadata> metadata, String metadataKey) {
HashSet<ContentValues> newMetadataValues = new HashSet<>(); final Set<ContentValues> newMetadataValues = new HashSet<>();
for(Metadata metadatum : metadata) { for(Metadata metadatum : metadata) {
metadatum.setTask(taskId); metadatum.setTask(taskId);
metadatum.clearValue(Metadata.ID); metadatum.clearValue(Metadata.ID);
newMetadataValues.add(metadatum.getMergedValues()); newMetadataValues.add(metadatum.getMergedValues());
} }
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where( metadataDao.byTaskAndKey(taskId, metadataKey, new Callback<Metadata>() {
MetadataCriteria.byTaskAndwithKey(taskId, metadataKey))); @Override
try { public void apply(Metadata item) {
// try to find matches within our metadata list
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Metadata item = new Metadata(cursor);
long id = item.getId(); long id = item.getId();
// clear item id when matching with incoming values // clear item id when matching with incoming values
@ -99,15 +88,12 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
ContentValues itemMergedValues = item.getMergedValues(); ContentValues itemMergedValues = item.getMergedValues();
if(newMetadataValues.contains(itemMergedValues)) { if(newMetadataValues.contains(itemMergedValues)) {
newMetadataValues.remove(itemMergedValues); newMetadataValues.remove(itemMergedValues);
continue; } else {
// not matched. cut it
metadataDao.delete(id);
} }
// not matched. cut it
metadataDao.delete(id);
} }
} finally { });
cursor.close();
}
// everything that remains shall be written // everything that remains shall be written
for(ContentValues values : newMetadataValues) { for(ContentValues values : newMetadataValues) {

Loading…
Cancel
Save