Skip to content

Commit f7b9135

Browse files
christophstroblmp911de
authored andcommitted
Avoid multiple mapping iterations.
A 2nd pass is no longer needed as the context already does all the work. Closes: #4043 Original pull request: #4240
1 parent 6fa1800 commit f7b9135

File tree

3 files changed

+38
-32
lines changed

3 files changed

+38
-32
lines changed

spring-data-mongodb/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@
305305

306306
<dependency>
307307
<groupId>io.mockk</groupId>
308-
<artifactId>mockk</artifactId>
308+
<artifactId>mockk-jvm</artifactId>
309309
<version>${mockk}</version>
310310
<scope>test</scope>
311311
</dependency>

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

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,23 @@
1515
*/
1616
package org.springframework.data.mongodb.core;
1717

18-
import java.util.Arrays;
19-
import java.util.Collections;
2018
import java.util.List;
2119
import java.util.Optional;
2220
import java.util.stream.Collectors;
2321

2422
import org.bson.Document;
2523
import org.springframework.data.mapping.context.MappingContext;
2624
import org.springframework.data.mongodb.core.aggregation.Aggregation;
27-
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
2825
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
29-
import org.springframework.data.mongodb.core.aggregation.AggregationOptions;
3026
import org.springframework.data.mongodb.core.aggregation.AggregationOptions.DomainTypeMapping;
31-
import org.springframework.data.mongodb.core.aggregation.CountOperation;
3227
import org.springframework.data.mongodb.core.aggregation.RelaxedTypeBasedAggregationOperationContext;
3328
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
3429
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
3530
import org.springframework.data.mongodb.core.convert.QueryMapper;
3631
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
3732
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
38-
import org.springframework.data.mongodb.core.query.CriteriaDefinition;
39-
import org.springframework.data.mongodb.core.query.Query;
4033
import org.springframework.data.util.Lazy;
4134
import org.springframework.lang.Nullable;
42-
import org.springframework.util.Assert;
43-
import org.springframework.util.ObjectUtils;
4435

4536
/**
4637
* Utility methods to map {@link org.springframework.data.mongodb.core.aggregation.Aggregation} pipeline definitions and
@@ -75,21 +66,19 @@ AggregationOperationContext createAggregationContext(Aggregation aggregation, @N
7566

7667
if (!(aggregation instanceof TypedAggregation)) {
7768

78-
if(inputType == null) {
69+
if (inputType == null) {
7970
return untypedMappingContext.get();
8071
}
8172

82-
if (domainTypeMapping == DomainTypeMapping.STRICT
83-
&& !aggregation.getPipeline().containsUnionWith()) {
73+
if (domainTypeMapping == DomainTypeMapping.STRICT && !aggregation.getPipeline().containsUnionWith()) {
8474
return new TypeBasedAggregationOperationContext(inputType, mappingContext, queryMapper);
8575
}
8676

8777
return new RelaxedTypeBasedAggregationOperationContext(inputType, mappingContext, queryMapper);
8878
}
8979

9080
inputType = ((TypedAggregation<?>) aggregation).getInputType();
91-
if (domainTypeMapping == DomainTypeMapping.STRICT
92-
&& !aggregation.getPipeline().containsUnionWith()) {
81+
if (domainTypeMapping == DomainTypeMapping.STRICT && !aggregation.getPipeline().containsUnionWith()) {
9382
return new TypeBasedAggregationOperationContext(inputType, mappingContext, queryMapper);
9483
}
9584

@@ -104,12 +93,7 @@ AggregationOperationContext createAggregationContext(Aggregation aggregation, @N
10493
* @return
10594
*/
10695
List<Document> createPipeline(Aggregation aggregation, AggregationOperationContext context) {
107-
108-
if (ObjectUtils.nullSafeEquals(context, Aggregation.DEFAULT_CONTEXT)) {
109-
return aggregation.toPipeline(context);
110-
}
111-
112-
return mapAggregationPipeline(aggregation.toPipeline(context));
96+
return aggregation.toPipeline(context);
11397
}
11498

11599
/**
@@ -120,16 +104,7 @@ List<Document> createPipeline(Aggregation aggregation, AggregationOperationConte
120104
* @return
121105
*/
122106
Document createCommand(String collection, Aggregation aggregation, AggregationOperationContext context) {
123-
124-
Document command = aggregation.toDocument(collection, context);
125-
126-
if (!ObjectUtils.nullSafeEquals(context, Aggregation.DEFAULT_CONTEXT)) {
127-
return command;
128-
}
129-
130-
command.put("pipeline", mapAggregationPipeline(command.get("pipeline", List.class)));
131-
132-
return command;
107+
return aggregation.toDocument(collection, context);
133108
}
134109

135110
private List<Document> mapAggregationPipeline(List<Document> pipeline) {

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.junit.jupiter.api.BeforeEach;
4545
import org.junit.jupiter.api.Test;
4646
import org.junit.jupiter.api.extension.ExtendWith;
47-
4847
import org.springframework.core.io.ClassPathResource;
4948
import org.springframework.data.annotation.Id;
5049
import org.springframework.data.domain.Sort;
@@ -62,6 +61,7 @@
6261
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
6362
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
6463
import org.springframework.data.mongodb.core.index.GeospatialIndex;
64+
import org.springframework.data.mongodb.core.mapping.MongoId;
6565
import org.springframework.data.mongodb.core.query.Criteria;
6666
import org.springframework.data.mongodb.core.query.NearQuery;
6767
import org.springframework.data.mongodb.core.query.Query;
@@ -1943,6 +1943,25 @@ void mapsEnumsInMatchClauseUsingInCriteriaCorrectly() {
19431943
assertThat(results.getMappedResults()).hasSize(1);
19441944
}
19451945

1946+
@Test // GH-4043
1947+
void considersMongoIdWithinTypedCollections() {
1948+
1949+
UserRef userRef = new UserRef();
1950+
userRef.id = "4ee921aca44fd11b3254e001";
1951+
userRef.name = "u-1";
1952+
1953+
Widget widget = new Widget();
1954+
widget.id = "w-1";
1955+
widget.users = Collections.singletonList(userRef);
1956+
1957+
mongoTemplate.save(widget);
1958+
1959+
Criteria criteria = Criteria.where("users").elemMatch(Criteria.where("id").is("4ee921aca44fd11b3254e001"));
1960+
AggregationResults<Widget> aggregate = mongoTemplate.aggregate(newAggregation(match(criteria)), Widget.class,
1961+
Widget.class);
1962+
assertThat(aggregate.getMappedResults()).contains(widget);
1963+
}
1964+
19461965
private void createUsersWithReferencedPersons() {
19471966

19481967
mongoTemplate.dropCollection(User.class);
@@ -2266,4 +2285,16 @@ static class WithEnum {
22662285
@Id String id;
22672286
MyEnum enumValue;
22682287
}
2288+
2289+
@lombok.Data
2290+
static class Widget {
2291+
@Id String id;
2292+
List<UserRef> users;
2293+
}
2294+
2295+
@lombok.Data
2296+
static class UserRef {
2297+
@MongoId String id;
2298+
String name;
2299+
}
22692300
}

0 commit comments

Comments
 (0)