Skip to content

Commit 7876b92

Browse files
Move off deprecated API where possible.
See: #4990
1 parent 79570af commit 7876b92

File tree

12 files changed

+99
-64
lines changed

12 files changed

+99
-64
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
import org.springframework.data.mongodb.core.BulkOperations.BulkMode;
2727
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
2828
import org.springframework.data.mongodb.core.aggregation.AggregationUpdate;
29-
import org.springframework.data.mongodb.core.aggregation.RelaxedTypeBasedAggregationOperationContext;
29+
import org.springframework.data.mongodb.core.aggregation.FieldLookupPolicy;
30+
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
3031
import org.springframework.data.mongodb.core.convert.QueryMapper;
3132
import org.springframework.data.mongodb.core.convert.UpdateMapper;
3233
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
@@ -158,8 +159,9 @@ WriteModel<Document> mapWriteModel(Object source, WriteModel<Document> writeMode
158159
private List<Document> mapUpdatePipeline(AggregationUpdate source) {
159160

160161
Class<?> type = entity().isPresent() ? entity().map(PersistentEntity::getType).get() : Object.class;
161-
AggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext(type,
162-
updateMapper().getMappingContext(), queryMapper());
162+
163+
AggregationOperationContext context = new TypeBasedAggregationOperationContext(type,
164+
updateMapper().getMappingContext(), queryMapper(), FieldLookupPolicy.relaxed());
163165

164166
return new AggregationUtil(queryMapper(), queryMapper().getMappingContext()).createPipeline(source, context);
165167
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
import org.springframework.data.mongodb.core.aggregation.AggregationOptions;
4545
import org.springframework.data.mongodb.core.aggregation.AggregationPipeline;
4646
import org.springframework.data.mongodb.core.aggregation.AggregationUpdate;
47-
import org.springframework.data.mongodb.core.aggregation.RelaxedTypeBasedAggregationOperationContext;
47+
import org.springframework.data.mongodb.core.aggregation.FieldLookupPolicy;
4848
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
4949
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
5050
import org.springframework.data.mongodb.core.convert.QueryMapper;
@@ -407,7 +407,8 @@ private Document evaluateFields(@Nullable MongoPersistentEntity<?> entity) {
407407
if (entry.getValue() instanceof MongoExpression mongoExpression) {
408408

409409
AggregationOperationContext ctx = entity == null ? Aggregation.DEFAULT_CONTEXT
410-
: new RelaxedTypeBasedAggregationOperationContext(entity.getType(), mappingContext, queryMapper);
410+
: new TypeBasedAggregationOperationContext(entity.getType(), mappingContext, queryMapper,
411+
FieldLookupPolicy.relaxed());
411412

412413
evaluated.put(entry.getKey(), AggregationExpression.from(mongoExpression).toDocument(ctx));
413414
} else {
@@ -895,8 +896,8 @@ List<Document> getUpdatePipeline(@Nullable Class<?> domainType) {
895896

896897
Class<?> type = domainType != null ? domainType : Object.class;
897898

898-
AggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext(type, mappingContext,
899-
queryMapper);
899+
AggregationOperationContext context = new TypeBasedAggregationOperationContext(type, mappingContext, queryMapper,
900+
FieldLookupPolicy.relaxed());
900901
return aggregationUtil.createPipeline((AggregationUpdate) update, context);
901902
}
902903

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

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

18-
import static org.springframework.data.mongodb.core.query.SerializationUtils.*;
18+
import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely;
1919

2020
import reactor.core.publisher.Flux;
2121
import reactor.core.publisher.Mono;
@@ -89,8 +89,8 @@
8989
import org.springframework.data.mongodb.core.aggregation.AggregationOptions;
9090
import org.springframework.data.mongodb.core.aggregation.AggregationOptions.Builder;
9191
import org.springframework.data.mongodb.core.aggregation.AggregationPipeline;
92+
import org.springframework.data.mongodb.core.aggregation.FieldLookupPolicy;
9293
import org.springframework.data.mongodb.core.aggregation.PrefixingDelegatingAggregationOperationContext;
93-
import org.springframework.data.mongodb.core.aggregation.RelaxedTypeBasedAggregationOperationContext;
9494
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
9595
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
9696
import org.springframework.data.mongodb.core.convert.DbRefResolver;
@@ -109,7 +109,18 @@
109109
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
110110
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
111111
import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes;
112-
import org.springframework.data.mongodb.core.mapping.event.*;
112+
import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent;
113+
import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent;
114+
import org.springframework.data.mongodb.core.mapping.event.AfterLoadEvent;
115+
import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent;
116+
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
117+
import org.springframework.data.mongodb.core.mapping.event.BeforeDeleteEvent;
118+
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent;
119+
import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent;
120+
import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterConvertCallback;
121+
import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterSaveCallback;
122+
import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeConvertCallback;
123+
import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeSaveCallback;
113124
import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
114125
import org.springframework.data.mongodb.core.query.BasicQuery;
115126
import org.springframework.data.mongodb.core.query.Collation;
@@ -2120,8 +2131,8 @@ List<Document> prepareFilter(ChangeStreamOptions options) {
21202131
AggregationOperationContext context = agg instanceof TypedAggregation typedAggregation
21212132
? new TypeBasedAggregationOperationContext(typedAggregation.getInputType(),
21222133
getConverter().getMappingContext(), queryMapper)
2123-
: new RelaxedTypeBasedAggregationOperationContext(Object.class, mappingContext, queryMapper);
2124-
2134+
: new TypeBasedAggregationOperationContext(Object.class, mappingContext, queryMapper,
2135+
FieldLookupPolicy.relaxed());
21252136
return agg.toPipeline(new PrefixingDelegatingAggregationOperationContext(context, "fullDocument",
21262137
Arrays.asList("operationType", "fullDocument", "documentKey", "updateDescription", "ns")));
21272138
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ public AggregationOperationContext continueOnMissingFieldReference() {
145145
* @param type The domain type to map fields to.
146146
* @return a more relaxed {@link AggregationOperationContext}.
147147
* @since 3.1
148-
* @see RelaxedTypeBasedAggregationOperationContext
149148
*/
150149
public AggregationOperationContext continueOnMissingFieldReference(Class<?> type) {
151150
return new TypeBasedAggregationOperationContext(type, mappingContext, mapper, FieldLookupPolicy.relaxed());

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.bson.Document;
3838
import org.bson.conversions.Bson;
3939
import org.bson.types.ObjectId;
40-
import org.jspecify.annotations.NonNull;
4140
import org.jspecify.annotations.Nullable;
4241
import org.springframework.core.convert.ConversionService;
4342
import org.springframework.core.convert.converter.Converter;
@@ -57,7 +56,8 @@
5756
import org.springframework.data.mapping.model.PropertyValueProvider;
5857
import org.springframework.data.mongodb.MongoExpression;
5958
import org.springframework.data.mongodb.core.aggregation.AggregationExpression;
60-
import org.springframework.data.mongodb.core.aggregation.RelaxedTypeBasedAggregationOperationContext;
59+
import org.springframework.data.mongodb.core.aggregation.FieldLookupPolicy;
60+
import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext;
6161
import org.springframework.data.mongodb.core.convert.MappingMongoConverter.NestedDocument;
6262
import org.springframework.data.mongodb.core.convert.MongoConversionContext.OperatorContext;
6363
import org.springframework.data.mongodb.core.convert.MongoConversionContext.QueryOperatorContext;
@@ -419,7 +419,8 @@ protected Document getMappedKeyword(Keyword keyword, @Nullable MongoPersistentEn
419419
if (keyword.isSample()) {
420420

421421
Example<?> example = keyword.getValue();
422-
return exampleMapper.getMappedExample(example, entity != null ? entity : mappingContext.getRequiredPersistentEntity(example.getProbeType()));
422+
return exampleMapper.getMappedExample(example,
423+
entity != null ? entity : mappingContext.getRequiredPersistentEntity(example.getProbeType()));
423424
}
424425

425426
if (keyword.isJsonSchema()) {
@@ -558,7 +559,8 @@ protected Object convertSimpleOrDocument(Object source, @Nullable MongoPersisten
558559

559560
if (source instanceof AggregationExpression age) {
560561
return entity == null ? age.toDocument() : //
561-
age.toDocument(new RelaxedTypeBasedAggregationOperationContext(entity.getType(), this.mappingContext, this));
562+
age.toDocument(new TypeBasedAggregationOperationContext(entity.getType(), this.mappingContext, this,
563+
FieldLookupPolicy.relaxed()));
562564
}
563565

564566
if (source instanceof MongoExpression exr) {
@@ -680,7 +682,8 @@ protected Object convertAssociation(@Nullable Object source, @Nullable MongoPers
680682
MongoPersistentProperty property = documentField.getProperty();
681683

682684
OperatorContext criteriaContext = new QueryOperatorContext(
683-
isKeyword(documentField.name) ? documentField.name : "$eq", property != null ? property.getFieldName() : documentField.name);
685+
isKeyword(documentField.name) ? documentField.name : "$eq",
686+
property != null ? property.getFieldName() : documentField.name);
684687

685688
MongoConversionContext conversionContext;
686689
if (valueConverter instanceof MongoConversionContext mcc) {
@@ -694,7 +697,8 @@ protected Object convertAssociation(@Nullable Object source, @Nullable MongoPers
694697
}
695698

696699
@SuppressWarnings("NullAway")
697-
protected @Nullable Object convertValueWithConversionContext(Field documentField, @Nullable Object sourceValue, @Nullable Object value,
700+
protected @Nullable Object convertValueWithConversionContext(Field documentField, @Nullable Object sourceValue,
701+
@Nullable Object value,
698702
PropertyValueConverter<Object, Object, ValueConversionContext<MongoPersistentProperty>> valueConverter,
699703
MongoConversionContext conversionContext) {
700704

@@ -729,7 +733,7 @@ protected Object convertAssociation(@Nullable Object source, @Nullable MongoPers
729733
}
730734

731735
@Nullable
732-
@SuppressWarnings({"unchecked", "NullAway"})
736+
@SuppressWarnings({ "unchecked", "NullAway" })
733737
private Object convertIdField(Field documentField, Object source) {
734738

735739
Object value = source;

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/schema/package-info.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22
* MongoDB-specific JSON schema implementation classes.
33
*/
44
@org.jspecify.annotations.NullMarked
5-
@org.springframework.lang.NonNullFields
65
package org.springframework.data.mongodb.core.schema;

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/validation/package-info.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22
* MongoDB schema validation specifics.
33
*/
44
@org.jspecify.annotations.NullMarked
5-
@org.springframework.lang.NonNullFields
65
package org.springframework.data.mongodb.core.validation;

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@
1515
*/
1616
package org.springframework.data.mongodb.core.aggregation;
1717

18-
import static org.mockito.Mockito.*;
19-
import static org.springframework.data.domain.Sort.Direction.*;
20-
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
18+
import static org.mockito.Mockito.eq;
19+
import static org.mockito.Mockito.mock;
20+
import static org.mockito.Mockito.verify;
21+
import static org.springframework.data.domain.Sort.Direction.DESC;
22+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
23+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
24+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort;
2125

2226
import java.time.ZonedDateTime;
2327
import java.util.List;
@@ -30,7 +34,6 @@
3034
import org.junit.jupiter.params.ParameterizedTest;
3135
import org.junit.jupiter.params.provider.Arguments;
3236
import org.junit.jupiter.params.provider.MethodSource;
33-
3437
import org.springframework.data.annotation.Id;
3538
import org.springframework.data.convert.ConverterBuilder;
3639
import org.springframework.data.convert.CustomConversions;
@@ -74,8 +77,8 @@ void contextShouldCarryOnRelaxedFieldMapping() {
7477
project().and("layerOne.layerTwo.layerThree").as("layerOne.layerThree"),
7578
sort(DESC, "layerOne.layerThree.fieldA"));
7679

77-
AggregationOperationRenderer.toDocument(agg.getPipeline().getOperations(),
78-
new RelaxedTypeBasedAggregationOperationContext(TestRecord.class, ctx, new QueryMapper(mongoConverter)));
80+
AggregationOperationRenderer.toDocument(agg.getPipeline().getOperations(), new TypeBasedAggregationOperationContext(
81+
TestRecord.class, ctx, new QueryMapper(mongoConverter), FieldLookupPolicy.relaxed()));
7982
}
8083

8184
@Test // GH-4722
@@ -97,7 +100,8 @@ void appliesConversionToValuesUsedInAggregation() {
97100
);
98101

99102
List<Document> document = AggregationOperationRenderer.toDocument(agg.getPipeline().getOperations(),
100-
new RelaxedTypeBasedAggregationOperationContext(TestRecord.class, ctx, new QueryMapper(mongoConverter)));
103+
new TypeBasedAggregationOperationContext(TestRecord.class, ctx, new QueryMapper(mongoConverter),
104+
FieldLookupPolicy.relaxed()));
101105
Assertions.assertThat(document).last()
102106
.extracting(it -> it.getEmbedded(List.of("$match", "createdDate", "$lt"), Object.class))
103107
.isInstanceOf(String.class);

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

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,21 @@
1515
*/
1616
package org.springframework.data.mongodb.core.aggregation;
1717

18-
import static org.springframework.data.mongodb.core.DocumentTestUtils.*;
19-
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
20-
import static org.springframework.data.mongodb.core.query.Criteria.*;
21-
import static org.springframework.data.mongodb.test.util.Assertions.*;
18+
import static org.springframework.data.mongodb.core.DocumentTestUtils.getAsDocument;
19+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.DEFAULT_CONTEXT;
20+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.bucket;
21+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
22+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
23+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
24+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregationOptions;
25+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
26+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.replaceRoot;
27+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort;
28+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.stage;
29+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.unwind;
30+
import static org.springframework.data.mongodb.core.query.Criteria.where;
31+
import static org.springframework.data.mongodb.test.util.Assertions.assertThat;
32+
import static org.springframework.data.mongodb.test.util.Assertions.assertThatIllegalArgumentException;
2233

2334
import java.util.ArrayList;
2435
import java.util.Arrays;
@@ -146,7 +157,7 @@ void replaceRootOperationShouldBuildCorrectClause() {
146157

147158
Document agg = newAggregation( //
148159
replaceRoot().withDocument().andValue("value").as("field")) //
149-
.toDocument("foo", Aggregation.DEFAULT_CONTEXT);
160+
.toDocument("foo", Aggregation.DEFAULT_CONTEXT);
150161

151162
@SuppressWarnings("unchecked")
152163
Document unwind = ((List<Document>) agg.get("pipeline")).get(0);
@@ -599,8 +610,9 @@ void projectOnIdIsAlwaysValid() {
599610

600611
MongoMappingContext mappingContext = new MongoMappingContext();
601612
Document target = new Aggregation(bucket("start"), project("_id")).toDocument("collection-1",
602-
new RelaxedTypeBasedAggregationOperationContext(BookWithFieldAnnotation.class, mappingContext,
603-
new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext))));
613+
new TypeBasedAggregationOperationContext(BookWithFieldAnnotation.class, mappingContext,
614+
new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)),
615+
FieldLookupPolicy.relaxed()));
604616

605617
assertThat(extractPipelineElement(target, 1, "$project")).isEqualTo(Document.parse(" { \"_id\" : 1 }"));
606618
}
@@ -609,11 +621,12 @@ void projectOnIdIsAlwaysValid() {
609621
void shouldNotConvertIncludeExcludeValuesForProjectOperation() {
610622

611623
MongoMappingContext mappingContext = new MongoMappingContext();
612-
RelaxedTypeBasedAggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext(
613-
WithRetypedIdField.class, mappingContext,
614-
new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)));
624+
AggregationOperationContext context = new TypeBasedAggregationOperationContext(WithRetypedIdField.class,
625+
mappingContext, new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)),
626+
FieldLookupPolicy.relaxed());
615627
Document document = project(WithRetypedIdField.class).toDocument(context);
616-
assertThat(document).isEqualTo(new Document("$project", new Document("_id", 1).append("renamed-field", 1).append("entries", 1)));
628+
assertThat(document)
629+
.isEqualTo(new Document("$project", new Document("_id", 1).append("renamed-field", 1).append("entries", 1)));
617630
}
618631

619632
@Test // GH-4038
@@ -650,20 +663,21 @@ void inheritedFieldsExposingContextShouldNotFailOnUnknownFieldReferenceForRelaxe
650663
MongoMappingContext mappingContext = new MongoMappingContext();
651664
QueryMapper queryMapper = new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext));
652665

653-
List<Document> documents = newAggregation(City.class, aggregationOperations).toPipeline(new RelaxedTypeBasedAggregationOperationContext(City.class, mappingContext, queryMapper));
666+
List<Document> documents = newAggregation(City.class, aggregationOperations)
667+
.toPipeline(new RelaxedTypeBasedAggregationOperationContext(City.class, mappingContext, queryMapper));
654668
assertThat(documents.get(2)).isEqualTo("{ $sort : { 'serial_number' : -1, 'label_name' : -1 } }");
655669
}
656670

657671
@Test // GH-4443
658672
void fieldsExposingContextShouldUseCustomFieldNameFromRelaxedRootContext() {
659673

660674
MongoMappingContext mappingContext = new MongoMappingContext();
661-
RelaxedTypeBasedAggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext(
662-
WithRetypedIdField.class, mappingContext,
663-
new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)));
675+
AggregationOperationContext context = new TypeBasedAggregationOperationContext(WithRetypedIdField.class,
676+
mappingContext, new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)),
677+
FieldLookupPolicy.relaxed());
664678

665-
TypedAggregation<WithRetypedIdField> agg = newAggregation(WithRetypedIdField.class,
666-
unwind("entries"), match(where("foo").is("value 2")));
679+
TypedAggregation<WithRetypedIdField> agg = newAggregation(WithRetypedIdField.class, unwind("entries"),
680+
match(where("foo").is("value 2")));
667681
List<Document> pipeline = agg.toPipeline(context);
668682

669683
Document fields = getAsDocument(pipeline.get(1), "$match");
@@ -685,7 +699,8 @@ private Document extractPipelineElement(Document agg, int index, String operatio
685699

686700
public class WithRetypedIdField {
687701

688-
@Id @org.springframework.data.mongodb.core.mapping.Field private String id;
702+
@Id
703+
@org.springframework.data.mongodb.core.mapping.Field private String id;
689704

690705
@org.springframework.data.mongodb.core.mapping.Field("renamed-field") private String foo;
691706

0 commit comments

Comments
 (0)