|  | 
| 15 | 15 |  */ | 
| 16 | 16 | package org.springframework.data.mongodb.core; | 
| 17 | 17 | 
 | 
| 18 |  | -import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; | 
|  | 18 | +import static org.springframework.data.mongodb.core.query.SerializationUtils.*; | 
| 19 | 19 | 
 | 
| 20 | 20 | import java.io.IOException; | 
| 21 | 21 | import java.math.BigDecimal; | 
| 22 | 22 | import java.math.RoundingMode; | 
| 23 |  | -import java.util.ArrayList; | 
| 24 |  | -import java.util.Collection; | 
| 25 |  | -import java.util.Collections; | 
| 26 |  | -import java.util.HashMap; | 
| 27 |  | -import java.util.Iterator; | 
| 28 |  | -import java.util.LinkedHashSet; | 
| 29 |  | -import java.util.List; | 
| 30 |  | -import java.util.Map; | 
| 31 |  | -import java.util.Optional; | 
| 32 |  | -import java.util.Scanner; | 
| 33 |  | -import java.util.Set; | 
|  | 23 | +import java.util.*; | 
| 34 | 24 | import java.util.concurrent.TimeUnit; | 
| 35 | 25 | import java.util.function.BiPredicate; | 
| 36 | 26 | import java.util.stream.Collectors; | 
|  | 
| 40 | 30 | import org.apache.commons.logging.LogFactory; | 
| 41 | 31 | import org.bson.Document; | 
| 42 | 32 | import org.bson.conversions.Bson; | 
| 43 |  | - | 
| 44 | 33 | import org.jspecify.annotations.Nullable; | 
|  | 34 | + | 
| 45 | 35 | import org.springframework.beans.BeansException; | 
| 46 | 36 | import org.springframework.context.ApplicationContext; | 
| 47 | 37 | import org.springframework.context.ApplicationContextAware; | 
|  | 
| 106 | 96 | import org.springframework.data.mongodb.core.mapping.MongoMappingContext; | 
| 107 | 97 | import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; | 
| 108 | 98 | import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; | 
| 109 |  | -import org.springframework.data.mongodb.core.mapping.event.AfterConvertCallback; | 
| 110 |  | -import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent; | 
| 111 |  | -import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent; | 
| 112 |  | -import org.springframework.data.mongodb.core.mapping.event.AfterLoadEvent; | 
| 113 |  | -import org.springframework.data.mongodb.core.mapping.event.AfterSaveCallback; | 
| 114 |  | -import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; | 
| 115 |  | -import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback; | 
| 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.BeforeSaveCallback; | 
| 119 |  | -import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent; | 
| 120 |  | -import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent; | 
|  | 99 | +import org.springframework.data.mongodb.core.mapping.event.*; | 
| 121 | 100 | import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions; | 
| 122 | 101 | import org.springframework.data.mongodb.core.mapreduce.MapReduceResults; | 
| 123 | 102 | import org.springframework.data.mongodb.core.query.BasicQuery; | 
|  | 
| 157 | 136 | import com.mongodb.client.MongoCursor; | 
| 158 | 137 | import com.mongodb.client.MongoDatabase; | 
| 159 | 138 | import com.mongodb.client.MongoIterable; | 
| 160 |  | -import com.mongodb.client.model.CountOptions; | 
| 161 |  | -import com.mongodb.client.model.CreateCollectionOptions; | 
| 162 |  | -import com.mongodb.client.model.CreateViewOptions; | 
| 163 |  | -import com.mongodb.client.model.DeleteOptions; | 
| 164 |  | -import com.mongodb.client.model.EstimatedDocumentCountOptions; | 
| 165 |  | -import com.mongodb.client.model.FindOneAndDeleteOptions; | 
| 166 |  | -import com.mongodb.client.model.FindOneAndReplaceOptions; | 
| 167 |  | -import com.mongodb.client.model.FindOneAndUpdateOptions; | 
| 168 |  | -import com.mongodb.client.model.ReturnDocument; | 
| 169 |  | -import com.mongodb.client.model.TimeSeriesGranularity; | 
| 170 |  | -import com.mongodb.client.model.TimeSeriesOptions; | 
| 171 |  | -import com.mongodb.client.model.UpdateOptions; | 
| 172 |  | -import com.mongodb.client.model.ValidationAction; | 
| 173 |  | -import com.mongodb.client.model.ValidationLevel; | 
| 174 |  | -import com.mongodb.client.model.ValidationOptions; | 
|  | 139 | +import com.mongodb.client.model.*; | 
| 175 | 140 | import com.mongodb.client.result.DeleteResult; | 
| 176 | 141 | import com.mongodb.client.result.UpdateResult; | 
| 177 | 142 | 
 | 
| @@ -1148,7 +1113,6 @@ public <T> T findAndModify(Query query, UpdateDefinition update, FindAndModifyOp | 
| 1148 | 1113 | 		return findAndModify(query, update, options, entityClass, collectionName, QueryResultConverter.entity()); | 
| 1149 | 1114 | 	} | 
| 1150 | 1115 | 
 | 
| 1151 |  | - | 
| 1152 | 1116 | 	<S, T> T findAndModify(Query query, UpdateDefinition update, FindAndModifyOptions options, | 
| 1153 | 1117 | 			Class<S> entityClass, String collectionName, QueryResultConverter<? super S, ? extends T> resultConverter) { | 
| 1154 | 1118 | 
 | 
| @@ -1179,7 +1143,7 @@ <S, T> T findAndModify(Query query, UpdateDefinition update, FindAndModifyOption | 
| 1179 | 1143 | 		return findAndReplace(query, replacement, options, entityType, collectionName, resultType, QueryResultConverter.entity()); | 
| 1180 | 1144 | 	} | 
| 1181 | 1145 | 
 | 
| 1182 |  | -	public <S, T, R> @Nullable R findAndReplace(Query query, S replacement, FindAndReplaceOptions options, | 
|  | 1146 | +	<S, T, R> @Nullable R findAndReplace(Query query, S replacement, FindAndReplaceOptions options, | 
| 1183 | 1147 | 			Class<S> entityType, String collectionName, Class<T> resultType, QueryResultConverter<? super T, ? extends R> resultConverter) { | 
| 1184 | 1148 | 
 | 
| 1185 | 1149 | 		Assert.notNull(query, "Query must not be null"); | 
| @@ -1207,7 +1171,6 @@ <S, T> T findAndModify(Query query, UpdateDefinition update, FindAndModifyOption | 
| 1207 | 1171 | 		maybeEmitEvent(new BeforeSaveEvent<>(replacement, mappedReplacement, collectionName)); | 
| 1208 | 1172 | 		maybeCallBeforeSave(replacement, mappedReplacement, collectionName); | 
| 1209 | 1173 | 
 | 
| 1210 |  | - | 
| 1211 | 1174 | 		R saved = doFindAndReplace(collectionPreparer, collectionName, mappedQuery, mappedFields, mappedSort, | 
| 1212 | 1175 | 				queryContext.getCollation(entityType).orElse(null), entityType, mappedReplacement, options, projection, resultConverter); | 
| 1213 | 1176 | 
 | 
| @@ -2203,25 +2166,15 @@ protected <T> List<T> doFindAndDelete(String collectionName, Query query, Class< | 
| 2203 | 2166 | 		return doFindAndDelete(collectionName, query, entityClass, QueryResultConverter.entity()); | 
| 2204 | 2167 | 	} | 
| 2205 | 2168 | 
 | 
| 2206 |  | -	protected <S,T> List<T> doFindAndDelete(String collectionName, Query query, Class<S> entityClass, QueryResultConverter<? super S, ? extends T> resultConverter) { | 
|  | 2169 | +	<S, T> List<T> doFindAndDelete(String collectionName, Query query, Class<S> entityClass, | 
|  | 2170 | +			QueryResultConverter<? super S, ? extends T> resultConverter) { | 
| 2207 | 2171 | 
 | 
| 2208 | 2172 | 		List<Object> ids = new ArrayList<>(); | 
| 2209 | 2173 | 
 | 
| 2210 |  | - | 
| 2211 |  | - | 
| 2212 |  | -//		QueryResultConverter<S,T> tmpConverter = new QueryResultConverter<S, S>() { | 
| 2213 |  | -//			@Override | 
| 2214 |  | -//			public S mapDocument(Document document, ConversionResultSupplier<S> reader) { | 
| 2215 |  | -//				ids.add(document.get("_id")); | 
| 2216 |  | -//				return reader.get(); | 
| 2217 |  | -//			} | 
| 2218 |  | -//		}.andThen(resultConverter); | 
| 2219 |  | - | 
| 2220 |  | -//		DocumentCallback<T> callback = getResultReader(EntityProjection.nonProjecting(entityClass), collectionName, tmpConverter); | 
| 2221 |  | - | 
| 2222 |  | -		QueryResultConverterCallback callback = new QueryResultConverterCallback(resultConverter, new ProjectingReadCallback<S,S>(getConverter(), EntityProjection.nonProjecting(entityClass), collectionName)) { | 
|  | 2174 | +		QueryResultConverterCallback<S, T> callback = new QueryResultConverterCallback<>(resultConverter, | 
|  | 2175 | +				new ProjectingReadCallback<>(getConverter(), EntityProjection.nonProjecting(entityClass), collectionName)) { | 
| 2223 | 2176 | 			@Override | 
| 2224 |  | -			public Object doWith(Document object) { | 
|  | 2177 | +			public T doWith(Document object) { | 
| 2225 | 2178 | 				ids.add(object.get("_id")); | 
| 2226 | 2179 | 				return super.doWith(object); | 
| 2227 | 2180 | 			} | 
| @@ -2366,7 +2319,7 @@ protected <O> Stream<O> aggregateStream(Aggregation aggregation, String collecti | 
| 2366 | 2319 | 	} | 
| 2367 | 2320 | 
 | 
| 2368 | 2321 | 	@SuppressWarnings({ "ConstantConditions", "NullAway" }) | 
| 2369 |  | -	protected <T, O> Stream<O> doAggregateStream(Aggregation aggregation, String collectionName, Class<T> outputType, | 
|  | 2322 | +	<T, O> Stream<O> doAggregateStream(Aggregation aggregation, String collectionName, Class<T> outputType, | 
| 2370 | 2323 | 			QueryResultConverter<? super T, ? extends O> resultConverter, | 
| 2371 | 2324 | 			@Nullable AggregationOperationContext context) { | 
| 2372 | 2325 | 
 | 
| @@ -2412,7 +2365,8 @@ protected <T, O> Stream<O> doAggregateStream(Aggregation aggregation, String col | 
| 2412 | 2365 | 				cursor = cursor.maxTime(options.getMaxTime().toMillis(), TimeUnit.MILLISECONDS); | 
| 2413 | 2366 | 			} | 
| 2414 | 2367 | 
 | 
| 2415 |  | -			Class<?> domainType = aggregation instanceof TypedAggregation typedAggregation ? typedAggregation.getInputType() | 
|  | 2368 | +			Class<?> domainType = aggregation instanceof TypedAggregation<?> typedAggregation | 
|  | 2369 | +					? typedAggregation.getInputType() | 
| 2416 | 2370 | 					: null; | 
| 2417 | 2371 | 
 | 
| 2418 | 2372 | 			Optionals.firstNonEmpty(options::getCollation, // | 
| @@ -2863,7 +2817,8 @@ Document getMappedValidator(Validator validator, Class<?> domainType) { | 
| 2863 | 2817 | 	} | 
| 2864 | 2818 | 
 | 
| 2865 | 2819 | 	@SuppressWarnings("ConstantConditions") | 
| 2866 |  | -	protected <S, T> @Nullable T doFindAndModify(CollectionPreparer collectionPreparer, String collectionName, | 
|  | 2820 | +	<S, T> @Nullable T doFindAndModify(CollectionPreparer<MongoCollection<Document>> collectionPreparer, | 
|  | 2821 | +			String collectionName, | 
| 2867 | 2822 | 			Document query, @Nullable Document fields, @Nullable Document sort, Class<S> entityClass, UpdateDefinition update, | 
| 2868 | 2823 | 			@Nullable FindAndModifyOptions options, QueryResultConverter<? super S, ? extends T> resultConverter) { | 
| 2869 | 2824 | 
 | 
| @@ -2911,7 +2866,8 @@ Document getMappedValidator(Validator validator, Class<?> domainType) { | 
| 2911 | 2866 | 	 *         {@literal false} and {@link FindAndReplaceOptions#isUpsert() upsert} is {@literal false}. | 
| 2912 | 2867 | 	 */ | 
| 2913 | 2868 | 	@Nullable | 
| 2914 |  | -	protected <S, T>  T doFindAndReplace(CollectionPreparer collectionPreparer, String collectionName, | 
|  | 2869 | +	protected <S, T> T doFindAndReplace(CollectionPreparer<MongoCollection<Document>> collectionPreparer, | 
|  | 2870 | +			String collectionName, | 
| 2915 | 2871 | 			Document mappedQuery, Document mappedFields, Document mappedSort, | 
| 2916 | 2872 | 			com.mongodb.client.model.@Nullable Collation collation, Class<S> entityType, Document replacement, | 
| 2917 | 2873 | 			FindAndReplaceOptions options, Class<T> resultType) { | 
| @@ -2954,7 +2910,8 @@ CollectionPreparer<MongoCollection<Document>> createCollectionPreparer(Query que | 
| 2954 | 2910 | 	 * @since 3.4 | 
| 2955 | 2911 | 	 */ | 
| 2956 | 2912 | 	@Nullable | 
| 2957 |  | -	private <S, T, R> R doFindAndReplace(CollectionPreparer collectionPreparer, String collectionName, | 
|  | 2913 | +	private <S, T, R> R doFindAndReplace(CollectionPreparer<MongoCollection<Document>> collectionPreparer, | 
|  | 2914 | +			String collectionName, | 
| 2958 | 2915 | 			Document mappedQuery, Document mappedFields, Document mappedSort, | 
| 2959 | 2916 | 			com.mongodb.client.model.@Nullable Collation collation, Class<T> entityType, Document replacement, | 
| 2960 | 2917 | 			FindAndReplaceOptions options, EntityProjection<S, T> projection, QueryResultConverter<? super S, ? extends R> resultConverter) { | 
|  | 
0 commit comments