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 91cfc6892..ec18d0767 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 @@ -419,7 +419,7 @@ public class QueryMapper { return false; } - Class type = value.getClass(); + Class type = value.getClass(); MongoPersistentProperty property = documentField.getProperty(); if (property.getActualType().isAssignableFrom(type)) { @@ -443,7 +443,7 @@ public class QueryMapper { protected Object convertSimpleOrDocument(Object source, @Nullable MongoPersistentEntity entity) { if (source instanceof Example) { - return exampleMapper.getMappedExample((Example) source, entity); + return exampleMapper.getMappedExample((Example) source, entity); } if (source instanceof List) { @@ -923,6 +923,7 @@ public class QueryMapper { protected static class MetadataBackedField extends Field { private static final Pattern POSITIONAL_PARAMETER_PATTERN = Pattern.compile("\\.\\$(\\[.*?\\])?|\\.\\d+"); + private static final Pattern DOT_POSITIONAL_PATTERN = Pattern.compile("\\.\\d+"); private static final String INVALID_ASSOCIATION_REFERENCE = "Invalid path reference %s! Associations can only be pointed to directly or via their id property!"; private final MongoPersistentEntity entity; @@ -964,15 +965,11 @@ public class QueryMapper { this.entity = entity; this.mappingContext = context; - this.path = getPath(removePositionalPlaceholders(name)); + this.path = getPath(removePlaceholders(POSITIONAL_PARAMETER_PATTERN, name)); this.property = path == null ? property : path.getLeafProperty(); this.association = findAssociation(); } - private static String removePositionalPlaceholders(String raw) { - return POSITIONAL_PARAMETER_PATTERN.matcher(raw).replaceAll(""); - } - /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.convert.QueryMapper.Field#with(java.lang.String) @@ -1076,7 +1073,7 @@ public class QueryMapper { } /** - * Returns the {@link PersistentPropertyPath} for the given pathExpression. + * Returns the {@link PersistentPropertyPath} for the given {@code pathExpression}. * * @param pathExpression * @return @@ -1084,8 +1081,8 @@ public class QueryMapper { @Nullable private PersistentPropertyPath getPath(String pathExpression) { - String rawPath = pathExpression.replaceAll("\\.\\d+", "") // - .replaceAll(POSITIONAL_OPERATOR.pattern(), ""); + String rawPath = removePlaceholders(POSITIONAL_OPERATOR, + removePlaceholders(DOT_POSITIONAL_PATTERN, pathExpression)); PropertyPath path = forName(rawPath); if (path == null || isPathToJavaLangClassProperty(path)) { @@ -1180,6 +1177,10 @@ public class QueryMapper { return mappingContext; } + private static String removePlaceholders(Pattern pattern, String raw) { + return pattern.matcher(raw).replaceAll(""); + } + /** * @author Christoph Strobl * @since 1.8 @@ -1231,14 +1232,12 @@ public class QueryMapper { static class KeyMapper { private final Iterator iterator; - private final MappingContext, MongoPersistentProperty> mappingContext; public KeyMapper(String key, MappingContext, MongoPersistentProperty> mappingContext) { this.iterator = Arrays.asList(key.split("\\.")).iterator(); this.iterator.next(); - this.mappingContext = mappingContext; } /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java index 8868f608a..5b6a7905b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java @@ -334,7 +334,7 @@ public class DefaultBulkOperationsUnitTests { } @Test // DATAMONGO-2502 - void shouldRetainNestedArrayPathWithPlaceholdersForNoMatchingPaths() { + public void shouldRetainNestedArrayPathWithPlaceholdersForNoMatchingPaths() { ops.updateOne(new BasicQuery("{}"), new Update().set("items.$.documents.0.fileId", "new-id")).execute(); @@ -346,7 +346,7 @@ public class DefaultBulkOperationsUnitTests { } @Test // DATAMONGO-2502 - void shouldRetainNestedArrayPathWithPlaceholdersForMappedEntity() { + public void shouldRetainNestedArrayPathWithPlaceholdersForMappedEntity() { DefaultBulkOperations ops = new DefaultBulkOperations(template, "collection-1", new BulkOperationContext(BulkMode.ORDERED, Optional.of(mappingContext.getPersistentEntity(OrderTest.class)), @@ -358,7 +358,7 @@ public class DefaultBulkOperationsUnitTests { UpdateOneModel updateModel = (UpdateOneModel) captor.getValue().get(0); assertThat(updateModel.getUpdate()) - .isEqualTo(new Document("$set", new Document("items.$.documents.0.fileId", "file-id"))); + .isEqualTo(new Document("$set", new Document("items.$.documents.0.the_file_id", "file-id"))); } static class OrderTest { @@ -375,6 +375,7 @@ public class DefaultBulkOperationsUnitTests { static class OrderTestDocument { + @Field("the_file_id") private String fileId; } 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 4b6a00e26..00c4c98e7 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 @@ -968,7 +968,7 @@ public class QueryMapperUnitTests { } @Test // DATAMONGO-2502 - void shouldAllowDeeplyNestedPlaceholders() { + public void shouldAllowDeeplyNestedPlaceholders() { org.bson.Document target = mapper.getMappedObject( query(where("level0.$[some_item].arrayObj.$[other_item].nested").is("value")).getQueryObject(), @@ -978,7 +978,7 @@ public class QueryMapperUnitTests { } @Test // DATAMONGO-2502 - void shouldAllowDeeplyNestedPlaceholdersWithCustomName() { + public void shouldAllowDeeplyNestedPlaceholdersWithCustomName() { org.bson.Document target = mapper.getMappedObject( query(where("level0.$[some_item].arrayCustomName.$[other_item].nested").is("value")).getQueryObject(),