Repository: metamodel Updated Branches: refs/heads/master 4895b801c -> c156054d6
METAMODEL-211: Fixed Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/c156054d Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/c156054d Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/c156054d Branch: refs/heads/master Commit: c156054d62dcd02dfa567e73682aee7cdf276e52 Parents: 4895b80 Author: Mykhailo Kozik <mishad...@gmail.com> Authored: Fri Nov 27 08:18:31 2015 +0100 Committer: Kasper Sørensen <i.am.kasper.soren...@gmail.com> Committed: Fri Nov 27 08:18:31 2015 +0100 ---------------------------------------------------------------------- CHANGES.md | 1 + .../metamodel/mongodb/MongoDbDataContext.java | 6 +- .../mongodb/MongoDbDataContextTest.java | 87 ++++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/c156054d/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 9a8047e..bdf3696 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ### Apache MetaModel (work-in-progress) * [METAMODEL-207] - Ensured the serializability of the SingleLineCsvRow class. + * [METAMODEL-211] - Fixed a bug related to lookup by primary key (_id) on MongoDB. ### Apache MetaModel 4.4.1 http://git-wip-us.apache.org/repos/asf/metamodel/blob/c156054d/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java ---------------------------------------------------------------------- diff --git a/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java b/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java index 73adea4..26db6d4 100644 --- a/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java +++ b/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java @@ -386,9 +386,13 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U final Column column = item.getSelectItem().getColumn(); final String columnName = column.getName(); - final Object operand = item.getOperand(); final String operatorName = getOperatorName(item); + Object operand = item.getOperand(); + if (ObjectId.isValid(String.valueOf(operand))) { + operand = new ObjectId(String.valueOf(operand)); + } + final BasicDBObject existingFilterObject = (BasicDBObject) query.get(columnName); if (existingFilterObject == null) { if (operatorName == null) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/c156054d/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java ---------------------------------------------------------------------- diff --git a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java index da89bb1..c495754 100644 --- a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java +++ b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import com.mongodb.WriteConcern; import org.apache.metamodel.DataContext; import org.apache.metamodel.UpdateCallback; import org.apache.metamodel.UpdateScript; @@ -104,6 +105,92 @@ public class MongoDbDataContextTest extends MongoDbTestCase { } } + public void testQueriesWithAutoGeneratedID() throws Exception { + if (!isConfigured()) { + System.err.println(getInvalidConfigurationMessage()); + return; + } + + DBCollection col = db.createCollection(getCollectionName(), new BasicDBObject()); + + // delete if already exists + { + col.drop(); + col = db.createCollection(getCollectionName(), new BasicDBObject()); + } + + // create a couple of entries + + BasicDBObject dbRow1 = new BasicDBObject(); + dbRow1.put("name", "Mr. Black"); + dbRow1.put("category", "gen_id"); + dbRow1.put("age", 20); + col.insert(dbRow1, WriteConcern.ACKNOWLEDGED); + final String autoGenID1 = dbRow1.get("_id").toString(); + + BasicDBObject dbRow2 = new BasicDBObject(); + dbRow2.put("name", "Mr. Pink"); + dbRow2.put("category", "gen_id"); + dbRow2.put("age", 40); + col.insert(dbRow2, WriteConcern.ACKNOWLEDGED); + String autoGenID2 = dbRow2.get("_id").toString(); + + BasicDBObject dbRow3 = new BasicDBObject(); + dbRow3.put("_id", "123"); + dbRow3.put("name", "Mr. White"); + dbRow3.put("category", "gen_id"); + dbRow3.put("age", 30); + col.insert(dbRow3, WriteConcern.ACKNOWLEDGED); + String fixedID3 = dbRow3.get("_id").toString(); + + final MongoDbDataContext dc = new MongoDbDataContext(db); + DataSet ds; + + // check all 3 entries inserted + ds = dc.query().from(getCollectionName()).selectAll() + .where("category").eq("gen_id").execute(); + assertEquals(3, ds.toRows().size()); + ds.close(); + + // select by autogenerated id + ds = dc.query().from(getCollectionName()).select("name").where("_id").eq(autoGenID1).execute(); + assertTrue(ds.next()); + assertEquals("Mr. Black", ds.getRow().getValue(0)); + ds.close(); + + // select by multiple autogenerated ids + ds = dc.query().from(getCollectionName()).select("name") + .where("_id").eq(autoGenID1) + .or("_id").eq(autoGenID2) + .execute(); + assertEquals(2, ds.toRows().size()); + ds.close(); + + // select by both autogenerated id and fixed id + ds = dc.query().from(getCollectionName()).select("name") + .where("_id").eq(autoGenID1) + .or("_id").eq(fixedID3) + .execute(); + assertEquals(2, ds.toRows().size()); + ds.close(); + + // delete by id + dc.executeUpdate(new UpdateScript() { + @Override + public void run(UpdateCallback callback) { + callback.deleteFrom(getCollectionName()) + .where("_id").eq(autoGenID1) + .execute(); + } + }); + + // select by autogenerated id which was deleted + ds = dc.query().from(getCollectionName()).select("name").where("_id").eq(autoGenID1).execute(); + assertEquals(0, ds.toRows().size()); + ds.close(); + + } + public void testFirstRowAndMaxRows() throws Exception { if (!isConfigured()) { System.err.println(getInvalidConfigurationMessage());