From d33aa682e505be5c6d712445ce7104d7fc48a997 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 26 Apr 2021 06:09:09 +0200 Subject: [PATCH] Fix $or / $nor keyword mapping in query mapper. This commit fixes an issue with the pattern used for detecting $or / $nor which also matched other keywords like $floor. Closes: #3635 Original pull request: #3637. --- .../data/mongodb/core/convert/QueryMapper.java | 3 +-- .../data/mongodb/core/convert/QueryMapperUnitTests.java | 8 ++++++++ 2 files changed, 9 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 7f2645bc3..d8a6db4a4 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 @@ -792,7 +792,6 @@ public class QueryMapper { */ static class Keyword { - private static final String N_OR_PATTERN = "\\$.*or"; private static final Set NON_DBREF_CONVERTING_KEYWORDS = new HashSet<>( Arrays.asList("$", "$size", "$slice", "$gt", "$lt")); @@ -823,7 +822,7 @@ public class QueryMapper { } public boolean isOrOrNor() { - return key.matches(N_OR_PATTERN); + return key.equalsIgnoreCase("$or") || key.equalsIgnoreCase("$nor"); } /** 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 3aa8f46d6..1aa797102 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 @@ -1268,6 +1268,14 @@ public class QueryMapperUnitTests { assertThat(document).isEqualTo(new org.bson.Document("stringAsOid", null)); } + @Test // GH-3635 + void $floorKeywordDoesNotMatch$or$norPattern() { + + Query query = new BasicQuery(" { $expr: { $gt: [ \"$spent\" , { $floor : \"$budget\" } ] } }"); + assertThatNoException() + .isThrownBy(() -> mapper.getMappedObject(query.getQueryObject(), context.getPersistentEntity(Foo.class))); + } + class WithDeepArrayNesting { List level0;