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 extends Object> 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 extends MongoPersistentEntity>, MongoPersistentProperty> mappingContext;
public KeyMapper(String key,
MappingContext extends MongoPersistentEntity>, 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(),