diff --git a/pom.xml b/pom.xml index b1767cea66..f55717de3b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-847-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 854bef52cc..da58efc15a 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-847-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-847-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 7302043a15..4911b883c6 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-847-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index 0415f6eb5e..27fe70dd37 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-847-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 6e84732769..25983880d0 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-847-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java index 21154de2a8..6e6e0fb512 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java @@ -25,6 +25,7 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty.PropertyToFieldNameConverter; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update.Modifier; import org.springframework.data.mongodb.core.query.Update.Modifiers; import org.springframework.data.util.ClassTypeInformation; @@ -79,10 +80,19 @@ protected Entry getMappedObjectForField(Field field, Object rawV return createMapEntry(field, convertSimpleOrDBObject(rawValue, field.getPropertyEntity())); } - if (!isUpdateModifier(rawValue)) { - return super.getMappedObjectForField(field, getMappedValue(field, rawValue)); + if (isQuery(rawValue)) { + return createMapEntry(field, + super.getMappedObject(((Query) rawValue).getQueryObject(), field.getPropertyEntity())); } + if (isUpdateModifier(rawValue)) { + return getMappedUpdateModifier(field, rawValue); + } + + return super.getMappedObjectForField(field, getMappedValue(field, rawValue)); + } + + private Entry getMappedUpdateModifier(Field field, Object rawValue) { Object value = null; if (rawValue instanceof Modifier) { @@ -99,7 +109,6 @@ protected Entry getMappedObjectForField(Field field, Object rawV value = modificationOperations; } else { - throw new IllegalArgumentException(String.format("Unable to map value of type '%s'!", rawValue.getClass())); } @@ -119,6 +128,10 @@ private boolean isUpdateModifier(Object value) { return value instanceof Modifier || value instanceof Modifiers; } + private boolean isQuery(Object value) { + return value instanceof Query; + } + private DBObject getMappedValue(Modifier modifier) { Object value = converter.convertToMongoType(modifier.getValue(), ClassTypeInformation.OBJECT); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java index 170c3a7894..3ddf2526a3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java @@ -41,10 +41,13 @@ import org.springframework.data.mongodb.core.DBObjectTestUtils; import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.mongodb.DBRef; @@ -471,6 +474,40 @@ public void updateOnDbrefPropertyOfInterfaceTypeWithoutExplicitGetterForIdShould assertThat(model, allOf(instanceOf(DBRef.class), IsEqual. equalTo(expectedDBRef))); } + /** + * @see DATAMONGO-847 + */ + @Test + public void updateMapperConvertsNestedQueryCorrectly() { + + Update update = new Update().pull("list", Query.query(Criteria.where("value").in("foo", "bar"))); + DBObject mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ParentClass.class)); + + DBObject $pull = DBObjectTestUtils.getAsDBObject(mappedUpdate, "$pull"); + DBObject list = DBObjectTestUtils.getAsDBObject($pull, "aliased"); + DBObject value = DBObjectTestUtils.getAsDBObject(list, "value"); + BasicDBList $in = DBObjectTestUtils.getAsDBList(value, "$in"); + + assertThat($in, IsIterableContainingInOrder. contains("foo", "bar")); + } + + /** + * @see DATAMONGO-847 + */ + @Test + public void updateMapperConvertsPullWithNestedQuerfyOnDBRefCorrectly() { + + Update update = new Update().pull("dbRefAnnotatedList", Query.query(Criteria.where("id").is("1"))); + DBObject mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(DocumentWithDBRefCollection.class)); + + DBObject $pull = DBObjectTestUtils.getAsDBObject(mappedUpdate, "$pull"); + DBObject list = DBObjectTestUtils.getAsDBObject($pull, "dbRefAnnotatedList"); + + assertThat(list, equalTo(new BasicDBObjectBuilder().add("_id", "1").get())); + } + @org.springframework.data.mongodb.core.mapping.Document(collection = "DocumentWithReferenceToInterface") static interface DocumentWithReferenceToInterface {