From 5d737b832c86fba9cb0df131c92789eebc629628 Mon Sep 17 00:00:00 2001 From: Mykhailo Kozik Date: Thu, 26 Nov 2015 12:52:44 +0200 Subject: [PATCH] METAMODEL-211 Mongo autogenerated _id handled properly in where clause --- .../metamodel/mongodb/MongoDbDataContext.java | 6 +- .../mongodb/MongoDbDataContextTest.java | 87 +++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) 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 73adea4b8..26db6d48b 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 @@ private void convertToCursorObject(BasicDBObject query, FilterItem item) { 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) { 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 da89bb1c3..c49575460 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.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 void testNestedObjectFetching() throws Exception { } } + 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());