From e9782206eb63e26edcd4b79ccbb5b35411214aa8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 27 Mar 2014 09:02:04 +0100 Subject: [PATCH 1/2] DATAMONGO-471 - Add support for '$each' when using '$addToSet'. Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-cross-store/pom.xml | 4 ++-- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb-log4j/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 28e7260e25..dc475625bd 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-471-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 69a19c150b..ebd9e4964e 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-471-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.5.0.BUILD-SNAPSHOT + 1.5.0.DATAMONGO-471-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 7302043a15..dce1504779 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-471-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index 0415f6eb5e..3e6bed42a7 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-471-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 6e84732769..906c3fbb6d 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-471-SNAPSHOT ../pom.xml From 7111085640f188531d8eab677973c77163b2b68f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 27 Mar 2014 09:51:15 +0100 Subject: [PATCH 2/2] DATAMONGO-471 - Add support for '$each' when using '$addToSet'. Additionally to 'addToSet(String, Object)' the method 'addToSet(String)' has been introduced, returning a 'Builder' allowing creation of $addToSet command for either single value, or multiple values using $each. Using value: new Update().addToSet("key").value("spring"); Using each: new Update().addToSet("key").each("spring", "data", "mongodb"); Original Pull Request: #157 --- .../data/mongodb/core/query/Update.java | 51 ++++++++++++++++++- .../data/mongodb/core/MongoTemplateTests.java | 19 +++++++ .../core/convert/UpdateMapperUnitTests.java | 46 +++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java index cb74f434b0..e75c844f9d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java @@ -196,6 +196,18 @@ public Update pushAll(String key, Object[] values) { return this; } + /** + * Update using {@code $addToSet} modifier.
+ * Allows creation of {@code $push} command for single or multiple (using {@code $each}) values + * + * @param key + * @return + * @since 1.5 + */ + public AddToSetBuilder addToSet(String key) { + return new AddToSetBuilder(key); + } + /** * Update using the {@literal $addToSet} update modifier * @@ -408,7 +420,7 @@ public Object getValue() { /** * Builder for creating {@code $push} modifiers * - * @author Christop Strobl + * @author Christoph Strobl */ public class PushOperatorBuilder { @@ -442,4 +454,41 @@ public Update value(Object value) { return Update.this.push(key, value); } } + + /** + * Builder for creating {@code $addToSet} modifier. + * + * @author Christoph Strobl + * @since 1.5 + */ + public class AddToSetBuilder { + + private final String key; + + public AddToSetBuilder(String key) { + this.key = key; + } + + /** + * Propagates {@code $each} to {@code $addToSet} + * + * @param values + * @return + */ + public Update each(Object... values) { + return Update.this.addToSet(this.key, new Each(values)); + } + + /** + * Propagates {@link #value(Object)} to {@code $addToSet} + * + * @param values + * @return + */ + public Update value(Object value) { + return Update.this.addToSet(this.key, value); + } + + } + } 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 c8ceb0306f..a7495880cd 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 @@ -2550,6 +2550,25 @@ public void savingAndReassigningLazyLoadingProxies() { assertThat(savedMessage.normalContent.text, is(content.text)); } + /** + * @see DATAMONGO-471 + */ + @Test + public void updateMultiShouldAddValuesCorrectlyWhenUsingAddToSetWithEach() { + + DocumentWithCollectionOfSimpleType document = new DocumentWithCollectionOfSimpleType(); + document.values = Arrays.asList("spring"); + template.save(document); + + Query query = query(where("id").is(document.id)); + assumeThat(template.findOne(query, DocumentWithCollectionOfSimpleType.class).values, hasSize(1)); + + Update update = new Update().addToSet("values").each("data", "mongodb"); + template.updateMulti(query, update, DocumentWithCollectionOfSimpleType.class); + + assertThat(template.findOne(query, DocumentWithCollectionOfSimpleType.class).values, hasSize(3)); + } + static class DocumentWithDBRefCollection { @Id public String id; 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 fbc6dd7197..818f2cf412 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 @@ -412,6 +412,46 @@ public void doesNotConvertRawDbObjects() { assertThat(inClause, IsIterableContainingInOrder. contains(1L, 2L)); } + /** + * @see DATAMONG0-471 + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Test + public void testUpdateShouldApply$addToSetCorrectlyWhenUsedWith$each() { + + Update update = new Update().addToSet("values").each("spring", "data", "mongodb"); + DBObject mappedObject = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ListModel.class)); + + DBObject addToSet = getAsDBObject(mappedObject, "$addToSet"); + DBObject values = getAsDBObject(addToSet, "values"); + BasicDBList each = getAsDBList(values, "$each"); + + assertThat(each.toMap(), (Matcher) allOf(hasValue("spring"), hasValue("data"), hasValue("mongodb"))); + } + + /** + * @see DATAMONG0-471 + */ + @Test + public void testUpdateShouldRetainClassTypeInformationWhenUsing$addToSetWith$eachForCustomTypes() { + + Update update = new Update().addToSet("models").each(new ModelImpl(2014), new ModelImpl(1), new ModelImpl(28)); + DBObject mappedObject = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ModelWrapper.class)); + + DBObject addToSet = getAsDBObject(mappedObject, "$addToSet"); + + DBObject values = getAsDBObject(addToSet, "models"); + BasicDBList each = getAsDBList(values, "$each"); + + for (Object updateValue : each) { + assertThat(((DBObject) updateValue).get("_class").toString(), + equalTo("org.springframework.data.mongodb.core.convert.UpdateMapperUnitTests$ModelImpl")); + } + + } + static interface Model {} static class ModelImpl implements Model { @@ -425,6 +465,12 @@ public ModelImpl(int value) { public class ModelWrapper { Model model; + + public ModelWrapper() {} + + public ModelWrapper(Model model) { + this.model = model; + } } static class ListModelWrapper {