From 4f32ee140313aa980facfbbd6aae35eb70da3fd2 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Wed, 9 Feb 2011 15:40:53 -0500 Subject: [PATCH] refactored the Query/Update "DSL" again --- .../document/mongodb/MongoOperations.java | 40 +++++------ .../data/document/mongodb/MongoTemplate.java | 28 ++++---- .../document/mongodb/query/BasicQuery.java | 10 ++- .../document/mongodb/query/BasicUpdate.java | 70 ++++++++++++++++++- .../data/document/mongodb/query/Criteria.java | 28 ++++---- .../mongodb/query/CriteriaDefinition.java | 2 +- .../document/mongodb/query/OrCriteria.java | 10 +-- .../data/document/mongodb/query/Query.java | 24 +++---- .../mongodb/query/QueryDefinition.java | 32 --------- .../data/document/mongodb/query/Update.java | 10 +-- .../mongodb/query/UpdateDefinition.java | 24 ------- .../mongodb/repository/MongoQueryCreator.java | 12 ++-- .../repository/SimpleMongoRepository.java | 11 ++- .../document/mongodb/MongoTemplateTests.java | 11 +-- .../{builder => query}/QueryTests.java | 30 ++++---- .../mongodb/{builder => query}/SortTests.java | 2 +- .../{builder => query}/UpdateTests.java | 17 ++++- 17 files changed, 194 insertions(+), 167 deletions(-) delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryDefinition.java delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/UpdateDefinition.java rename spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/{builder => query}/QueryTests.java (73%) rename spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/{builder => query}/SortTests.java (92%) rename spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/{builder => query}/UpdateTests.java (87%) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoOperations.java index 5bad7241f..f753e7bd0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoOperations.java @@ -18,8 +18,8 @@ package org.springframework.data.document.mongodb; import java.util.List; import java.util.Set; -import org.springframework.data.document.mongodb.query.QueryDefinition; -import org.springframework.data.document.mongodb.query.UpdateDefinition; +import org.springframework.data.document.mongodb.query.Query; +import org.springframework.data.document.mongodb.query.Update; import com.mongodb.CommandResult; import com.mongodb.DBCollection; @@ -212,14 +212,14 @@ public interface MongoOperations { * {@see MongoConverter}. Unless configured otherwise, an * instance of SimpleMongoConverter will be used. * - * The query is specified as a {@link QueryDefinition} which can be created either using the {@link BasicQuery} or the more + * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * feature rich {@link Query}. * * @param query the query class that specifies the criteria used to find a record and also an optional fields specification * @param targetClass the parameterized type of the returned list. * @return the List of converted objects */ - List find(QueryDefinition query, Class targetClass); + List find(Query query, Class targetClass); /** * Map the results of an ad-hoc query on the default MongoDB collection to a List of the specified type. @@ -228,7 +228,7 @@ public interface MongoOperations { * {@see MongoConverter}. Unless configured otherwise, an * instance of SimpleMongoConverter will be used. * - * The query is specified as a {@link QueryDefinition} which can be created either using the {@link BasicQuery} or the more + * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * feature rich {@link Query}. * * @param query the query class that specifies the criteria used to find a record and also an optional fields specification @@ -236,7 +236,7 @@ public interface MongoOperations { * @param reader the MongoReader to convert from DBObject to an object. * @return the List of converted objects */ - List find(QueryDefinition query, Class targetClass, + List find(Query query, Class targetClass, MongoReader reader); /** @@ -246,7 +246,7 @@ public interface MongoOperations { * {@see MongoConverter}. Unless configured otherwise, an * instance of SimpleMongoConverter will be used. * - * The query is specified as a {@link QueryDefinition} which can be created either using the {@link BasicQuery} or the more + * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * feature rich {@link Query}. * * @param collectionName name of the collection to retrieve the objects from @@ -254,7 +254,7 @@ public interface MongoOperations { * @param targetClass the parameterized type of the returned list. * @return the List of converted objects */ - List find(String collectionName, QueryDefinition query, + List find(String collectionName, Query query, Class targetClass); /** @@ -264,7 +264,7 @@ public interface MongoOperations { * {@see MongoConverter}. Unless configured otherwise, an * instance of SimpleMongoConverter will be used. * - * The query is specified as a {@link QueryDefinition} which can be created either using the {@link BasicQuery} or the more + * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * feature rich {@link Query}. * * @param collectionName name of the collection to retrieve the objects from @@ -273,7 +273,7 @@ public interface MongoOperations { * @param reader the MongoReader to convert from DBObject to an object. * @return the List of converted objects */ - List find(String collectionName, QueryDefinition query, + List find(String collectionName, Query query, Class targetClass, MongoReader reader); @@ -284,7 +284,7 @@ public interface MongoOperations { * {@see MongoConverter}. Unless configured otherwise, an * instance of SimpleMongoConverter will be used. * - * The query is specified as a {@link QueryDefinition} which can be created either using the {@link BasicQuery} or the more + * The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more * feature rich {@link Query}. * * @param collectionName name of the collection to retrieve the objects from @@ -294,7 +294,7 @@ public interface MongoOperations { * (apply limits, skips and so on). * @return the List of converted objects. */ - List find(String collectionName, QueryDefinition query, Class targetClass, CursorPreparer preparer); + List find(String collectionName, Query query, Class targetClass, CursorPreparer preparer); /** * Insert the object into the default collection. @@ -434,7 +434,7 @@ public interface MongoOperations { * @param updateDoc the update document that contains the updated object or $ operators to manipulate the * existing object. */ - WriteResult updateFirst(QueryDefinition query, UpdateDefinition update); + WriteResult updateFirst(Query query, Update update); /** * Updates the first object that is found in the specified collection that matches the query document criteria @@ -445,8 +445,8 @@ public interface MongoOperations { * @param updateDoc the update document that contains the updated object or $ operators to manipulate the * existing object. */ - WriteResult updateFirst(String collectionName, QueryDefinition query, - UpdateDefinition update); + WriteResult updateFirst(String collectionName, Query query, + Update update); /** * Updates all objects that are found in the default collection that matches the query document criteria @@ -456,7 +456,7 @@ public interface MongoOperations { * @param updateDoc the update document that contains the updated object or $ operators to manipulate the * existing object. */ - WriteResult updateMulti(QueryDefinition query, UpdateDefinition update); + WriteResult updateMulti(Query query, Update update); /** * Updates all objects that are found in the specified collection that matches the query document criteria @@ -467,20 +467,20 @@ public interface MongoOperations { * @param updateDoc the update document that contains the updated object or $ operators to manipulate the * existing object. */ - WriteResult updateMulti(String collectionName, QueryDefinition query, - UpdateDefinition update); + WriteResult updateMulti(String collectionName, Query query, + Update update); /** * Remove all documents from the default collection that match the provide query document criteria. * @param queryDoc the query document that specifies the criteria used to remove a record */ - void remove(QueryDefinition query); + void remove(Query query); /** * Remove all documents from the specified collection that match the provide query document criteria. * @param collectionName name of the collection where the objects will removed * @param queryDoc the query document that specifies the criteria used to remove a record */ - void remove(String collectionName, QueryDefinition query); + void remove(String collectionName, Query query); } \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java index 596b1922c..6d703d02a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java @@ -30,8 +30,8 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.document.mongodb.MongoPropertyDescriptors.MongoPropertyDescriptor; -import org.springframework.data.document.mongodb.query.QueryDefinition; -import org.springframework.data.document.mongodb.query.UpdateDefinition; +import org.springframework.data.document.mongodb.query.Query; +import org.springframework.data.document.mongodb.query.Update; import org.springframework.jca.cci.core.ConnectionCallback; import org.springframework.util.Assert; @@ -407,17 +407,17 @@ public class MongoTemplate implements InitializingBean, MongoOperations { } - // Find methods that take a QueryDefinition to express the query. + // Find methods that take a Query to express the query. - public List find(QueryDefinition query, Class targetClass) { + public List find(Query query, Class targetClass) { return find(getDefaultCollectionName(), query, targetClass); // } - public List find(QueryDefinition query, Class targetClass, MongoReader reader) { + public List find(Query query, Class targetClass, MongoReader reader) { return find(getDefaultCollectionName(), query, targetClass, reader); } - public List find(String collectionName, final QueryDefinition query, Class targetClass) { + public List find(String collectionName, final Query query, Class targetClass) { CursorPreparer cursorPreparer = null; if (query.getSkip() > 0 || query.getLimit() > 0 || query.getSortObject() != null) { cursorPreparer = new CursorPreparer() { @@ -444,11 +444,11 @@ public class MongoTemplate implements InitializingBean, MongoOperations { return doFind(collectionName, query.getQueryObject(), query.getFieldsObject(), targetClass, cursorPreparer); } - public List find(String collectionName, QueryDefinition query, Class targetClass, MongoReader reader) { + public List find(String collectionName, Query query, Class targetClass, MongoReader reader) { return doFind(collectionName, query.getQueryObject(), query.getFieldsObject(), targetClass, reader); } - public List find(String collectionName, QueryDefinition query, + public List find(String collectionName, Query query, Class targetClass, CursorPreparer preparer) { return doFind(collectionName, query.getQueryObject(), query.getFieldsObject(), targetClass, preparer); } @@ -613,14 +613,14 @@ public class MongoTemplate implements InitializingBean, MongoOperations { /* (non-Javadoc) * @see org.springframework.data.document.mongodb.MongoOperations#updateFirst(com.mongodb.DBObject, com.mongodb.DBObject) */ - public WriteResult updateFirst(QueryDefinition query, UpdateDefinition update) { + public WriteResult updateFirst(Query query, Update update) { return updateFirst(getRequiredDefaultCollectionName(), query, update); } /* (non-Javadoc) * @see org.springframework.data.document.mongodb.MongoOperations#updateFirst(java.lang.String, com.mongodb.DBObject, com.mongodb.DBObject) */ - public WriteResult updateFirst(String collectionName, final QueryDefinition query, final UpdateDefinition update) { + public WriteResult updateFirst(String collectionName, final Query query, final Update update) { return execute(new CollectionCallback() { public WriteResult doInCollection(DBCollection collection) throws MongoException, DataAccessException { WriteResult wr; @@ -639,14 +639,14 @@ public class MongoTemplate implements InitializingBean, MongoOperations { /* (non-Javadoc) * @see org.springframework.data.document.mongodb.MongoOperations#updateMulti(com.mongodb.DBObject, com.mongodb.DBObject) */ - public WriteResult updateMulti(QueryDefinition query, UpdateDefinition update) { + public WriteResult updateMulti(Query query, Update update) { return updateMulti(getRequiredDefaultCollectionName(), query, update); } /* (non-Javadoc) * @see org.springframework.data.document.mongodb.MongoOperations#updateMulti(java.lang.String, com.mongodb.DBObject, com.mongodb.DBObject) */ - public WriteResult updateMulti(String collectionName, final QueryDefinition query, final UpdateDefinition update) { + public WriteResult updateMulti(String collectionName, final Query query, final Update update) { return execute(new CollectionCallback() { public WriteResult doInCollection(DBCollection collection) throws MongoException, DataAccessException { WriteResult wr = null; @@ -665,14 +665,14 @@ public class MongoTemplate implements InitializingBean, MongoOperations { /* (non-Javadoc) * @see org.springframework.data.document.mongodb.MongoOperations#remove(com.mongodb.DBObject) */ - public void remove(QueryDefinition query) { + public void remove(Query query) { remove(getRequiredDefaultCollectionName(), query); } /* (non-Javadoc) * @see org.springframework.data.document.mongodb.MongoOperations#remove(java.lang.String, com.mongodb.DBObject) */ - public void remove(String collectionName, final QueryDefinition query) { + public void remove(String collectionName, final Query query) { execute(new CollectionCallback() { public Void doInCollection(DBCollection collection) throws MongoException, DataAccessException { WriteResult wr = null; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicQuery.java index 5503b0775..29656d072 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicQuery.java @@ -18,7 +18,7 @@ package org.springframework.data.document.mongodb.query; import com.mongodb.DBObject; import com.mongodb.util.JSON; -public class BasicQuery implements QueryDefinition { +public class BasicQuery extends Query { private DBObject queryObject = null; @@ -50,8 +50,14 @@ public class BasicQuery implements QueryDefinition { this.fieldsObject = fieldsObject; } + @Override + public Query and(Criteria criteria) { + this.queryObject.putAll(criteria.getCriteriaObject()); + return this; + } + public DBObject getQueryObject() { - return queryObject; + return this.queryObject; } public DBObject getFieldsObject() { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicUpdate.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicUpdate.java index d4839eadd..9155ab5bf 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicUpdate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/BasicUpdate.java @@ -15,10 +15,13 @@ */ package org.springframework.data.document.mongodb.query; +import java.util.Collections; + +import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.util.JSON; -public class BasicUpdate implements UpdateDefinition { +public class BasicUpdate extends Update { private DBObject updateObject = null; @@ -32,6 +35,71 @@ public class BasicUpdate implements UpdateDefinition { this.updateObject = updateObject; } + @Override + public Update set(String key, Object value) { + updateObject.put("$set", Collections.singletonMap(key, value)); + return this; + } + + @Override + public Update unset(String key) { + updateObject.put("$unset", Collections.singletonMap(key, 1)); + return this; + } + + @Override + public Update inc(String key, long inc) { + updateObject.put("$inc", Collections.singletonMap(key, inc)); + return this; + } + + @Override + public Update push(String key, Object value) { + updateObject.put("$push", Collections.singletonMap(key, value)); + return this; + } + + @Override + public Update pushAll(String key, Object[] values) { + DBObject keyValue = new BasicDBObject(); + keyValue.put(key, values); + updateObject.put("$pushAll", keyValue); + return this; + } + + @Override + public Update addToSet(String key, Object value) { + updateObject.put("$addToSet", Collections.singletonMap(key, value)); + return this; + } + + @Override + public Update pop(String key, Position pos) { + updateObject.put("$pop", Collections.singletonMap(key, (pos == Position.FIRST ? -1 : 1))); + return this; + } + + @Override + public Update pull(String key, Object value) { + updateObject.put("$pull", Collections.singletonMap(key, value)); + return this; + } + + @Override + public Update pullAll(String key, Object[] values) { + DBObject keyValue = new BasicDBObject(); + keyValue.put(key, values); + updateObject.put("$pullAll", keyValue); + return this; + } + + @Override + public Update rename(String oldName, String newName) { + updateObject.put("$rename", Collections.singletonMap(oldName, newName)); + return this; + } + + @Override public DBObject getUpdateObject() { return updateObject; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java index 9e91d4631..4a9bf5e25 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java @@ -26,24 +26,22 @@ import com.mongodb.DBObject; public class Criteria implements CriteriaDefinition { - private Query qb = null; + private String key; private LinkedHashMap criteria = new LinkedHashMap(); private Object isValue = null; - public Criteria(Query qb) { - super(); - this.qb = qb; + public Criteria(String key) { + this.key = key; } - public Criteria and(String key) { - return qb.start(key); + public static Criteria where(String key) { + return new Criteria(key); } - public Criteria is(Object o) { if (isValue != null) { throw new InvalidDocumentStoreApiUsageException("Multiple 'is' values declared."); @@ -121,20 +119,20 @@ public class Criteria implements CriteriaDefinition { criteria.put("$or", queries); } - public Query end() { - return qb; + public String getKey() { + return this.key; } /* (non-Javadoc) * @see org.springframework.datastore.document.mongodb.query.Criteria#getCriteriaObject(java.lang.String) */ - public DBObject getCriteriaObject(String key) { + public DBObject getCriteriaObject() { DBObject dbo = new BasicDBObject(); boolean not = false; - for (String k : criteria.keySet()) { + for (String k : this.criteria.keySet()) { if (not) { DBObject notDbo = new BasicDBObject(); - notDbo.put(k, criteria.get(k)); + notDbo.put(k, this.criteria.get(k)); dbo.put("$not", notDbo); not = false; } @@ -143,17 +141,17 @@ public class Criteria implements CriteriaDefinition { not = true; } else { - dbo.put(k, criteria.get(k)); + dbo.put(k, this.criteria.get(k)); } } } DBObject queryCriteria = new BasicDBObject(); if (isValue != null) { - queryCriteria.put(key, isValue); + queryCriteria.put(this.key, this.isValue); queryCriteria.putAll(dbo); } else { - queryCriteria.put(key, dbo); + queryCriteria.put(this.key, dbo); } return queryCriteria; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/CriteriaDefinition.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/CriteriaDefinition.java index 1479ae8cc..c99748964 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/CriteriaDefinition.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/CriteriaDefinition.java @@ -19,6 +19,6 @@ import com.mongodb.DBObject; public interface CriteriaDefinition { - DBObject getCriteriaObject(String key); + DBObject getCriteriaObject(); } \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/OrCriteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/OrCriteria.java index 35e3739a6..dc1565217 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/OrCriteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/OrCriteria.java @@ -22,9 +22,9 @@ import com.mongodb.DBObject; public class OrCriteria implements CriteriaDefinition { - QueryDefinition[] queries = null; + Query[] queries = null; - public OrCriteria(QueryDefinition[] queries) { + public OrCriteria(Query[] queries) { super(); this.queries = queries; } @@ -33,13 +33,13 @@ public class OrCriteria implements CriteriaDefinition { /* (non-Javadoc) * @see org.springframework.datastore.document.mongodb.query.Criteria#getCriteriaObject(java.lang.String) */ - public DBObject getCriteriaObject(String key) { + public DBObject getCriteriaObject() { DBObject dbo = new BasicDBObject(); BasicBSONList l = new BasicBSONList(); - for (QueryDefinition q : queries) { + for (Query q : queries) { l.add(q.getQueryObject()); } - dbo.put(key, l); + dbo.put("$or", l); return dbo; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java index 647a7cef3..3bf36ec7a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java @@ -20,7 +20,7 @@ import java.util.LinkedHashMap; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; -public class Query implements QueryDefinition { +public class Query { private LinkedHashMap criteria = new LinkedHashMap(); @@ -32,17 +32,19 @@ public class Query implements QueryDefinition { private int limit; - public static Criteria startQueryWithCriteria(String key) { - return new Query().start(key); + public Query() { + } + + public Query(Criteria criteria) { + and(criteria); } - public Criteria start(String key) { - Criteria c = new Criteria(this); - this.criteria.put(key, c); - return c; + public Query and(Criteria criteria) { + this.criteria.put(criteria.getKey(), criteria); + return this; } - public Query or(QueryDefinition... queries) { + protected Query or(Query... queries) { this.criteria.put("$or", new OrCriteria(queries)); return this; } @@ -75,15 +77,11 @@ public class Query implements QueryDefinition { return this.sort; } -// public QueryDefinition build() { -// return this; -// } - public DBObject getQueryObject() { DBObject dbo = new BasicDBObject(); for (String k : criteria.keySet()) { CriteriaDefinition c = criteria.get(k); - DBObject cl = c.getCriteriaObject(k); + DBObject cl = c.getCriteriaObject(); dbo.putAll(cl); } return dbo; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryDefinition.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryDefinition.java deleted file mode 100644 index 940731fc9..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryDefinition.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010-2011 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.document.mongodb.query; - -import com.mongodb.DBObject; - - -public interface QueryDefinition { - - DBObject getQueryObject(); - - DBObject getFieldsObject(); - - DBObject getSortObject(); - - int getSkip(); - - int getLimit(); -} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Update.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Update.java index 439e2f686..a43d9cbac 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Update.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Update.java @@ -22,7 +22,7 @@ import java.util.LinkedHashMap; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; -public class Update implements UpdateDefinition { +public class Update { public enum Position { LAST, FIRST @@ -30,10 +30,6 @@ public class Update implements UpdateDefinition { private HashMap criteria = new LinkedHashMap(); - public static Update startUpdate() { - return new Update(); - } - public Update set(String key, Object value) { criteria.put("$set", Collections.singletonMap(key, value)); return this; @@ -88,10 +84,6 @@ public class Update implements UpdateDefinition { return this; } -// public UpdateDefinition build() { -// return this; -// } - public DBObject getUpdateObject() { DBObject dbo = new BasicDBObject(); for (String k : criteria.keySet()) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/UpdateDefinition.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/UpdateDefinition.java deleted file mode 100644 index 118a037b8..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/UpdateDefinition.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2010-2011 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.document.mongodb.query; - -import com.mongodb.DBObject; - - -public interface UpdateDefinition { - - DBObject getUpdateObject(); -} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java index 8c10eb56b..bf89a8b71 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java @@ -15,7 +15,9 @@ */ package org.springframework.data.document.mongodb.repository; -import java.util.Arrays; +import static org.springframework.data.document.mongodb.query.Criteria.where; + +import java.util.Collections; import java.util.regex.Pattern; import org.apache.commons.logging.Log; @@ -75,7 +77,7 @@ class MongoQueryCreator extends AbstractQueryCreator { protected Criteria create(Part part, BindableParameterIterator iterator) { return from(part.getType(), - new Query().start(part.getProperty().toDotPath()), iterator); + where(part.getProperty().toDotPath()), iterator); } @@ -92,7 +94,7 @@ class MongoQueryCreator extends AbstractQueryCreator { protected Criteria and(Part part, Criteria base, BindableParameterIterator iterator) { - return from(part.getType(), base.and(part.getProperty().toDotPath()), + return from(part.getType(), where(part.getProperty().toDotPath()), iterator); } @@ -107,7 +109,7 @@ class MongoQueryCreator extends AbstractQueryCreator { @Override protected Criteria or(Criteria base, Criteria criteria) { - base.or(Arrays.asList(criteria.end())); + base.or(Collections.singletonList(new Query(criteria))); return base; } @@ -122,7 +124,7 @@ class MongoQueryCreator extends AbstractQueryCreator { @Override protected Query complete(Criteria criteria, Sort sort) { - Query query = criteria.end(); + Query query = new Query(criteria); if (LOG.isDebugEnabled()) { LOG.debug("Created query " + query); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java index 7e92185ae..d9f2c262f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java @@ -15,6 +15,8 @@ */ package org.springframework.data.document.mongodb.repository; +import static org.springframework.data.document.mongodb.query.Criteria.where; + import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -32,9 +34,6 @@ import org.springframework.data.repository.support.IsNewAware; import org.springframework.data.repository.support.RepositorySupport; import org.springframework.util.Assert; -import com.mongodb.QueryBuilder; - - /** * Repository base implementation for Mongo. * @@ -110,7 +109,7 @@ public class SimpleMongoRepository extends List result = template.find( - new Query().start("_id").is(objectId).end(), + new Query(where("_id").is(objectId)), getDomainClass()); return result.isEmpty() ? null : result.get(0); } @@ -161,8 +160,8 @@ public class SimpleMongoRepository extends public void delete(T entity) { Query query = - Query.startQueryWithCriteria(entityInformation.getFieldName()).is( - entityInformation.getId(entity)).end(); + new Query(where(entityInformation.getFieldName()).is( + entityInformation.getId(entity))); template.remove(query); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java index 7d32c835d..cfdaef21f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java @@ -20,6 +20,8 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.endsWith; import static org.junit.Assert.assertThat; +import static org.springframework.data.document.mongodb.query.Criteria.where; + import java.util.List; import org.junit.Before; @@ -29,6 +31,7 @@ import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.data.document.mongodb.query.Criteria; import org.springframework.data.document.mongodb.query.Query; import org.springframework.data.document.mongodb.query.Update; import org.springframework.test.context.ContextConfiguration; @@ -66,7 +69,7 @@ public class MongoTemplateTests { MongoConverter converter = template.getConverter(); - List result = template.find(Query.startQueryWithCriteria("_id").is(converter.convertObjectId(person.getId())).end(), Person.class); + List result = template.find(new Query(Criteria.where("_id").is(converter.convertObjectId(person.getId()))), Person.class); assertThat(result.size(), is(1)); assertThat(result, hasItem(person)); } @@ -81,8 +84,8 @@ public class MongoTemplateTests { person.setAge(25); mongoTemplate.insert(person); - Query q = Query.startQueryWithCriteria("BOGUS").gt(22).end(); - Update u = Update.startUpdate().set("firstName", "Sven"); + Query q = new Query(Criteria.where("BOGUS").gt(22)); + Update u = new Update().set("firstName", "Sven"); thrown.expect(DataIntegrityViolationException.class); thrown.expectMessage( endsWith("0 documents updated") ); mongoTemplate.updateFirst(q, u); @@ -91,7 +94,7 @@ public class MongoTemplateTests { @Test public void simpleQuery() throws Exception { - Query.startQueryWithCriteria("name").is("Mary").and("age").lt(33).gt(22).end().skip(22).limit(20); + new Query(where("name").is("Mary")).and(where("age").lt(33).gt(22)).skip(22).limit(20); // TODO: more tests } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/QueryTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryTests.java similarity index 73% rename from spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/QueryTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryTests.java index 65a8d5841..e21851a18 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/QueryTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryTests.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.document.mongodb.builder; +package org.springframework.data.document.mongodb.query; + +import static org.springframework.data.document.mongodb.query.Criteria.where; import org.junit.Assert; import org.junit.Test; @@ -24,18 +26,14 @@ public class QueryTests { @Test public void testSimpleQuery() { - Query q = new Query(); - q.start("name").is("Thomas"); - q.start("age").lt(80); + Query q = new Query(where("name").is("Thomas")).and(where("age").lt(80)); String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}"; Assert.assertEquals(expected, q.getQueryObject().toString()); } @Test public void testQueryWithNot() { - Query q = new Query(); - q.start("name").is("Thomas"); - q.start("age").not().mod(10, 0); + Query q = new Query(where("name").is("Thomas")).and(where("age").not().mod(10, 0)); String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$not\" : { \"$mod\" : [ 10 , 0]}}}"; Assert.assertEquals(expected, q.getQueryObject().toString()); } @@ -44,8 +42,8 @@ public class QueryTests { public void testOrQuery() { Query q = new Query();; q.or( - new Query().start("name").is("Sven").and("age").lt(50).end(), - new Query().start("age").lt(50).end(), + new Query(where("name").is("Sven")).and(where("age").lt(50)), + new Query(where("age").lt(50)), new BasicQuery("{'name' : 'Thomas'}") ); String expected = "{ \"$or\" : [ { \"name\" : \"Sven\" , \"age\" : { \"$lt\" : 50}} , { \"age\" : { \"$lt\" : 50}} , { \"name\" : \"Thomas\"}]}"; @@ -54,8 +52,7 @@ public class QueryTests { @Test public void testQueryWithLimit() { - Query q = new Query(); - q.start("name").gte("M").lte("T").and("age").not().gt(22); + Query q = new Query(where("name").gte("M").lte("T")).and(where("age").not().gt(22)); q.limit(50); String expected = "{ \"name\" : { \"$gte\" : \"M\" , \"$lte\" : \"T\"} , \"age\" : { \"$not\" : { \"$gt\" : 22}}}"; Assert.assertEquals(expected, q.getQueryObject().toString()); @@ -64,8 +61,7 @@ public class QueryTests { @Test public void testQueryWithFieldsAndSlice() { - Query q = new Query(); - q.start("name").gte("M").lte("T").and("age").not().gt(22); + Query q = new Query(where("name").gte("M").lte("T")).and(where("age").not().gt(22)); q.fields().exclude("address").include("name").slice("orders", 10); String expected = "{ \"name\" : { \"$gte\" : \"M\" , \"$lte\" : \"T\"} , \"age\" : { \"$not\" : { \"$gt\" : 22}}}"; @@ -73,4 +69,12 @@ public class QueryTests { String expectedFields = "{ \"address\" : 0 , \"name\" : 1 , \"orders\" : { \"$slice\" : 10}}"; Assert.assertEquals(expectedFields, q.getFieldsObject().toString()); } + + @Test + public void testBasicQuery() { + Query q = new BasicQuery("{ \"name\" : \"Thomas\"}").and(where("age").lt(80)); + String expected = "{ \"name\" : \"Thomas\" , \"age\" : { \"$lt\" : 80}}"; + Assert.assertEquals(expected, q.getQueryObject().toString()); + } + } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/SortTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/SortTests.java similarity index 92% rename from spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/SortTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/SortTests.java index 53a2a8a13..beff0650f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/SortTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/SortTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.document.mongodb.builder; +package org.springframework.data.document.mongodb.query; import org.junit.Assert; import org.junit.Test; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/UpdateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/UpdateTests.java similarity index 87% rename from spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/UpdateTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/UpdateTests.java index 3098a54f4..c1454453b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/builder/UpdateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/UpdateTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.document.mongodb.builder; +package org.springframework.data.document.mongodb.query; import java.util.HashMap; import java.util.Map; @@ -21,7 +21,6 @@ import java.util.Map; import org.junit.Assert; import org.junit.Test; import org.springframework.data.document.mongodb.query.Update; -import org.springframework.data.document.mongodb.query.Sort.Order; public class UpdateTests { @@ -121,4 +120,18 @@ public class UpdateTests { Assert.assertEquals("{ \"$rename\" : { \"directory\" : \"folder\"}}", u.getUpdateObject().toString()); } + @Test + public void testBasicUpdateInc() { + Update u = new Update() + .inc("size", 1); + Assert.assertEquals("{ \"$inc\" : { \"size\" : 1}}", u.getUpdateObject().toString()); + } + + @Test + public void testBasicUpdateIncAndSet() { + Update u = new BasicUpdate("{ \"$inc\" : { \"size\" : 1}}") + .set("directory", "/Users/Test/Desktop"); + Assert.assertEquals("{ \"$inc\" : { \"size\" : 1} , \"$set\" : { \"directory\" : \"/Users/Test/Desktop\"}}", + u.getUpdateObject().toString()); + } }