From e99caf74c77abc1d511d7c58c502bbcabf85efb3 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 26 Sep 2023 14:09:51 +0200 Subject: [PATCH 1/4] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 From 029065f5e573294456f1424ae20647a6977774fa Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 26 Sep 2023 14:47:19 +0200 Subject: [PATCH 2/4] Fixes it but needs a better concept --- .../mongodb/core/convert/QueryMapper.java | 14 +++++++++----- .../core/convert/UpdateMapperUnitTests.java | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) 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..bd55ca3e5b 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 @@ -1470,11 +1470,15 @@ protected String mapPropertyName(MongoPersistentProperty property) { return mappedName.toString(); } - String nextToken = nextToken(); - if (isPositionalParameter(nextToken)) { - - mappedName.append(".").append(nextToken); - currentIndex += 2; + int i = 1; + String nextToken = pathParts.get(currentIndex + i); + if(isPositionalParameter(nextToken)) { + while (isPositionalParameter(nextToken)) { + mappedName.append(".").append(nextToken); + i++; + nextToken = currentIndex + i < pathParts.size() ? pathParts.get(currentIndex + i) : ""; + } + currentIndex += i; return mappedName.toString(); } 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; + } } From 5b67e1efc13bce6e55ba754febf3b2d8c256f015 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 4 Oct 2023 11:07:59 +0200 Subject: [PATCH 3/4] Simplify computation restructure key computation parts. --- .../mongodb/core/convert/QueryMapper.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) 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 bd55ca3e5b..3718ac88f5 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 @@ -1470,18 +1470,7 @@ protected String mapPropertyName(MongoPersistentProperty property) { return mappedName.toString(); } - int i = 1; - String nextToken = pathParts.get(currentIndex + i); - if(isPositionalParameter(nextToken)) { - while (isPositionalParameter(nextToken)) { - mappedName.append(".").append(nextToken); - i++; - nextToken = currentIndex + i < pathParts.size() ? pathParts.get(currentIndex + i) : ""; - } - currentIndex += i; - return mappedName.toString(); - } - + String nextToken = nextToken(); if (property.isMap()) { mappedName.append(".").append(nextToken); @@ -1489,7 +1478,13 @@ protected String mapPropertyName(MongoPersistentProperty property) { return mappedName.toString(); } - currentIndex++; + int i = 1; + while (isPositionalParameter(nextToken)) { + mappedName.append(".").append(nextToken); + i++; + nextToken = currentIndex + i < pathParts.size() ? pathParts.get(currentIndex + i) : ""; + } + currentIndex += i; return mappedName.toString(); } From 1d13be8dc8ef61a3119e283d5fcce4fa8f65c3b5 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 4 Oct 2023 11:30:43 +0200 Subject: [PATCH 4/4] Polishing Get rid of exception in positional parameter detection. --- .../data/mongodb/core/convert/QueryMapper.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 3718ac88f5..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 @@ -1490,6 +1490,10 @@ protected String mapPropertyName(MongoPersistentProperty property) { static boolean isPositionalParameter(String partial) { + if(!StringUtils.hasText(partial)) { + return false; + } + if ("$".equals(partial)) { return true; } @@ -1499,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; } } }