From 0561b808f16daf47a40192e7197158493829f82b Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 11 Oct 2024 09:58:29 +0200 Subject: [PATCH] Retain regex options from the parsed JsonToken. We now retain expression options when resolving bind values from the original BsonRegularExpression. Closes: #4806 Original Pull Request: #4807 --- .../util/json/ParameterBindingJsonReader.java | 4 +++- .../ParameterBindingJsonReaderUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java index 4ef61835f..a1cf8f506 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java @@ -456,7 +456,9 @@ public class ParameterBindingJsonReader extends AbstractBsonReader { if (isRegularExpression) { - bindableValue.setValue(new BsonRegularExpression(computedValue)); + BsonRegularExpression originalExpression = token.getValue(BsonRegularExpression.class); + + bindableValue.setValue(new BsonRegularExpression(computedValue, originalExpression.getOptions())); bindableValue.setType(BsonType.REGULAR_EXPRESSION); } else { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java index e07a8c400..b6fb4c158 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java @@ -26,6 +26,7 @@ import java.util.UUID; import org.bson.BsonBinary; import org.bson.BsonBinarySubType; +import org.bson.BsonRegularExpression; import org.bson.Document; import org.bson.codecs.DecoderContext; import org.junit.jupiter.api.Test; @@ -81,6 +82,26 @@ class ParameterBindingJsonReaderUnitTests { assertThat(target).isEqualTo(new Document("lastname", "100")); } + @Test // GH-4806 + void regexConsidersOptions() { + + Document target = parse("{ 'c': /^true$/i }"); + + BsonRegularExpression pattern = target.get("c", BsonRegularExpression.class); + assertThat(pattern.getPattern()).isEqualTo("^true$"); + assertThat(pattern.getOptions()).isEqualTo("i"); + } + + @Test // GH-4806 + void regexConsidersBindValueWithOptions() { + + Document target = parse("{ 'c': /^?0$/i }", "foo"); + + BsonRegularExpression pattern = target.get("c", BsonRegularExpression.class); + assertThat(pattern.getPattern()).isEqualTo("^foo$"); + assertThat(pattern.getOptions()).isEqualTo("i"); + } + @Test void bindValueToRegex() {