diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 146f6f23c..a39003ae7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -17,6 +17,8 @@ package org.springframework.data.mongodb.core.convert; import java.util.*; import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.bson.BsonValue; import org.bson.Document; @@ -758,6 +760,8 @@ public class QueryMapper { */ protected static class Field { + protected static final Pattern POSITIONAL_PARM = Pattern.compile("\\$\\[.*\\]"); + private static final String ID_KEY = "_id"; protected final String name; @@ -1030,7 +1034,10 @@ public class QueryMapper { try { - PropertyPath path = PropertyPath.from(pathExpression.replaceAll("\\.\\d+", ""), entity.getTypeInformation()); + String rawPath = pathExpression.replaceAll("\\.\\d+", "") // + .replaceAll(POSITIONAL_PARM.pattern(), ""); + + PropertyPath path = PropertyPath.from(rawPath, entity.getTypeInformation()); if (isPathToJavaLangClassProperty(path)) { return null; @@ -1179,6 +1186,11 @@ public class QueryMapper { return true; } + Matcher matcher = POSITIONAL_PARM.matcher(partial); + if (matcher.find()) { + return true; + } + try { Long.valueOf(partial); return true; 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 6eee6776f..8d57c01a7 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 @@ -289,7 +289,7 @@ public class UpdateMapper extends QueryMapper { public MetadataBackedUpdateField(MongoPersistentEntity entity, String key, MappingContext, MongoPersistentProperty> mappingContext) { - super(key.replaceAll("\\.\\$", ""), entity, mappingContext); + super(key.replaceAll("\\.\\$(\\[.*\\])?", ""), entity, mappingContext); this.key = key; } 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 52643287c..476e380b4 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 @@ -1029,6 +1029,28 @@ public class UpdateMapperUnitTests { assertThat(mappedUpdate).isEqualTo(new Document("AValue", "a value")); } + @Test // DATAMONGO-2054 + public void mappingShouldAllowPositionAllParameter() { + + Update update = new Update().inc("grades.$[]", 10); + + Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(EntityWithListOfSimple.class)); + + assertThat(mappedUpdate).isEqualTo(new Document("$inc", new Document("grades.$[]", 10))); + } + + @Test // DATAMONGO-2054 + public void mappingShouldAllowPositionAllParameterWhenPopertyHasExplicitFieldName() { + + Update update = new Update().inc("list.$[]", 10); + + Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ParentClass.class)); + + assertThat(mappedUpdate).isEqualTo(new Document("$inc", new Document("aliased.$[]", 10))); + } + static class DomainTypeWrappingConcreteyTypeHavingListOfInterfaceTypeAttributes { ListModelWrapper concreteTypeWithListAttributeOfInterfaceType; } @@ -1245,6 +1267,10 @@ public class UpdateMapperUnitTests { List list; } + static class EntityWithListOfSimple { + List grades; + } + static class EntityWithAliasedObject { @Field("renamed-value") Object value; @@ -1348,11 +1374,9 @@ public class UpdateMapperUnitTests { @Data static class TypeWithFieldNameThatCannotBeDecapitalized { - @Id - protected String id; + @Id protected String id; - @Field("AValue") - private Long aValue = 0L; + @Field("AValue") private Long aValue = 0L; }