From d795836994edffec3e60e8fee90446630afd14c8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 23 Oct 2017 08:51:55 +0200 Subject: [PATCH] DATAMONGO-1809 - Fix positional parameter detection for PropertyPaths. We now make sure to capture all digits for positional parameters. Original pull request: #508. --- .../mongodb/core/convert/QueryMapper.java | 2 +- .../core/convert/UpdateMapperUnitTests.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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 cabce8eed..95889e899 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 @@ -863,7 +863,7 @@ public class QueryMapper { try { - PropertyPath path = PropertyPath.from(pathExpression.replaceAll("\\.\\d", ""), entity.getTypeInformation()); + PropertyPath path = PropertyPath.from(pathExpression.replaceAll("\\.\\d+", ""), entity.getTypeInformation()); PersistentPropertyPath propertyPath = mappingContext.getPersistentPropertyPath(path); Iterator iterator = propertyPath.iterator(); 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 a10ebe6bd..2e807387a 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 @@ -21,6 +21,9 @@ import static org.mockito.Mockito.*; import static org.springframework.data.mongodb.core.DBObjectTestUtils.*; import static org.springframework.data.mongodb.test.util.IsBsonObject.*; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + import java.time.LocalDate; import java.util.Arrays; import java.util.Collections; @@ -685,6 +688,23 @@ public class UpdateMapperUnitTests { .containing("$set.concreteTypeWithListAttributeOfInterfaceType.models.[0]._class", ModelImpl.class.getName())); } + @Test // DATAMONGO-1809 + public void pathShouldIdentifyPositionalParameterWithMoreThanOneDigit() { + + BasicDBObject at2digitPosition = (BasicDBObject) mapper.getMappedObject(new Update() + .addToSet("concreteInnerList.10.concreteTypeList", new SomeInterfaceImpl("szeth")).getUpdateObject(), + context.getPersistentEntity(Outer.class)); + + BasicDBObject at3digitPosition = (BasicDBObject) mapper.getMappedObject(new Update() + .addToSet("concreteInnerList.123.concreteTypeList", new SomeInterfaceImpl("lopen")).getUpdateObject(), + context.getPersistentEntity(Outer.class)); + + assertThat(at2digitPosition, is(equalTo(new BasicDBObject("$addToSet", + new BasicDBObject("concreteInnerList.10.concreteTypeList", new BasicDBObject("value", "szeth")))))); + assertThat(at3digitPosition, is(equalTo(new BasicDBObject("$addToSet", + new BasicDBObject("concreteInnerList.123.concreteTypeList", new BasicDBObject("value", "lopen")))))); + } + @Test // DATAMONGO-1236 public void mappingShouldRetainTypeInformationForObjectValues() { @@ -1223,6 +1243,7 @@ public class UpdateMapperUnitTests { static class ConcreteInner { List interfaceTypeList; List abstractTypeList; + List concreteTypeList; } interface SomeInterfaceType { @@ -1233,8 +1254,11 @@ public class UpdateMapperUnitTests { } + @AllArgsConstructor + @NoArgsConstructor static class SomeInterfaceImpl extends SomeAbstractType implements SomeInterfaceType { + String value; } }