From ef6e08d3f462fa4c7eee6515e4380be99c17a9a7 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Tue, 6 Dec 2011 00:26:18 -0500 Subject: [PATCH] DATAMONGO-234 - MongoTemplate should support the findAndModify operation to update version fields --- .../data/mongodb/core/MongoTemplate.java | 13 +++--- .../data/mongodb/core/MongoTemplateTests.java | 41 +++++++++++++++++++ .../data/mongodb/core/Person.java | 11 +++++ 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 4dbd78d56..3a2b8471d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -521,18 +521,15 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } public T findAndModify(Query query, Update update, Class entityClass) { - // TODO Auto-generated method stub - return null; + return findAndModify(query, update, new FindAndModifyOptions(), entityClass, determineCollectionName(entityClass)); } public T findAndModify(Query query, Update update, Class entityClass, String collectionName) { - // TODO Auto-generated method stub - return null; + return findAndModify(query, update, new FindAndModifyOptions(), entityClass, collectionName); } public T findAndModify(Query query, Update update, FindAndModifyOptions options, Class entityClass) { - // TODO Auto-generated method stub - return null; + return findAndModify(query, update, options, entityClass, determineCollectionName(entityClass)); } public T findAndModify(Query query, Update update, FindAndModifyOptions options, Class entityClass, @@ -1304,6 +1301,10 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { Class entityClass, Update update, FindAndModifyOptions options) { EntityReader readerToUse = this.mongoConverter; + + if (options == null) { + options = new FindAndModifyOptions(); + } MongoPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 836679b8d..4ace558e2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -391,6 +391,47 @@ public class MongoTemplateTests { private void checkCollectionContents(Class entityClass, int count) { assertThat(template.findAll(entityClass).size(), is(count)); } + + + @Test + public void testFindAndUpdate() { + template.insert(new Person("Tom", 21)); + template.insert(new Person("Dick", 22)); + template.insert(new Person("Harry", 23)); + + Query query = new Query(Criteria.where("firstName").is("Harry")); + Update update = new Update().inc("age", 1); + Person p = template.findAndModify(query, update, Person.class); // return old + assertThat(p.getFirstName(), is("Harry")); + assertThat(p.getAge(), is(23)); + p = template.findOne(query, Person.class); + assertThat(p.getAge(), is(24)); + + p = template.findAndModify(query, update, Person.class, "person"); + assertThat(p.getAge(), is(24)); + p = template.findOne(query, Person.class); + assertThat(p.getAge(), is(25)); + + p = template.findAndModify(query, update, new FindAndModifyOptions().returnNew(true), Person.class); + assertThat(p.getAge(), is(26)); + + p = template.findAndModify(query, update, null, Person.class, "person"); + assertThat(p.getAge(), is(26)); + p = template.findOne(query, Person.class); + assertThat(p.getAge(), is(27)); + + } + + @Test + public void testFindAndUpdateUpsert() { + template.insert(new Person("Tom", 21)); + template.insert(new Person("Dick", 22)); + Query query = new Query(Criteria.where("firstName").is("Harry")); + Update update = new Update().set("age", 23); + Person p = template.findAndModify(query, update, new FindAndModifyOptions().upsert(true).returnNew(true), Person.class); + assertThat(p.getFirstName(), is("Harry")); + assertThat(p.getAge(), is(23)); + } @Test public void testFindAndRemove() throws Exception { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Person.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Person.java index 816a2a625..c5f9e93f8 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Person.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Person.java @@ -31,10 +31,21 @@ public class Person { this.id = new ObjectId(); } + @Override + public String toString() { + return "Person [id=" + id + ", firstName=" + firstName + ", age=" + age + ", friend=" + friend + "]"; + } + public Person(ObjectId id, String firstname) { this.id = id; this.firstName = firstname; } + + public Person(String firstname, int age) { + this(); + this.firstName = firstname; + this.age = age; + } public Person(String firstname) { this();