From 1106a5a44961853afb59e27c44a9c89a7c0a5f8f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 7 Jun 2024 12:19:49 +0200 Subject: [PATCH 1/2] 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 de66da1866..e95baf22fd 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.4.0-SNAPSHOT + 4.4.x-GH-4674-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index a3dc49f892..82aa5be727 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.4.0-SNAPSHOT + 4.4.x-GH-4674-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index e33930bfd2..17f1ab44cc 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.4.0-SNAPSHOT + 4.4.x-GH-4674-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index fafe9c8793..1ff3ca31ae 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.4.0-SNAPSHOT + 4.4.x-GH-4674-SNAPSHOT ../pom.xml From 72f19c6d22bf6b135d1a0a5a01c0bddc2d0ee31b Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 10 Jun 2024 11:27:22 +0200 Subject: [PATCH 2/2] Fix conversion of regular expression in queries. This commit fixes an issue where patterns targeting id properties might have been falsely converted into the properties type, turning a Pattern into it's string representation. --- .../mongodb/core/convert/QueryMapper.java | 27 +++++++++++++++++-- .../core/convert/QueryMapperUnitTests.java | 15 +++++++++++ 2 files changed, 40 insertions(+), 2 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 bba8054cc1..32738d8b07 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 @@ -815,6 +815,11 @@ public Object convertId(@Nullable Object id) { */ @Nullable public Object convertId(@Nullable Object id, Class targetType) { + + if (!SpecialTypeTreatment.INSTANCE.isConversionCandidate(id)) { + return id; + } + return converter.convertId(id, targetType); } @@ -876,8 +881,8 @@ protected boolean isKeyword(String candidate) { private Object applyFieldTargetTypeHintToValue(Field documentField, @Nullable Object value) { if (value == null || documentField.getProperty() == null || !documentField.getProperty().hasExplicitWriteTarget() - || value instanceof Document || value instanceof DBObject || value instanceof Pattern - || value instanceof BsonRegularExpression) { + || value instanceof Document || value instanceof DBObject + || !SpecialTypeTreatment.INSTANCE.isConversionCandidate(value)) { return value; } @@ -1604,4 +1609,22 @@ public T getPropertyValue(MongoPersistentProperty property) { throw new IllegalStateException("No enclosing property source available"); } } + + /* + * Types that must not be converted + */ + enum SpecialTypeTreatment { + + INSTANCE; + + private final Set> types = Set.of(Pattern.class, BsonRegularExpression.class); + + boolean isConversionCandidate(@Nullable Object value) { + if (value == null) { + return false; + } + + return !types.contains(value.getClass()); + } + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index 5cd84120ad..d08f68dbd3 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java @@ -1101,6 +1101,21 @@ void shouldRetainRegexPattern() { assertThat(document.get("text")).isInstanceOf(BsonRegularExpression.class); } + @Test // GH-4674 + void shouldRetainRegexPatternForIdProperty() { + + org.bson.Document javaRegex = mapper.getMappedObject(query(where("id").regex("^1234$")).getQueryObject(), + context.getPersistentEntity(WithStringId.class)); + + assertThat(javaRegex.get("_id")).isInstanceOf(Pattern.class); + + org.bson.Document bsonRegex = mapper.getMappedObject( + query(where("id").regex(new BsonRegularExpression("^1234$"))).getQueryObject(), + context.getPersistentEntity(WithStringId.class)); + + assertThat(bsonRegex.get("_id")).isInstanceOf(BsonRegularExpression.class); + } + @Test // DATAMONGO-2339 void findByIdUsesMappedIdFieldNameWithUnderscoreCorrectly() {