Browse Source

Polishing.

Avoid duplicate query mapping for document replacement operations when the filter query can be determined from the already mapped _id field.

See #4707
Original pull request: #4719
pull/4729/head
Mark Paluch 2 years ago
parent
commit
1f94b36baa
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
  2. 16
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java
  3. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java
  4. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java
  5. 4
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java

4
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

@ -1603,9 +1603,7 @@ public class MongoTemplate @@ -1603,9 +1603,7 @@ public class MongoTemplate
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
UpdateContext updateContext = queryOperations.replaceSingleContext(mapped, true);
Document replacement = updateContext.getMappedUpdate(entity);
Document filter = updateContext.getMappedQuery(entity);
Document filter = updateContext.getReplacementQuery();
if (updateContext.requiresShardKey(filter, entity)) {
if (entity.getShardKey().isImmutable()) {

16
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java

@ -400,7 +400,7 @@ class QueryOperations { @@ -400,7 +400,7 @@ class QueryOperations {
for (Entry<String, Object> entry : fields.entrySet()) {
if (entry.getValue()instanceof MongoExpression mongoExpression) {
if (entry.getValue() instanceof MongoExpression mongoExpression) {
AggregationOperationContext ctx = entity == null ? Aggregation.DEFAULT_CONTEXT
: new RelaxedTypeBasedAggregationOperationContext(entity.getType(), mappingContext, queryMapper);
@ -809,13 +809,23 @@ class QueryOperations { @@ -809,13 +809,23 @@ class QueryOperations {
@Override
<T> Document getMappedQuery(@Nullable MongoPersistentEntity<T> domainType) {
return applyIsolation(super.getMappedQuery(domainType));
}
Document mappedQuery = super.getMappedQuery(domainType);
/**
* A replacement query that is derived from the already {@link MappedDocument}.
*
* @return
*/
Document getReplacementQuery() {
return applyIsolation(getQueryObject());
}
private Document applyIsolation(Document mappedQuery) {
if (multi && update != null && update.isIsolated() && !mappedQuery.containsKey("$isolated")) {
mappedQuery = new Document(mappedQuery);
mappedQuery.put("$isolated", 1);
}
return mappedQuery;
}

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java

@ -1649,7 +1649,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati @@ -1649,7 +1649,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
UpdateContext updateContext = queryOperations.replaceSingleContext(mapped, true);
Document filter = updateContext.getMappedQuery(entity);
Document filter = updateContext.getReplacementQuery();
Document replacement = updateContext.getMappedUpdate(entity);
Mono<Document> deferredFilter;

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java

@ -728,7 +728,7 @@ public class QueryMapper { @@ -728,7 +728,7 @@ public class QueryMapper {
} else if (isKeyword(key)) {
resultDbo.put(key, convertIdField(documentField, entry.getValue()));
} else {
if(documentField.getProperty() != null && documentField.getProperty().isEntity()) {
if (documentField.getProperty() != null && documentField.getProperty().isEntity()) {
Field propertyField = createPropertyField(documentField.getPropertyEntity(), key, mappingContext);
resultDbo.put(key, getMappedValue(propertyField, entry.getValue()));
} else {

4
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java

@ -1416,7 +1416,7 @@ public class MongoTemplateTests { @@ -1416,7 +1416,7 @@ public class MongoTemplateTests {
id.id = Instant.now().minusSeconds(2);
id.first = "foo";
id.second = "bar";
id.time = Instant.now().minusSeconds(3);
id.id = Instant.now().minusSeconds(3);
TypeWithMyId source = new TypeWithMyId();
source.id = id;
@ -4423,7 +4423,7 @@ public class MongoTemplateTests { @@ -4423,7 +4423,7 @@ public class MongoTemplateTests {
String first;
String second;
Instant time;
Instant id;
@Field("t") Instant time;
}

Loading…
Cancel
Save