From b1725fea0178826cec9d07972517e6c977e1a91a Mon Sep 17 00:00:00 2001 From: Tomasz Forys Date: Mon, 9 Jan 2023 12:54:51 +0100 Subject: [PATCH 1/3] Adding support for InsertManyOptions for insert and insertAll methods on ReactiveMongoTemplate and MongoTemplate Using writer on MongoTemplate.doInsertAll (which wasn't used) Closes #4252 --- .../data/mongodb/core/MongoOperations.java | 62 +++++++-- .../data/mongodb/core/MongoTemplate.java | 108 +++++++-------- .../mongodb/core/ReactiveMongoOperations.java | 83 +++++++++-- .../mongodb/core/ReactiveMongoTemplate.java | 129 +++++++++++------- .../data/mongodb/core/MongoTemplateTests.java | 125 +++++++++++------ .../mongodb/core/MongoTemplateUnitTests.java | 86 ++++++------ .../core/ReactiveMongoTemplateTests.java | 107 +++++++++++---- .../core/ReactiveMongoTemplateUnitTests.java | 88 ++++++------ 8 files changed, 482 insertions(+), 306 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java index 4727c0b8db..9109ebc732 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java @@ -15,13 +15,13 @@ */ package org.springframework.data.mongodb.core; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Supplier; -import java.util.stream.Stream; - +import com.mongodb.ClientSessionOptions; +import com.mongodb.ReadPreference; +import com.mongodb.client.ClientSession; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; import org.bson.Document; import org.springframework.data.geo.GeoResults; import org.springframework.data.mongodb.core.BulkOperations.BulkMode; @@ -47,12 +47,12 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import com.mongodb.ClientSessionOptions; -import com.mongodb.ReadPreference; -import com.mongodb.client.ClientSession; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Stream; /** * Interface that specifies a basic set of MongoDB operations. Implemented by {@link MongoTemplate}. Not often used but @@ -1371,6 +1371,19 @@ default long exactCount(Query query, String collectionName) { Collection insert(Collection batchToSave, Class entityClass); /** + * Insert a Collection of objects into a collection in a single batch write to the database with additional + * insert options. + * + * @param batchToSave the batch of objects to save. Must not be {@literal null}. + * @param entityClass class that determines the collection to use. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects that. + * @throws org.springframework.data.mapping.MappingException if the target collection name cannot be + * {@link #getCollectionName(Class) derived} from the given type. + */ + Collection insert(Collection batchToSave, Class entityClass, InsertManyOptions options); + + /** * Insert a batch of objects into the specified collection in a single batch write to the database. * * @param batchToSave the list of objects to save. Must not be {@literal null}. @@ -1379,6 +1392,17 @@ default long exactCount(Query query, String collectionName) { */ Collection insert(Collection batchToSave, String collectionName); + /** + * Insert a batch of objects into the specified collection in a single batch write to the database with additional + * insert options. + * + * @param batchToSave the list of objects to save. Must not be {@literal null}. + * @param collectionName name of the collection to store the object in. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects that. + */ + Collection insert(Collection batchToSave, String collectionName, InsertManyOptions options); + /** * Insert a mixed Collection of objects into a database collection determining the collection name to use based on the * class. @@ -1390,6 +1414,18 @@ default long exactCount(Query query, String collectionName) { */ Collection insertAll(Collection objectsToSave); + /** + * Insert a mixed Collection of objects into a database collection determining the collection name to use based on the + * class with additional insert options. + * + * @param objectsToSave the list of objects to save. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects. + * @throws org.springframework.data.mapping.MappingException if the target collection name cannot be + * {@link #getCollectionName(Class) derived} for the given objects. + */ + Collection insertAll(Collection objectsToSave, InsertManyOptions options); + /** * Save the object to the collection for the entity type of the object to save. This will perform an insert if the * object is not already present, that is an 'upsert'.
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 5d642201a5..09987b4f00 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -15,22 +15,18 @@ */ package org.springframework.data.mongodb.core; -import static org.springframework.data.mongodb.core.query.SerializationUtils.*; - -import java.io.IOException; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.function.BiPredicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - +import com.mongodb.ClientSessionOptions; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.*; +import com.mongodb.client.model.*; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.Document; import org.bson.conversions.Bson; - import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -70,16 +66,7 @@ import org.springframework.data.mongodb.core.aggregation.AggregationPipeline; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.TypedAggregation; -import org.springframework.data.mongodb.core.convert.DbRefResolver; -import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; -import org.springframework.data.mongodb.core.convert.JsonSchemaMapper; -import org.springframework.data.mongodb.core.convert.MappingMongoConverter; -import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.core.convert.MongoCustomConversions; -import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper; -import org.springframework.data.mongodb.core.convert.MongoWriter; -import org.springframework.data.mongodb.core.convert.QueryMapper; -import org.springframework.data.mongodb.core.convert.UpdateMapper; +import org.springframework.data.mongodb.core.convert.*; import org.springframework.data.mongodb.core.index.IndexOperations; import org.springframework.data.mongodb.core.index.IndexOperationsProvider; import org.springframework.data.mongodb.core.index.MongoMappingEventPublisher; @@ -113,23 +100,16 @@ import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; -import com.mongodb.ClientSessionOptions; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.AggregateIterable; -import com.mongodb.client.ClientSession; -import com.mongodb.client.DistinctIterable; -import com.mongodb.client.FindIterable; -import com.mongodb.client.MapReduceIterable; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.MongoDatabase; -import com.mongodb.client.MongoIterable; -import com.mongodb.client.model.*; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; /** * Primary implementation of {@link MongoOperations}. @@ -159,6 +139,7 @@ * @author Yadhukrishna S Pai * @author Anton Barkan * @author Bartłomiej Mazur + * @author Tomasz Forys */ public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider { @@ -1250,34 +1231,44 @@ protected T doInsert(String collectionName, T objectToSave, MongoWriter w } @Override - @SuppressWarnings("unchecked") public Collection insert(Collection batchToSave, Class entityClass) { + return insert(batchToSave, getCollectionName(entityClass)); + } - Assert.notNull(batchToSave, "BatchToSave must not be null"); + @Override + public Collection insert(Collection batchToSave, Class entityClass, InsertManyOptions options) { + return insert(batchToSave, getCollectionName(entityClass), options); + } - return (Collection) doInsertBatch(getCollectionName(entityClass), batchToSave, this.mongoConverter); + @Override + public Collection insert(Collection batchToSave, String collectionName) { + return insert(batchToSave, collectionName, new InsertManyOptions()); } @Override @SuppressWarnings("unchecked") - public Collection insert(Collection batchToSave, String collectionName) { + public Collection insert(Collection batchToSave, String collectionName, InsertManyOptions options) { Assert.notNull(batchToSave, "BatchToSave must not be null"); Assert.notNull(collectionName, "CollectionName must not be null"); - return (Collection) doInsertBatch(collectionName, batchToSave, this.mongoConverter); + return (Collection) doInsertBatch(collectionName, batchToSave, this.mongoConverter, options); } @Override - @SuppressWarnings("unchecked") public Collection insertAll(Collection objectsToSave) { + return insertAll(objectsToSave, new InsertManyOptions()); + } + + @Override + @SuppressWarnings("unchecked") + public Collection insertAll(Collection objectsToSave, InsertManyOptions options) { Assert.notNull(objectsToSave, "ObjectsToSave must not be null"); - return (Collection) doInsertAll(objectsToSave, this.mongoConverter); + return (Collection) doInsertAll(objectsToSave, this.mongoConverter, options); } - @SuppressWarnings("unchecked") - protected Collection doInsertAll(Collection listToSave, MongoWriter writer) { + protected Collection doInsertAll(Collection listToSave, MongoWriter writer, InsertManyOptions options) { Map> elementsByCollection = new HashMap<>(); List savedObjects = new ArrayList<>(listToSave.size()); @@ -1289,27 +1280,22 @@ protected Collection doInsertAll(Collection listToSave, Mong } String collection = getCollectionName(ClassUtils.getUserClass(element)); - List collectionElements = elementsByCollection.get(collection); - - if (null == collectionElements) { - collectionElements = new ArrayList<>(); - elementsByCollection.put(collection, collectionElements); - } - + List collectionElements = elementsByCollection.computeIfAbsent(collection, k -> new ArrayList<>()); collectionElements.add(element); } for (Map.Entry> entry : elementsByCollection.entrySet()) { - savedObjects.addAll((Collection) doInsertBatch(entry.getKey(), entry.getValue(), this.mongoConverter)); + savedObjects.addAll(doInsertBatch(entry.getKey(), entry.getValue(), writer, options)); } return savedObjects; } protected Collection doInsertBatch(String collectionName, Collection batchToSave, - MongoWriter writer) { + MongoWriter writer, InsertManyOptions options) { Assert.notNull(writer, "MongoWriter must not be null"); + Assert.notNull(options, "InsertManyOptions must not be null"); List documentList = new ArrayList<>(batchToSave.size()); List initializedBatchToSave = new ArrayList<>(batchToSave.size()); @@ -1331,7 +1317,7 @@ protected Collection doInsertBatch(String collectionName, Collection ids = insertDocumentList(collectionName, documentList); + List ids = insertDocumentList(collectionName, documentList, options); List savedObjects = new ArrayList<>(documentList.size()); int i = 0; @@ -1461,7 +1447,7 @@ protected Object insertDocument(String collectionName, Document document, Class< }); } - protected List insertDocumentList(String collectionName, List documents) { + protected List insertDocumentList(String collectionName, List documents, InsertManyOptions options) { if (documents.isEmpty()) { return Collections.emptyList(); @@ -1478,9 +1464,9 @@ protected List insertDocumentList(String collectionName, List WriteConcern writeConcernToUse = prepareWriteConcern(mongoAction); if (writeConcernToUse == null) { - collection.insertMany(documents); + collection.insertMany(documents, options); } else { - collection.withWriteConcern(writeConcernToUse).insertMany(documents); + collection.withWriteConcern(writeConcernToUse).insertMany(documents, options); } return null; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java index 323ca9dd95..b60ee2be91 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java @@ -15,17 +15,16 @@ */ package org.springframework.data.mongodb.core; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.Collection; -import java.util.function.Consumer; -import java.util.function.Supplier; - +import com.mongodb.ClientSessionOptions; +import com.mongodb.ReadPreference; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.reactivestreams.client.ClientSession; +import com.mongodb.reactivestreams.client.MongoCollection; import org.bson.Document; import org.reactivestreams.Publisher; import org.reactivestreams.Subscription; - import org.springframework.data.geo.GeoResult; import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.aggregation.Aggregation; @@ -47,13 +46,12 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; -import com.mongodb.ClientSessionOptions; -import com.mongodb.ReadPreference; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.reactivestreams.client.ClientSession; -import com.mongodb.reactivestreams.client.MongoCollection; +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Supplier; /** * Interface that specifies a basic set of MongoDB operations executed in a reactive way. @@ -68,6 +66,7 @@ * @author Mark Paluch * @author Christoph Strobl * @author Mathieu Ouellet + * @author Tomasz Forys * @since 2.0 * @see Flux * @see Mono @@ -1146,6 +1145,16 @@ default Mono exactCount(Query query, String collectionName) { */ Flux insert(Collection batchToSave, String collectionName); + /** + * Insert a batch of objects into the specified collection in a single batch write to the database with additional + * insert options. + * + * @param batchToSave the list of objects to save. Must not be {@literal null}. + * @param collectionName name of the collection to store the object in. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects. + */ + Flux insert(Collection batchToSave, String collectionName, InsertManyOptions options); /** * Insert a mixed Collection of objects into a database collection determining the collection name to use based on the * class. @@ -1157,6 +1166,52 @@ default Mono exactCount(Query query, String collectionName) { */ Flux insertAll(Collection objectsToSave); + /** + * Insert a mixed Collection of objects into a database collection determining the collection name to use based on the + * class with additional insert options. + * + * @param objectsToSave the list of objects to save. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the saved objects. + * @throws org.springframework.data.mapping.MappingException if the target collection name cannot be + * {@link #getCollectionName(Class) derived} for the given objects. + */ + Flux insertAll(Collection objectsToSave, InsertManyOptions options); + + /** + * Insert a mixed Collection of objects into a database collection determining the collection name to use based on the + * class with additional insert options. + * + * @param objectsToSave the publisher which provides objects to save. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects. + */ + Flux insertAll(Mono> objectsToSave, InsertManyOptions options); + + /** + * Insert a Collection of objects into a collection in a single batch write to the database with additional + * insert options. + * + * @param batchToSave the publisher which provides objects to save. Must not be {@literal null}. + * @param entityClass class that determines the collection to use. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects. + * @throws org.springframework.data.mapping.MappingException if the target collection name cannot be + * {@link #getCollectionName(Class) derived} for the type. + */ + Flux insertAll(Mono> batchToSave, Class entityClass, InsertManyOptions options); + + /** + * Insert objects into the specified collection in a single batch write to the database with additional insert + * options. + * + * @param batchToSave the publisher which provides objects to save. Must not be {@literal null}. + * @param collectionName name of the collection to store the object in. Must not be {@literal null}. + * @param options options for insert many operation. Must not be {@literal null}. + * @return the inserted objects. + */ + Flux insertAll(Mono> batchToSave, String collectionName, InsertManyOptions options); + /** * Insert the object into the collection for the entity type of the object to save.
* The object is converted to the MongoDB native representation using an instance of {@see MongoConverter}.
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index 1f7c015fd1..db03d3c7aa 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -15,29 +15,25 @@ */ package org.springframework.data.mongodb.core; -import static org.springframework.data.mongodb.core.query.SerializationUtils.*; - -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.util.function.Tuple2; -import reactor.util.function.Tuples; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.function.BiFunction; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - +import com.mongodb.ClientSessionOptions; +import com.mongodb.CursorType; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.model.*; +import com.mongodb.client.model.changestream.FullDocument; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.InsertOneResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.reactivestreams.client.AggregatePublisher; +import com.mongodb.reactivestreams.client.ChangeStreamPublisher; +import com.mongodb.reactivestreams.client.ClientSession; +import com.mongodb.reactivestreams.client.DistinctPublisher; +import com.mongodb.reactivestreams.client.FindPublisher; +import com.mongodb.reactivestreams.client.MapReducePublisher; +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoCollection; +import com.mongodb.reactivestreams.client.MongoDatabase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.BsonValue; @@ -121,26 +117,28 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; -import com.mongodb.ClientSessionOptions; -import com.mongodb.CursorType; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.model.*; -import com.mongodb.client.model.changestream.FullDocument; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.InsertOneResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.reactivestreams.client.AggregatePublisher; -import com.mongodb.reactivestreams.client.ChangeStreamPublisher; -import com.mongodb.reactivestreams.client.ClientSession; -import com.mongodb.reactivestreams.client.DistinctPublisher; -import com.mongodb.reactivestreams.client.FindPublisher; -import com.mongodb.reactivestreams.client.MapReducePublisher; -import com.mongodb.reactivestreams.client.MongoClient; -import com.mongodb.reactivestreams.client.MongoCollection; -import com.mongodb.reactivestreams.client.MongoDatabase; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; /** * Primary implementation of {@link ReactiveMongoOperations}. It simplifies the use of Reactive MongoDB usage and helps @@ -157,6 +155,7 @@ * @author Roman Puchkovskiy * @author Mathieu Ouellet * @author Yadhukrishna S Pai + * @author Tomasz Forys * @since 2.0 */ public class ReactiveMongoTemplate implements ReactiveMongoOperations, ApplicationContextAware { @@ -1207,12 +1206,22 @@ public Flux insertAll(Mono> batchToSave return insertAll(batchToSave, getCollectionName(entityClass)); } + @Override + public Flux insertAll(Mono> batchToSave, Class entityClass, InsertManyOptions options) { + return insertAll(batchToSave, getCollectionName(entityClass), options); + } + @Override public Flux insertAll(Mono> batchToSave, String collectionName) { + return insertAll(batchToSave, collectionName, new InsertManyOptions()); + } + + @Override + public Flux insertAll(Mono> batchToSave, String collectionName, InsertManyOptions options) { Assert.notNull(batchToSave, "Batch to insert must not be null"); - return Flux.from(batchToSave).flatMap(collection -> insert(collection, collectionName)); + return Flux.from(batchToSave).flatMap(collection -> insert(collection, collectionName, options)); } @Override @@ -1265,17 +1274,32 @@ protected Mono doInsert(String collectionName, T objectToSave, MongoWrite @Override public Flux insert(Collection batchToSave, Class entityClass) { - return doInsertBatch(getCollectionName(entityClass), batchToSave, this.mongoConverter); + return insert(batchToSave, getCollectionName(entityClass)); } @Override public Flux insert(Collection batchToSave, String collectionName) { - return doInsertBatch(collectionName, batchToSave, this.mongoConverter); + return insert(batchToSave, collectionName, new InsertManyOptions()); + } + + @Override + public Flux insert(Collection batchToSave, String collectionName, InsertManyOptions options) { + return doInsertBatch(collectionName, batchToSave, this.mongoConverter, options); + } + + @Override + public Flux insertAll(Collection objectsToSave, InsertManyOptions options) { + return doInsertAll(objectsToSave, this.mongoConverter, options); + } + + @Override + public Flux insertAll(Mono> objectsToSave, InsertManyOptions options) { + return Flux.from(objectsToSave).flatMap(collection -> insertAll(collection, options)); } @Override public Flux insertAll(Collection objectsToSave) { - return doInsertAll(objectsToSave, this.mongoConverter); + return doInsertAll(objectsToSave, this.mongoConverter, new InsertManyOptions()); } @Override @@ -1283,7 +1307,7 @@ public Flux insertAll(Mono> objectsToSa return Flux.from(objectsToSave).flatMap(this::insertAll); } - protected Flux doInsertAll(Collection listToSave, MongoWriter writer) { + protected Flux doInsertAll(Collection listToSave, MongoWriter writer, InsertManyOptions insertManyOptions) { Map> elementsByCollection = new HashMap<>(); @@ -1296,13 +1320,14 @@ protected Flux doInsertAll(Collection listToSave, MongoWrite }); return Flux.fromIterable(elementsByCollection.keySet()) - .flatMap(collectionName -> doInsertBatch(collectionName, elementsByCollection.get(collectionName), writer)); + .flatMap(collectionName -> doInsertBatch(collectionName, elementsByCollection.get(collectionName), writer, insertManyOptions)); } protected Flux doInsertBatch(String collectionName, Collection batchToSave, - MongoWriter writer) { + MongoWriter writer, InsertManyOptions options) { Assert.notNull(writer, "MongoWriter must not be null"); + Assert.notNull(options, "InsertManyOptions must not be null"); Mono, Document>>> prepareDocuments = Flux.fromIterable(batchToSave) .flatMap(uninitialized -> { @@ -1328,7 +1353,7 @@ protected Flux doInsertBatch(String collectionName, Collection documents = tuples.stream().map(Tuple2::getT2).collect(Collectors.toList()); - return insertDocumentList(collectionName, documents).thenMany(Flux.fromIterable(tuples)); + return insertDocumentList(collectionName, documents, options).thenMany(Flux.fromIterable(tuples)); }); return insertDocuments.flatMap(tuple -> { @@ -1465,7 +1490,7 @@ protected Mono insertDocument(String collectionName, Document dbDoc, Cla return Flux.from(execute).last().map(success -> document.getId()); } - protected Flux insertDocumentList(String collectionName, List dbDocList) { + protected Flux insertDocumentList(String collectionName, List dbDocList, InsertManyOptions options) { if (dbDocList.isEmpty()) { return Flux.empty(); @@ -1486,7 +1511,7 @@ protected Flux insertDocumentList(String collectionName, List { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 30978bce96..39c223bd54 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -15,11 +15,22 @@ */ package org.springframework.data.mongodb.core; -import static org.assertj.core.api.Assertions.*; -import static org.springframework.data.mongodb.core.query.Criteria.*; -import static org.springframework.data.mongodb.core.query.Query.*; -import static org.springframework.data.mongodb.core.query.Update.*; - +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.DBRef; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.FindIterable; +import com.mongodb.client.ListIndexesIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,26 +38,10 @@ import lombok.RequiredArgsConstructor; import lombok.Value; import lombok.With; - -import java.lang.reflect.InvocationTargetException; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.temporal.ChronoUnit; -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - import org.bson.types.ObjectId; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; - import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.convert.converter.Converter; @@ -93,21 +88,24 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import com.mongodb.BasicDBObject; -import com.mongodb.DBObject; -import com.mongodb.DBRef; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.FindIterable; -import com.mongodb.client.ListIndexesIterable; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.model.Filters; -import com.mongodb.client.model.IndexOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.mongodb.core.query.Criteria.where; +import static org.springframework.data.mongodb.core.query.Query.query; +import static org.springframework.data.mongodb.core.query.Update.update; /** * Integration test for {@link MongoTemplate}. @@ -122,6 +120,7 @@ * @author Mark Paluch * @author Laszlo Csontos * @author duozhilin + * @author Tomasz Forys */ @ExtendWith(MongoClientExtension.class) public class MongoTemplateTests { @@ -287,16 +286,56 @@ public void rejectsDuplicateIdInInsertAll() { MongoTemplate template = new MongoTemplate(factory); template.setWriteResultChecking(WriteResultChecking.EXCEPTION); - ObjectId id = new ObjectId(); - Person person = new Person(id, "Amol"); - person.setAge(28); + ObjectId duplicatedId = new ObjectId(); + Person first = new Person(duplicatedId, "Amol"); + first.setAge(28); + Person second = new Person(duplicatedId, "Bmol"); + first.setAge(29); + Person uniquePerson = new Person("Cmol", 30); + + assertThatExceptionOfType(DataIntegrityViolationException.class) + .isThrownBy(() -> template.insertAll(Arrays.asList(first, second, uniquePerson))) + .withMessageContaining("E11000 duplicate key error"); + + Query query = new Query(where("firstName").is(uniquePerson.getFirstName())); + Person found = template.findOne(query, Person.class); + assertThat(found).isNull(); + } + + @Test + public void storeCorrectObjectsOnInsertAllWithInsertManyOptionsAndUniqueViolation() { + + MongoTemplate template = new MongoTemplate(factory); + template.setWriteResultChecking(WriteResultChecking.EXCEPTION); - List records = new ArrayList<>(); - records.add(person); - records.add(person); + ObjectId duplicatedId = new ObjectId(); + Person first = new Person(duplicatedId, "Amol"); + first.setAge(28); + Person second = new Person(duplicatedId, "Bmol"); + first.setAge(29); + Person uniquePerson = new Person("Cmol", 30); - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> template.insertAll(records)) + assertThatExceptionOfType(DataIntegrityViolationException.class) + .isThrownBy(() -> template.insertAll(Arrays.asList(first, second, uniquePerson), new InsertManyOptions().ordered(false))) .withMessageContaining("E11000 duplicate key error"); + + Query query = new Query(where("firstName").is(uniquePerson.getFirstName())); + Person found = template.findOne(query, Person.class); + assertThat(found).isNotNull(); + assertThat(found.getAge()).isEqualTo(30); + } + + @Test + void testNullInsertManyOptionsValidation() { + + MongoTemplate template = new MongoTemplate(factory); + template.setWriteResultChecking(WriteResultChecking.EXCEPTION); + + Person person = new Person("Amol", 30); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> template.insertAll(Arrays.asList(person), null)) + .withMessageContaining("InsertManyOptions must not be null"); } @Test // DATAMONGO-1687 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index 770819ac0a..58fa26b960 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -15,29 +15,27 @@ */ package org.springframework.data.mongodb.core; -import static org.mockito.Mockito.*; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; -import static org.springframework.data.mongodb.test.util.Assertions.*; - +import com.mongodb.MongoClientSettings; +import com.mongodb.MongoException; +import com.mongodb.MongoNamespace; +import com.mongodb.ReadPreference; +import com.mongodb.ServerAddress; +import com.mongodb.ServerCursor; +import com.mongodb.WriteConcern; +import com.mongodb.client.AggregateIterable; +import com.mongodb.client.DistinctIterable; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MapReduceIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.*; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; - -import java.math.BigInteger; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; - import org.assertj.core.api.Assertions; import org.bson.Document; import org.bson.conversions.Bson; @@ -105,33 +103,24 @@ import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.CollectionUtils; -import com.mongodb.MongoClientSettings; -import com.mongodb.MongoException; -import com.mongodb.MongoNamespace; -import com.mongodb.ReadPreference; -import com.mongodb.ServerAddress; -import com.mongodb.ServerCursor; -import com.mongodb.WriteConcern; -import com.mongodb.client.AggregateIterable; -import com.mongodb.client.DistinctIterable; -import com.mongodb.client.FindIterable; -import com.mongodb.client.MapReduceIterable; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.MongoDatabase; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.CreateCollectionOptions; -import com.mongodb.client.model.DeleteOptions; -import com.mongodb.client.model.FindOneAndDeleteOptions; -import com.mongodb.client.model.FindOneAndReplaceOptions; -import com.mongodb.client.model.FindOneAndUpdateOptions; -import com.mongodb.client.model.MapReduceAction; -import com.mongodb.client.model.ReplaceOptions; -import com.mongodb.client.model.TimeSeriesGranularity; -import com.mongodb.client.model.UpdateOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import java.math.BigInteger; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +import static org.mockito.Mockito.*; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; +import static org.springframework.data.mongodb.test.util.Assertions.*; /** * Unit tests for {@link MongoTemplate}. @@ -2174,7 +2163,8 @@ void insertAllShouldInvokeAfterSaveCallbacks() { Collection saved = template.insertAll(Arrays.asList(entity1, entity2)); verify(afterSaveCallback, times(2)).onAfterSave(any(), any(), anyString()); - assertThat(saved.iterator().next().getId()).isEqualTo("after-save"); + assertThat(saved).hasSize(2); + assertThat(saved).map(e -> e.getId()).containsExactly("after-save", "after-save"); } @Test // DATAMONGO-2479 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java index 6ca3808c9a..3bfb2bdf38 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java @@ -15,34 +15,13 @@ */ package org.springframework.data.mongodb.core; -import static org.assertj.core.api.Assertions.*; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; -import static org.springframework.data.mongodb.core.query.Criteria.*; -import static org.springframework.data.mongodb.core.query.Query.*; - +import com.mongodb.WriteConcern; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.reactivestreams.client.MongoClient; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Wither; -import reactor.core.Disposable; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -import java.time.Duration; -import java.time.Instant; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - import org.bson.BsonDocument; import org.bson.BsonTimestamp; import org.bson.Document; @@ -84,15 +63,38 @@ import org.springframework.data.mongodb.test.util.MongoClientExtension; import org.springframework.data.mongodb.test.util.MongoServerCondition; import org.springframework.data.mongodb.test.util.ReactiveMongoTestTemplate; +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; -import com.mongodb.WriteConcern; -import com.mongodb.reactivestreams.client.MongoClient; +import java.time.Duration; +import java.time.Instant; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static java.util.List.of; +import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.match; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; +import static org.springframework.data.mongodb.core.query.Criteria.where; +import static org.springframework.data.mongodb.core.query.Query.query; /** * Integration test for {@link MongoTemplate}. * * @author Mark Paluch * @author Christoph Strobl + * @author Tomasz Forys */ @ExtendWith({ MongoClientExtension.class, MongoServerCondition.class }) public class ReactiveMongoTemplateTests { @@ -537,13 +539,58 @@ void rejectsDuplicateIdInInsertAll() { ReactiveMongoTemplate template = new ReactiveMongoTemplate(factory); template.setWriteResultChecking(WriteResultChecking.EXCEPTION); - ObjectId id = new ObjectId(); - Person person = new Person(id, "Amol"); - person.setAge(28); + ObjectId duplicatedId = new ObjectId(); + Person first = new Person(duplicatedId, "Amol"); + first.setAge(28); + Person second = new Person(duplicatedId, "Bmol"); + first.setAge(29); + Person uniquePerson = new Person("Cmol", 30); + + template.insertAll(of(first, second, uniquePerson)) // + .as(StepVerifier::create) // + .verifyError(DataIntegrityViolationException.class); + + Query query = new Query(where("firstName").is(uniquePerson.getFirstName())); + Person found = template.findOne(query, Person.class).block(); + assertThat(found).isNull(); + } + + @Test + void storeCorrectObjectsOnInsertAllWithInsertManyOptionsAndUniqueViolation() { - template.insertAll(Arrays.asList(person, person)) // + ReactiveMongoTemplate template = new ReactiveMongoTemplate(factory); + template.setWriteResultChecking(WriteResultChecking.EXCEPTION); + + ObjectId duplicatedId = new ObjectId(); + Person first = new Person(duplicatedId, "Amol"); + first.setAge(28); + Person second = new Person(duplicatedId, "Bmol"); + first.setAge(29); + Person uniquePerson = new Person("Cmol", 30); + + template.insertAll(of(first, second, uniquePerson), new InsertManyOptions().ordered(false)) // .as(StepVerifier::create) // .verifyError(DataIntegrityViolationException.class); + + Query query = new Query(where("firstName").is(uniquePerson.getFirstName())); + Person found = template.findOne(query, Person.class).block(); + assertThat(found).isNotNull(); + assertThat(found.getAge()).isEqualTo(30); + } + + @Test + void testNullInsertManyOptionsValidation() { + + ReactiveMongoTemplate template = new ReactiveMongoTemplate(factory); + template.setWriteResultChecking(WriteResultChecking.EXCEPTION); + + Person person = new Person("Amol", 30); + + template.insertAll(of(person), null) // + .as(StepVerifier::create) // + .verifyErrorSatisfies(error -> + assertThat(error).isInstanceOf(IllegalArgumentException.class) + .hasMessage("InsertManyOptions must not be null")); } @Test // DATAMONGO-1444 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java index 2f9ce1ac87..143bc153b4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java @@ -15,29 +15,32 @@ */ package org.springframework.data.mongodb.core; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; -import static org.springframework.data.mongodb.test.util.Assertions.assertThat; - +import com.mongodb.MongoClientSettings; +import com.mongodb.ReadPreference; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.CreateCollectionOptions; +import com.mongodb.client.model.DeleteOptions; +import com.mongodb.client.model.FindOneAndDeleteOptions; +import com.mongodb.client.model.FindOneAndReplaceOptions; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.ReplaceOptions; +import com.mongodb.client.model.TimeSeriesGranularity; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.InsertManyResult; +import com.mongodb.client.result.InsertOneResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.reactivestreams.client.AggregatePublisher; +import com.mongodb.reactivestreams.client.ChangeStreamPublisher; +import com.mongodb.reactivestreams.client.DistinctPublisher; +import com.mongodb.reactivestreams.client.FindPublisher; +import com.mongodb.reactivestreams.client.MapReducePublisher; +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoCollection; +import com.mongodb.reactivestreams.client.MongoDatabase; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - import org.assertj.core.api.Assertions; import org.bson.BsonDocument; import org.bson.BsonString; @@ -54,7 +57,6 @@ import org.mockito.quality.Strictness; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; - import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; @@ -96,30 +98,26 @@ import org.springframework.lang.Nullable; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.CollectionUtils; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; -import com.mongodb.MongoClientSettings; -import com.mongodb.ReadPreference; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.CreateCollectionOptions; -import com.mongodb.client.model.DeleteOptions; -import com.mongodb.client.model.FindOneAndDeleteOptions; -import com.mongodb.client.model.FindOneAndReplaceOptions; -import com.mongodb.client.model.FindOneAndUpdateOptions; -import com.mongodb.client.model.ReplaceOptions; -import com.mongodb.client.model.TimeSeriesGranularity; -import com.mongodb.client.model.UpdateOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.InsertManyResult; -import com.mongodb.client.result.InsertOneResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.reactivestreams.client.AggregatePublisher; -import com.mongodb.reactivestreams.client.ChangeStreamPublisher; -import com.mongodb.reactivestreams.client.DistinctPublisher; -import com.mongodb.reactivestreams.client.FindPublisher; -import com.mongodb.reactivestreams.client.MapReducePublisher; -import com.mongodb.reactivestreams.client.MongoClient; -import com.mongodb.reactivestreams.client.MongoCollection; -import com.mongodb.reactivestreams.client.MongoDatabase; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.mockito.Mockito.*; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; +import static org.springframework.data.mongodb.test.util.Assertions.assertThat; /** * Unit tests for {@link ReactiveMongoTemplate}. @@ -1359,7 +1357,7 @@ void insertAllShouldInvokeAfterSaveCallbacks() { entity1.id = "2"; entity1.firstname = "luke"; - when(collection.insertMany(anyList())).then(invocation -> { + when(collection.insertMany(anyList(), any())).then(invocation -> { List list = invocation.getArgument(0); return Flux.fromIterable(list).map(i -> mock(InsertManyResult.class)); }); From 351508548a824b00e9cc00c5c3dfa7ffef2e0b0e Mon Sep 17 00:00:00 2001 From: Tomasz Forys Date: Mon, 16 Jan 2023 14:06:01 +0100 Subject: [PATCH 2/3] Imports cleanup Closes #4252 --- .../data/mongodb/core/MongoOperations.java | 27 +++--- .../data/mongodb/core/MongoTemplate.java | 58 +++++++++---- .../mongodb/core/ReactiveMongoOperations.java | 27 +++--- .../mongodb/core/ReactiveMongoTemplate.java | 82 +++++++++--------- .../data/mongodb/core/MongoTemplateTests.java | 71 +++++++-------- .../mongodb/core/MongoTemplateUnitTests.java | 83 ++++++++++-------- .../core/ReactiveMongoTemplateTests.java | 60 ++++++------- .../core/ReactiveMongoTemplateUnitTests.java | 86 ++++++++++--------- 8 files changed, 268 insertions(+), 226 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java index 9109ebc732..91f429170f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java @@ -15,13 +15,13 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.ClientSessionOptions; -import com.mongodb.ReadPreference; -import com.mongodb.client.ClientSession; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.InsertManyOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Stream; + import org.bson.Document; import org.springframework.data.geo.GeoResults; import org.springframework.data.mongodb.core.BulkOperations.BulkMode; @@ -47,12 +47,13 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Supplier; -import java.util.stream.Stream; +import com.mongodb.ClientSessionOptions; +import com.mongodb.ReadPreference; +import com.mongodb.client.ClientSession; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; /** * Interface that specifies a basic set of MongoDB operations. Implemented by {@link MongoTemplate}. Not often used but diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 09987b4f00..3c26bc1b2b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -15,18 +15,22 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.ClientSessionOptions; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.*; -import com.mongodb.client.model.*; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import static org.springframework.data.mongodb.core.query.SerializationUtils.*; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.Document; import org.bson.conversions.Bson; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -66,7 +70,16 @@ import org.springframework.data.mongodb.core.aggregation.AggregationPipeline; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.TypedAggregation; -import org.springframework.data.mongodb.core.convert.*; +import org.springframework.data.mongodb.core.convert.DbRefResolver; +import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; +import org.springframework.data.mongodb.core.convert.JsonSchemaMapper; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; +import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper; +import org.springframework.data.mongodb.core.convert.MongoWriter; +import org.springframework.data.mongodb.core.convert.QueryMapper; +import org.springframework.data.mongodb.core.convert.UpdateMapper; import org.springframework.data.mongodb.core.index.IndexOperations; import org.springframework.data.mongodb.core.index.IndexOperationsProvider; import org.springframework.data.mongodb.core.index.MongoMappingEventPublisher; @@ -100,16 +113,23 @@ import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; -import java.io.IOException; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.function.BiPredicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; +import com.mongodb.ClientSessionOptions; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.AggregateIterable; +import com.mongodb.client.ClientSession; +import com.mongodb.client.DistinctIterable; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MapReduceIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; +import com.mongodb.client.model.*; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; /** * Primary implementation of {@link MongoOperations}. diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java index b60ee2be91..8f511262a2 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java @@ -15,16 +15,17 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.ClientSessionOptions; -import com.mongodb.ReadPreference; -import com.mongodb.client.model.InsertManyOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.reactivestreams.client.ClientSession; -import com.mongodb.reactivestreams.client.MongoCollection; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Supplier; + import org.bson.Document; import org.reactivestreams.Publisher; import org.reactivestreams.Subscription; + import org.springframework.data.geo.GeoResult; import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.aggregation.Aggregation; @@ -46,12 +47,14 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import java.util.Collection; -import java.util.function.Consumer; -import java.util.function.Supplier; +import com.mongodb.ClientSessionOptions; +import com.mongodb.ReadPreference; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.reactivestreams.client.ClientSession; +import com.mongodb.reactivestreams.client.MongoCollection; /** * Interface that specifies a basic set of MongoDB operations executed in a reactive way. diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index db03d3c7aa..6368431336 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -15,25 +15,29 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.ClientSessionOptions; -import com.mongodb.CursorType; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.model.*; -import com.mongodb.client.model.changestream.FullDocument; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.InsertOneResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.reactivestreams.client.AggregatePublisher; -import com.mongodb.reactivestreams.client.ChangeStreamPublisher; -import com.mongodb.reactivestreams.client.ClientSession; -import com.mongodb.reactivestreams.client.DistinctPublisher; -import com.mongodb.reactivestreams.client.FindPublisher; -import com.mongodb.reactivestreams.client.MapReducePublisher; -import com.mongodb.reactivestreams.client.MongoClient; -import com.mongodb.reactivestreams.client.MongoCollection; -import com.mongodb.reactivestreams.client.MongoDatabase; +import static org.springframework.data.mongodb.core.query.SerializationUtils.*; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.BsonValue; @@ -117,28 +121,26 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.util.function.Tuple2; -import reactor.util.function.Tuples; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.function.BiFunction; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; -import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; +import com.mongodb.ClientSessionOptions; +import com.mongodb.CursorType; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.model.*; +import com.mongodb.client.model.changestream.FullDocument; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.InsertOneResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.reactivestreams.client.AggregatePublisher; +import com.mongodb.reactivestreams.client.ChangeStreamPublisher; +import com.mongodb.reactivestreams.client.ClientSession; +import com.mongodb.reactivestreams.client.DistinctPublisher; +import com.mongodb.reactivestreams.client.FindPublisher; +import com.mongodb.reactivestreams.client.MapReducePublisher; +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoCollection; +import com.mongodb.reactivestreams.client.MongoDatabase; /** * Primary implementation of {@link ReactiveMongoOperations}. It simplifies the use of Reactive MongoDB usage and helps diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 39c223bd54..1f6d56d53b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -15,22 +15,11 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.BasicDBObject; -import com.mongodb.DBObject; -import com.mongodb.DBRef; -import com.mongodb.MongoException; -import com.mongodb.ReadPreference; -import com.mongodb.WriteConcern; -import com.mongodb.client.FindIterable; -import com.mongodb.client.ListIndexesIterable; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.model.Filters; -import com.mongodb.client.model.IndexOptions; -import com.mongodb.client.model.InsertManyOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.mongodb.core.query.Criteria.*; +import static org.springframework.data.mongodb.core.query.Query.*; +import static org.springframework.data.mongodb.core.query.Update.*; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -38,10 +27,26 @@ import lombok.RequiredArgsConstructor; import lombok.Value; import lombok.With; + +import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + import org.bson.types.ObjectId; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.convert.converter.Converter; @@ -88,24 +93,22 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import java.lang.reflect.InvocationTargetException; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.temporal.ChronoUnit; -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.*; -import static org.springframework.data.mongodb.core.query.Criteria.where; -import static org.springframework.data.mongodb.core.query.Query.query; -import static org.springframework.data.mongodb.core.query.Update.update; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.DBRef; +import com.mongodb.MongoException; +import com.mongodb.ReadPreference; +import com.mongodb.WriteConcern; +import com.mongodb.client.FindIterable; +import com.mongodb.client.ListIndexesIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; /** * Integration test for {@link MongoTemplate}. diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index 58fa26b960..963482fe6f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -15,27 +15,29 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.MongoClientSettings; -import com.mongodb.MongoException; -import com.mongodb.MongoNamespace; -import com.mongodb.ReadPreference; -import com.mongodb.ServerAddress; -import com.mongodb.ServerCursor; -import com.mongodb.WriteConcern; -import com.mongodb.client.AggregateIterable; -import com.mongodb.client.DistinctIterable; -import com.mongodb.client.FindIterable; -import com.mongodb.client.MapReduceIterable; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import com.mongodb.client.MongoDatabase; -import com.mongodb.client.model.*; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; +import static org.mockito.Mockito.*; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; +import static org.springframework.data.mongodb.test.util.Assertions.*; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; + +import java.math.BigInteger; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + import org.assertj.core.api.Assertions; import org.bson.Document; import org.bson.conversions.Bson; @@ -103,24 +105,33 @@ import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.CollectionUtils; -import java.math.BigInteger; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; - -import static org.mockito.Mockito.*; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; -import static org.springframework.data.mongodb.test.util.Assertions.*; +import com.mongodb.MongoClientSettings; +import com.mongodb.MongoException; +import com.mongodb.MongoNamespace; +import com.mongodb.ReadPreference; +import com.mongodb.ServerAddress; +import com.mongodb.ServerCursor; +import com.mongodb.WriteConcern; +import com.mongodb.client.AggregateIterable; +import com.mongodb.client.DistinctIterable; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MapReduceIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.CreateCollectionOptions; +import com.mongodb.client.model.DeleteOptions; +import com.mongodb.client.model.FindOneAndDeleteOptions; +import com.mongodb.client.model.FindOneAndReplaceOptions; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.MapReduceAction; +import com.mongodb.client.model.ReplaceOptions; +import com.mongodb.client.model.TimeSeriesGranularity; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; /** * Unit tests for {@link MongoTemplate}. diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java index 3bfb2bdf38..a2144cdfc2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java @@ -15,13 +15,34 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.WriteConcern; -import com.mongodb.client.model.InsertManyOptions; -import com.mongodb.reactivestreams.client.MongoClient; +import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; +import static org.springframework.data.mongodb.core.query.Criteria.*; +import static org.springframework.data.mongodb.core.query.Query.*; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Wither; +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.time.Duration; +import java.time.Instant; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + import org.bson.BsonDocument; import org.bson.BsonTimestamp; import org.bson.Document; @@ -63,31 +84,10 @@ import org.springframework.data.mongodb.test.util.MongoClientExtension; import org.springframework.data.mongodb.test.util.MongoServerCondition; import org.springframework.data.mongodb.test.util.ReactiveMongoTestTemplate; -import reactor.core.Disposable; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; -import java.time.Duration; -import java.time.Instant; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static java.util.List.of; -import static org.assertj.core.api.Assertions.*; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.match; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; -import static org.springframework.data.mongodb.core.query.Criteria.where; -import static org.springframework.data.mongodb.core.query.Query.query; +import com.mongodb.WriteConcern; +import com.mongodb.client.model.InsertManyOptions; +import com.mongodb.reactivestreams.client.MongoClient; /** * Integration test for {@link MongoTemplate}. @@ -546,7 +546,7 @@ void rejectsDuplicateIdInInsertAll() { first.setAge(29); Person uniquePerson = new Person("Cmol", 30); - template.insertAll(of(first, second, uniquePerson)) // + template.insertAll(Arrays.asList(first, second, uniquePerson)) // .as(StepVerifier::create) // .verifyError(DataIntegrityViolationException.class); @@ -568,7 +568,7 @@ void storeCorrectObjectsOnInsertAllWithInsertManyOptionsAndUniqueViolation() { first.setAge(29); Person uniquePerson = new Person("Cmol", 30); - template.insertAll(of(first, second, uniquePerson), new InsertManyOptions().ordered(false)) // + template.insertAll(Arrays.asList(first, second, uniquePerson), new InsertManyOptions().ordered(false)) // .as(StepVerifier::create) // .verifyError(DataIntegrityViolationException.class); @@ -586,7 +586,7 @@ void testNullInsertManyOptionsValidation() { Person person = new Person("Amol", 30); - template.insertAll(of(person), null) // + template.insertAll(Arrays.asList(person), null) // .as(StepVerifier::create) // .verifyErrorSatisfies(error -> assertThat(error).isInstanceOf(IllegalArgumentException.class) diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java index 143bc153b4..9de8b8e8b2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateUnitTests.java @@ -15,32 +15,29 @@ */ package org.springframework.data.mongodb.core; -import com.mongodb.MongoClientSettings; -import com.mongodb.ReadPreference; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.CreateCollectionOptions; -import com.mongodb.client.model.DeleteOptions; -import com.mongodb.client.model.FindOneAndDeleteOptions; -import com.mongodb.client.model.FindOneAndReplaceOptions; -import com.mongodb.client.model.FindOneAndUpdateOptions; -import com.mongodb.client.model.ReplaceOptions; -import com.mongodb.client.model.TimeSeriesGranularity; -import com.mongodb.client.model.UpdateOptions; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.InsertManyResult; -import com.mongodb.client.result.InsertOneResult; -import com.mongodb.client.result.UpdateResult; -import com.mongodb.reactivestreams.client.AggregatePublisher; -import com.mongodb.reactivestreams.client.ChangeStreamPublisher; -import com.mongodb.reactivestreams.client.DistinctPublisher; -import com.mongodb.reactivestreams.client.FindPublisher; -import com.mongodb.reactivestreams.client.MapReducePublisher; -import com.mongodb.reactivestreams.client.MongoClient; -import com.mongodb.reactivestreams.client.MongoCollection; -import com.mongodb.reactivestreams.client.MongoDatabase; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; +import static org.springframework.data.mongodb.test.util.Assertions.assertThat; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + import org.assertj.core.api.Assertions; import org.bson.BsonDocument; import org.bson.BsonString; @@ -57,6 +54,7 @@ import org.mockito.quality.Strictness; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; + import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; @@ -98,26 +96,30 @@ import org.springframework.lang.Nullable; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.CollectionUtils; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.mockito.Mockito.*; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; -import static org.springframework.data.mongodb.test.util.Assertions.assertThat; +import com.mongodb.MongoClientSettings; +import com.mongodb.ReadPreference; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.CreateCollectionOptions; +import com.mongodb.client.model.DeleteOptions; +import com.mongodb.client.model.FindOneAndDeleteOptions; +import com.mongodb.client.model.FindOneAndReplaceOptions; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.ReplaceOptions; +import com.mongodb.client.model.TimeSeriesGranularity; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.InsertManyResult; +import com.mongodb.client.result.InsertOneResult; +import com.mongodb.client.result.UpdateResult; +import com.mongodb.reactivestreams.client.AggregatePublisher; +import com.mongodb.reactivestreams.client.ChangeStreamPublisher; +import com.mongodb.reactivestreams.client.DistinctPublisher; +import com.mongodb.reactivestreams.client.FindPublisher; +import com.mongodb.reactivestreams.client.MapReducePublisher; +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoCollection; +import com.mongodb.reactivestreams.client.MongoDatabase; /** * Unit tests for {@link ReactiveMongoTemplate}. From 961b8f7044f79acb560cdbc57b22724b17791445 Mon Sep 17 00:00:00 2001 From: Tomasz Forys Date: Mon, 16 Jan 2023 14:11:03 +0100 Subject: [PATCH 3/3] Resolving conflicts Closes #4252 --- .../org/springframework/data/mongodb/core/MongoTemplate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 3c26bc1b2b..596ecf7b45 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -159,6 +159,7 @@ * @author Yadhukrishna S Pai * @author Anton Barkan * @author Bartłomiej Mazur + * @author Michael Krog * @author Tomasz Forys */ public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider {