From d77786d81adf1d55468ceb523881f7622e2dd1b0 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 20 Dec 2024 12:02:11 +0100 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index c3245aad49..a24187e684 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.5.0-SNAPSHOT + 4.5.x-GH-4850-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 58c63dfc97..cf2d1cb566 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.5.0-SNAPSHOT + 4.5.x-GH-4850-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 98516a5ba9..bda015c6dc 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.5.0-SNAPSHOT + 4.5.x-GH-4850-SNAPSHOT ../pom.xml From cb40b69f129f6557e76317744bb75a243f16ee6a Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 20 Dec 2024 13:53:09 +0100 Subject: [PATCH 2/2] Wrap Criteria is and regex comparison if necessary. This commit wraps simple values and Patterns if to avoid creating invalid query objects. --- .../data/mongodb/core/query/Criteria.java | 13 +++++- .../mongodb/core/query/CriteriaUnitTests.java | 40 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java index fc25e15c0c..3c05c22227 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java @@ -945,8 +945,17 @@ protected Document getSingleCriteriaObject() { Document queryCriteria = new Document(); if (!NOT_SET.equals(isValue)) { - queryCriteria.put(this.key, this.isValue); - queryCriteria.putAll(document); + if(document.isEmpty()) { + queryCriteria.put(this.key, this.isValue); + } + else { + if(isValue instanceof Pattern || isValue instanceof BsonRegularExpression) { + document.put("$regex", isValue); + } else { + document.put("$eq", isValue); + } + queryCriteria.put(this.key, document); + } } else { queryCriteria.put(this.key, document); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java index 645f75066a..14448bb052 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java @@ -20,7 +20,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.regex.Pattern; +import org.bson.BsonRegularExpression; import org.bson.Document; import org.junit.Test; import org.springframework.data.geo.Point; @@ -50,6 +52,44 @@ public void testSimpleCriteria() { assertThat(c.getCriteriaObject()).isEqualTo("{ \"name\" : \"Bubba\"}"); } + @Test // GH-4850 + public void testCombiningSimpleCriteria() { + + Document expected = Document.parse("{ name : { $eq : 123, $type : ['long'] } }"); + + Criteria c = Criteria.where("name") // + .is(123) // + .type(Type.INT_64); + + assertThat(c.getCriteriaObject()).isEqualTo(expected); + + c = Criteria.where("name") // + .type(Type.INT_64) + .is(123); + + assertThat(c.getCriteriaObject()).isEqualTo(expected); + } + + @Test // GH-4850 + public void testCombiningBsonRegexCriteria() { + + Criteria c = Criteria.where("name") + .regex(new BsonRegularExpression("^spring$")) + .type(Type.INT_64); + + assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ name : { $regex : RegExp('^spring$'), $type : ['long'] } }")); + } + + @Test // GH-4850 + public void testCombiningRegexCriteria() { + + Criteria c = Criteria.where("name") + .regex("^spring$") + .type(Type.INT_64); + + assertThat(c.getCriteriaObject()).hasEntrySatisfying("name.$regex", it -> assertThat(it).isInstanceOf(Pattern.class)); + } + @Test public void testNotEqualCriteria() { Criteria c = new Criteria("name").ne("Bubba");