diff --git a/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOCursor.java b/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOCursor.java new file mode 100644 index 0000000000000000000000000000000000000000..7e8f4bdeb4c942390619ed8ee7b3768121dcee0d --- /dev/null +++ b/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOCursor.java @@ -0,0 +1,42 @@ +package lc.esp.eo; + +import com.mongodb.client.MongoCursor; +import lc.esp.eo.sdk.EOAssociation; +import lc.esp.eo.sdk.EOId; +import org.bson.Document; + +import java.time.Instant; +import java.util.Iterator; + +public class EOCursor implements Iterable, AutoCloseable { + private final MongoCursor cursor; + + public EOCursor(MongoCursor cursor) { + this.cursor = cursor; + } + + @Override + public void close() { + cursor.close(); + } + + @Override + public Iterator iterator() { + return new Iterator<>() { + @Override + public boolean hasNext() { + return cursor.hasNext(); + } + + @Override + public EOAssociation next() { + Document doc = cursor.next(); + EOId srcId = new EOBsonId(doc.getObjectId(EOTransaction.KEY_SRCOBJ)); + EOId dstId = new EOBsonId(doc.getObjectId(EOTransaction.KEY_DSTOBJ)); + + return new EOAssociation(srcId, dstId, doc.getString(EOTransaction.KEY_TYPE), + Instant.ofEpochSecond(doc.getLong(EOTransaction.KEY_CTIME))); + } + }; + } +} diff --git a/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java b/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java index 53d94c6c892a8308c263df2c8d1cfbef8b75053c..71fd2ae0da266ff859a80f100d54f396628402e4 100644 --- a/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java +++ b/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java @@ -7,7 +7,6 @@ import com.mongodb.client.gridfs.GridFSBuckets; import com.mongodb.client.gridfs.model.GridFSUploadOptions; import com.mongodb.client.result.DeleteResult; import lc.esp.eo.sdk.EO; -import lc.esp.eo.sdk.EOAssociation; import lc.esp.eo.sdk.EOId; import lc.esp.eo.sdk.schema.AssociationSchema; import lc.esp.eo.sdk.schema.Model; @@ -22,7 +21,6 @@ import java.io.OutputStream; import java.io.Serializable; import java.time.Instant; import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.Objects; @@ -39,29 +37,27 @@ public class EOTransaction implements AutoCloseable { private final MongoClient client; private final String databaseName; private final MongoDatabase db; - private final static String KEY_ID = "_id"; - private final static String KEY_DATA = "data"; - private final static String KEY_TYPE = "type"; - private final static String KEY_DSTOBJ = "dstObj"; - private final static String KEY_SRCOBJ = "srcObj"; - private final static String KEY_CONTENT_TYPE = "content_type"; - private final static String COLLECTION_OBJ = "eo_obj"; - private final static String COLLECTION_ASSOC = "eo_assoc"; - private final static String COLLECTION_CHUNKS = "chunks"; - private final static String COLLECTION_FILES = "files"; - private final static String KEY_FS_FILENAME = "name"; + public final static String KEY_ID = "_id"; + public final static String KEY_DATA = "data"; + public final static String KEY_TYPE = "type"; + public final static String KEY_DSTOBJ = "dstObj"; + public final static String KEY_SRCOBJ = "srcObj"; + public final static String KEY_CONTENT_TYPE = "content_type"; + public final static String COLLECTION_OBJ = "eo_obj"; + public final static String COLLECTION_ASSOC = "eo_assoc"; + public final static String COLLECTION_CHUNKS = "chunks"; + public final static String COLLECTION_FILES = "files"; + public final static String KEY_FS_FILENAME = "name"; private final static String TYPE_FS_LINK = "link"; - private final static String KEY_CTIME = "ctime"; + public final static String KEY_CTIME = "ctime"; - private final static String TYPE_INODE = "inode"; + public final static String TYPE_INODE = "inode"; public static String KEY_FS_LINK = "link"; public static String KEY_FS_PARENT = ".."; public static String KEY_FS_SELF = "."; public static String KEY_FS_SEPARATOR = "/"; - private HashSet pendingFiles; - private final Model model; /** @@ -249,38 +245,20 @@ public class EOTransaction implements AutoCloseable { } /** - * Return all the associations of the given type for the given object. + * Return all the associations of the given type for the given object. The iterable that is returned is tied + * to the transaction; rolling back or comitting the transaction and then consuming from the iterator will yield + * undefined results. */ - public Iterable assocGet(EOId id, String type) { + public EOCursor assocGet(EOId id, String type) { MongoCollection col = db.getCollection(COLLECTION_ASSOC); BasicDBObject query = new BasicDBObject(); query.put(KEY_SRCOBJ, ((EOBsonId) id).getObjectId()); query.put(KEY_TYPE, type); FindIterable result = col.find(session, query); - MongoCursor it = result.iterator(); - return new Iterable<>() { - @Override - public Iterator iterator() { - return new Iterator<>() { - @Override - public boolean hasNext() { - return it.hasNext(); - } - - @Override - public EOAssociation next() { - Document doc = it.next(); - EOId srcId = new EOBsonId(doc.getObjectId(KEY_SRCOBJ)); - EOId dstId = new EOBsonId(doc.getObjectId(KEY_DSTOBJ)); - - return new EOAssociation(srcId, dstId, doc.getString(KEY_TYPE), - Instant.ofEpochSecond(doc.getLong(KEY_CTIME))); - } - }; - } - }; + MongoCursor it = result.iterator(); + return new EOCursor(it); } /** diff --git a/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/ScenarioTest.java b/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/ScenarioTest.java index b84e0a586a830a7c4e37e0b315c3d33f2e2955b2..84d86aff163b2782e47fbac6c6d2e13545ce0ac2 100644 --- a/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/ScenarioTest.java +++ b/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/ScenarioTest.java @@ -74,8 +74,10 @@ public class ScenarioTest { logger.info("Person is liked: {}", cnt); assertEquals(followers - 1, cnt); - for (EOAssociation assoc : txn.assocGet(popularPerson, "liked_by")) { - logger.info("Got association: {}", assoc); + try (EOCursor it = txn.assocGet(popularPerson, "liked_by")) { + for (EOAssociation assoc : it) { + logger.info("Got association: {}", assoc); + } } } finally { txn.drop();