From dde5df9806257bbb791a73dad7bc30a9122bbf04 Mon Sep 17 00:00:00 2001 From: Olivier Mourez Date: Sun, 12 Jul 2015 14:48:20 +0200 Subject: [PATCH 1/3] Robsutness on first if none available, and add query/count/delete by DBObject for mongo specific operators --- lib/play-mongo.jar | Bin 20676 -> 21062 bytes src/play/modules/mongo/MongoCursor.java | 19 ++++++++-- src/play/modules/mongo/MongoDB.java | 40 ++++++++++++++++++++-- src/play/modules/mongo/MongoEnhancer.java | 16 +++++++-- src/play/modules/mongo/MongoModel.java | 17 ++++++++- 5 files changed, 85 insertions(+), 7 deletions(-) diff --git a/lib/play-mongo.jar b/lib/play-mongo.jar index e90a2b1e2a8cccf3a33ff0f63eff34737a326c75..915ddda8f9c2377aa6648417ed14578769d7acdc 100644 GIT binary patch delta 14188 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 HA3y&eQ<4Kx delta 13717 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 W|8ZML{U0}c60<5YRK484vHll!g(?mJ diff --git a/src/play/modules/mongo/MongoCursor.java b/src/play/modules/mongo/MongoCursor.java index 1f699d5..c29595b 100644 --- a/src/play/modules/mongo/MongoCursor.java +++ b/src/play/modules/mongo/MongoCursor.java @@ -104,7 +104,11 @@ public List fetch(){ */ @SuppressWarnings("unchecked") public T first(){ - return (T)fetch(1,1).get(0); + List limitedList = fetch(1,1); + if (!limitedList.isEmpty()) { + return limitedList.get(0); + } + return null; } /** @@ -117,7 +121,18 @@ public MongoCursor from(int from){ cursor.skip(from); return this; } - + + /** + * Limit the given the number of records. + * + * @param limit - the maximum number of records + * @return - the cursor + */ + public MongoCursor limit(int limit){ + cursor.limit(limit); + return this; + } + /** * Orders the objects pointed to by the cursor, using the * orderBy string. diff --git a/src/play/modules/mongo/MongoDB.java b/src/play/modules/mongo/MongoDB.java index 3dac184..0efda1a 100644 --- a/src/play/modules/mongo/MongoDB.java +++ b/src/play/modules/mongo/MongoDB.java @@ -210,7 +210,18 @@ public static long count(String collectionName) { public static long count(String collectionName, String query, Object[] params) { return db().getCollection(collectionName).getCount(createQueryDbObject(query, params)); } - + + /** + * Counts the records in the collection matching the query object + * + * @param collectionName - the queried collection + * @param queryObject - the query object + * @return + */ + public static long count(String collectionName, DBObject queryObject) { + return db().getCollection(collectionName).getCount(queryObject); + } + /** * Provides a cursor to the objects in a collection, matching the query string. * @@ -237,6 +248,18 @@ public static MongoCursor find(String collectionName, Class clazz) { return new MongoCursor(db().getCollection(collectionName).find(), clazz); } + /** + * Provides a cursor to the objects in a collection, matching the query object + * + * @param collectionName - the target collection + * @param queryObject - the query object + * @param clazz - the type of MongoModel + * @return - a mongo cursor + */ + public static MongoCursor find(String collectionName, DBObject queryObject, Class clazz) { + return new MongoCursor(db().getCollection(collectionName).find(queryObject), clazz); + } + public static T findById(String collectionName, Class clazz, ObjectId id) { DBObject query = new BasicDBObject("_id", id); DBObject dbObject = db().getCollection(collectionName).findOne(query); @@ -302,7 +325,20 @@ public static long delete(String collectionName, String query, Object[] params) return deleteCount; } - + + /** + * Deletes models from a collection that match a specific query object + * + * @param collectionName - the collection + * @param queryObject - the query object + * @return - the number of models deleted + */ + public static long delete(String collectionName, DBObject queryObject) { + long deleteCount = db().getCollection(collectionName).getCount(queryObject); + db().getCollection(collectionName).remove(queryObject); + return deleteCount; + } + /** * Deletes all models from the collection. * diff --git a/src/play/modules/mongo/MongoEnhancer.java b/src/play/modules/mongo/MongoEnhancer.java index 50d684e..541d7a6 100644 --- a/src/play/modules/mongo/MongoEnhancer.java +++ b/src/play/modules/mongo/MongoEnhancer.java @@ -89,6 +89,10 @@ private void enhanceMongoEntity(CtClass ctClass, ApplicationClass applicationCla CtMethod count2 = CtMethod.make("public static long count(java.lang.String query, java.lang.Object[] params) { return MongoDB.count(getCollectionName(), query, params); }", ctClass); ctClass.addMethod(count2); + // count3 + CtMethod count3 = CtMethod.make("public static long count(com.mongodb.DBObject queryObject) { return MongoDB.count(getCollectionName(), queryObject); }", ctClass); + ctClass.addMethod(count3); + // find CtMethod find = CtMethod.make("public static MongoCursor find(String query, Object[] params){ return MongoDB.find(getCollectionName(),query,params,"+entityName+".class); }", ctClass); ctClass.addMethod(find); @@ -97,14 +101,22 @@ private void enhanceMongoEntity(CtClass ctClass, ApplicationClass applicationCla CtMethod find2 = CtMethod.make("public static MongoCursor find(){ return MongoDB.find(getCollectionName(),"+entityName+".class); }", ctClass); ctClass.addMethod(find2); + // find3 + CtMethod find3 = CtMethod.make("public static MongoCursor find(com.mongodb.DBObject queryObject){ return MongoDB.find(getCollectionName(),queryObject,"+entityName+".class); }", ctClass); + ctClass.addMethod(find3); + // delete CtMethod delete = CtMethod.make("public void delete() { MongoDB.delete(getCollectionName(), this); }", ctClass); ctClass.addMethod(delete); - // delete + // delete2 CtMethod delete2 = CtMethod.make("public static long delete(String query, Object[] params) { return MongoDB.delete(getCollectionName(), query, params); }", ctClass); ctClass.addMethod(delete2); - + + // delete3 + CtMethod delete3 = CtMethod.make("public static long delete(com.mongodb.DBObject queryObject) { return MongoDB.delete(getCollectionName(), queryObject); }", ctClass); + ctClass.addMethod(delete3); + // deleteAll CtMethod deleteAll = CtMethod.make("public static long deleteAll() { return MongoDB.deleteAll(getCollectionName()); }", ctClass); ctClass.addMethod(deleteAll); diff --git a/src/play/modules/mongo/MongoModel.java b/src/play/modules/mongo/MongoModel.java index b519c7f..d22ab41 100644 --- a/src/play/modules/mongo/MongoModel.java +++ b/src/play/modules/mongo/MongoModel.java @@ -1,6 +1,9 @@ package play.modules.mongo; import org.bson.types.ObjectId; + +import com.mongodb.DBObject; + import play.db.Model; import java.io.Serializable; @@ -33,10 +36,18 @@ public static long count(String query, Object... params) { throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); } - public static MongoCursor find(String query, Object... params) { + public static long count(DBObject queryObject) { throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); } + public static MongoCursor find(String query, Object... params) { + throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); + } + + public static MongoCursor find(DBObject queryObject) { + throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); + } + public static MongoCursor find() { throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); } @@ -53,6 +64,10 @@ public static long delete(String query, Object... params) { throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); } + public static long delete(DBObject queryObject) { + throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); + } + public static long deleteAll(){ throw new UnsupportedOperationException("Please annotate your model with @MongoEntity annotation."); } From d8efe4cd25b553e35eda6b1dfc286b888cdb3af1 Mon Sep 17 00:00:00 2001 From: Olivier Mourez Date: Fri, 17 Jul 2015 13:46:40 +0200 Subject: [PATCH 2/3] Readme update --- README.textile | 11 ++++++++++- documentation/manual/home.textile | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.textile b/README.textile index c072b44..d43d53e 100644 --- a/README.textile +++ b/README.textile @@ -30,6 +30,8 @@ public class Car extends MongoModel { public String name; public String colour; public int topSpeed; + public Date firstProductionDate; + public boolean underProduction; } @@ -75,7 +77,14 @@ bc.. List toyotas = Car.find("byName", "Toyota").fetch(); List whiteToyotas = Car.find("byNameAndColour", "Toyota", "white").fetch(); -p. Currently the Mongo module only supports the 'And' query operator. +p. A more complete query engine enable SQL Like query, with support followings operators + +bc.. =, !=, >, >=, <, <=, LIKE, NOT LIKE, IN, NOT IN, IS NULL, IS NOT NULL, AND, OR + +p. To use Boolean and Date criteria, values must be passed in parameters with JPAStyle numbering syntax (?1, ?2 ...) +p. To use mixed logical expression with both AND and OR operators, brackets must be used to avoid priority management / misunderstanding + +bc.. Car.find("name = 'Toyota' and firstProductionDate > ?1 and (colour in ('red', 'blue', 'green') or colour like '%pink%' or speed > 130) and underProduction = ?2", new Date(56), true) h3. Ordering diff --git a/documentation/manual/home.textile b/documentation/manual/home.textile index dea5324..d43d53e 100644 --- a/documentation/manual/home.textile +++ b/documentation/manual/home.textile @@ -31,7 +31,7 @@ public class Car extends MongoModel { public String colour; public int topSpeed; public Date firstProductionDate; - public boolean underProduction; + public boolean underProduction; } From 642048cb1ef2a568a5a705f9610c57031e114570 Mon Sep 17 00:00:00 2001 From: Olivier Mourez Date: Tue, 21 Jul 2015 17:49:12 +0200 Subject: [PATCH 3/3] Reprise authentification avec nouveau driver et server --- lib/play-mongo.jar | Bin 21062 -> 20856 bytes src/play/modules/mongo/MongoDB.java | 75 +++++++--------------------- 2 files changed, 17 insertions(+), 58 deletions(-) diff --git a/lib/play-mongo.jar b/lib/play-mongo.jar index 915ddda8f9c2377aa6648417ed14578769d7acdc..80c1bebf77a956944626d41026d6d7b4a2835e6f 100644 GIT binary patch delta 8880 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 Q7>V2(I7k-C|1ItR002P}6aWAK delta 9096 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 lCred = new ArrayList(); + if (username != null && password != null) { + lCred.add(MongoCredential.createCredential(username, dbname, password.toCharArray())); + } + mongo = new MongoClient(lSA, lCred); db = mongo.getDB(dbname); } catch (UnknownHostException e) { e.printStackTrace(); @@ -88,11 +97,6 @@ public static void init() { } } - public static void init(String username, String password){ - init(); - db.authenticate(username, password.toCharArray()); - } - /** * Creates an index. * @@ -144,51 +148,6 @@ public static String[] getIndexes(String collectionName) { return indexNames.toArray(new String[indexNames.size()]); } - /** - * Adds a user to the database. We must manually set the readOnly parameter - * because the java mongo API does not yet support it. It will only work - * with database versions > 1.3. - * - * @param username - * @param passwd - * @param readOnly - */ - public static void addUser(String username, String passwd, boolean readOnly) { - db().addUser(username, passwd.toCharArray()); - DBCollection c = db().getCollection("system.users"); - - DBObject userObj = c.findOne(new BasicDBObject("user", username)); - if (userObj != null) { - userObj.put("readOnly", readOnly); - c.save(userObj); - } - } - - /** - * Removes a user from the database. - * - * @param username - */ - public static void removeUser(String username) { - DBCollection c = db().getCollection("system.users"); - - DBObject userObj = c.findOne(new BasicDBObject("user", username)); - if (userObj != null) { - c.remove(userObj); - } - } - - /** - * Authenticates a user against a database. - * - * @param username - * @param password - */ - public static boolean authenticate(String username, String password) { - return db().authenticate(username, password.toCharArray()); - } - - /** * Counts the records in the collection. *