diff --git a/pom.xml b/pom.xml index 366786fc6d..5fe46fcc0a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4502-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 2de4b6b635..90e4b7e7a6 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4502-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 41b81f9aa6..45475aab9e 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4502-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index d7a9ddaa63..52bac214d2 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4502-SNAPSHOT ../pom.xml 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 06aee31afc..1c4e4bb762 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 @@ -1471,26 +1471,29 @@ protected String mapPropertyName(MongoPersistentProperty property) { } String nextToken = nextToken(); - if (isPositionalParameter(nextToken)) { + if (property.isMap()) { mappedName.append(".").append(nextToken); currentIndex += 2; return mappedName.toString(); } - if (property.isMap()) { - + int i = 1; + while (isPositionalParameter(nextToken)) { mappedName.append(".").append(nextToken); - currentIndex += 2; - return mappedName.toString(); + i++; + nextToken = currentIndex + i < pathParts.size() ? pathParts.get(currentIndex + i) : ""; } - - currentIndex++; + currentIndex += i; return mappedName.toString(); } static boolean isPositionalParameter(String partial) { + if(!StringUtils.hasText(partial)) { + return false; + } + if ("$".equals(partial)) { return true; } @@ -1500,12 +1503,12 @@ static boolean isPositionalParameter(String partial) { return true; } - try { - Long.valueOf(partial); - return true; - } catch (NumberFormatException e) { - return false; + for (int i = 0; i < partial.length(); i++) { + if (!Character.isDigit(partial.charAt(i))) { + return false; + } } + return true; } } } 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 df1e13aeae..5d8629a5b4 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 @@ -1350,6 +1350,17 @@ void updateConsidersValueConverterWhenPresent() { assertThat(mappedUpdate).isEqualTo("{ $set : { 'text' : 'eulav' } }"); } + @ParameterizedTest // GH-4502 + @ValueSource(strings = {"levelOne.levelTwo.1", "levelOne.levelTwo.1.0", "levelOne.levelTwo.2.0",}) + void objectNestedIntegerFieldCorrectly(String path) { + + Update update = new Update().set(path, "4"); + Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(EntityWithNestedObject1.class)); + + assertThat(mappedUpdate).isEqualTo(new org.bson.Document("$set", new org.bson.Document(path, "4"))); + } + static class DomainTypeWrappingConcreteyTypeHavingListOfInterfaceTypeAttributes { ListModelWrapper concreteTypeWithListAttributeOfInterfaceType; } @@ -1818,4 +1829,12 @@ static class WithPropertyValueConverter { @ValueConverter(ReversingValueConverter.class) String text; } + + static class EntityWithNestedObject1 { + EntityWithNestedObject2 levelOne; + } + + static class EntityWithNestedObject2 { + Integer levelTwo; + } }