DATAMONGO-2290 - Polishing.
Extracted complex lambdas into methods. Added null check. Original pull request: #762.
This commit is contained in:
@@ -15,9 +15,6 @@
|
||||
*/
|
||||
package org.springframework.data.mongodb.core;
|
||||
|
||||
import lombok.NonNull;
|
||||
import lombok.Value;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -46,8 +43,13 @@ import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import com.mongodb.WriteConcern;
|
||||
import com.mongodb.bulk.BulkWriteResult;
|
||||
import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.model.*;
|
||||
|
||||
import lombok.NonNull;
|
||||
import lombok.Value;
|
||||
|
||||
/**
|
||||
* Default implementation for {@link BulkOperations}.
|
||||
*
|
||||
@@ -56,6 +58,7 @@ import com.mongodb.client.model.*;
|
||||
* @author Christoph Strobl
|
||||
* @author Mark Paluch
|
||||
* @author Minsu Kim
|
||||
* @author Jens Schauder
|
||||
* @since 1.9
|
||||
*/
|
||||
class DefaultBulkOperations implements BulkOperations {
|
||||
@@ -289,32 +292,44 @@ class DefaultBulkOperations implements BulkOperations {
|
||||
|
||||
try {
|
||||
|
||||
com.mongodb.bulk.BulkWriteResult result = mongoOperations.execute(collectionName, collection -> {
|
||||
return collection.bulkWrite(models.stream().map(it -> {
|
||||
com.mongodb.bulk.BulkWriteResult result = mongoOperations.execute(collectionName, this::bulkWriteTo);
|
||||
|
||||
maybeEmitBeforeSaveEvent(it);
|
||||
Assert.state(result != null, "Result must not be null.");
|
||||
|
||||
if (it.getModel() instanceof InsertOneModel) {
|
||||
models.forEach(this::maybeEmitAfterSaveEvent);
|
||||
|
||||
Document target = ((InsertOneModel<Document>) it.getModel()).getDocument();
|
||||
maybeInvokeBeforeSaveCallback(it.getSource(), target);
|
||||
} else if (it.getModel() instanceof ReplaceOneModel) {
|
||||
|
||||
Document target = ((ReplaceOneModel<Document>) it.getModel()).getReplacement();
|
||||
maybeInvokeBeforeSaveCallback(it.getSource(), target);
|
||||
}
|
||||
|
||||
return mapWriteModel(it.getModel());
|
||||
}).collect(Collectors.toList()), bulkOptions);
|
||||
});
|
||||
|
||||
models.stream().forEach(this::maybeEmitAfterSaveEvent);
|
||||
return result;
|
||||
} finally {
|
||||
this.bulkOptions = getBulkWriteOptions(bulkOperationContext.getBulkMode());
|
||||
}
|
||||
}
|
||||
|
||||
private BulkWriteResult bulkWriteTo(MongoCollection<Document> collection) {
|
||||
|
||||
return collection.bulkWrite( //
|
||||
models.stream() //
|
||||
.map(this::extractAndMapWriteModel) //
|
||||
.collect(Collectors.toList()), //
|
||||
bulkOptions);
|
||||
}
|
||||
|
||||
private WriteModel<Document> extractAndMapWriteModel(SourceAwareWriteModelHolder it) {
|
||||
|
||||
maybeEmitBeforeSaveEvent(it);
|
||||
|
||||
if (it.getModel() instanceof InsertOneModel) {
|
||||
|
||||
Document target = ((InsertOneModel<Document>) it.getModel()).getDocument();
|
||||
maybeInvokeBeforeSaveCallback(it.getSource(), target);
|
||||
} else if (it.getModel() instanceof ReplaceOneModel) {
|
||||
|
||||
Document target = ((ReplaceOneModel<Document>) it.getModel()).getReplacement();
|
||||
maybeInvokeBeforeSaveCallback(it.getSource(), target);
|
||||
}
|
||||
|
||||
return mapWriteModel(it.getModel());
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs update and upsert bulk operations.
|
||||
*
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.bson.Document;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
@@ -78,13 +79,14 @@ import com.mongodb.client.model.WriteModel;
|
||||
* @author Christoph Strobl
|
||||
* @author Mark Paluch
|
||||
* @author Minsu Kim
|
||||
* @author Jens Schauder
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class DefaultBulkOperationsUnitTests {
|
||||
|
||||
MongoTemplate template;
|
||||
@Mock MongoDatabase database;
|
||||
@Mock MongoCollection<Document> collection;
|
||||
@Mock(answer= Answers.RETURNS_DEEP_STUBS) MongoCollection<Document> collection;
|
||||
@Mock MongoDbFactory factory;
|
||||
@Mock DbRefResolver dbRefResolver;
|
||||
@Captor ArgumentCaptor<List<WriteModel<Document>>> captor;
|
||||
@@ -272,7 +274,7 @@ public class DefaultBulkOperationsUnitTests {
|
||||
verify(eventPublisher).publishEvent(any(AfterSaveEvent.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Test // DATAMONGO-2290
|
||||
public void noAfterSaveEventOnFailure() {
|
||||
|
||||
ApplicationEventPublisher eventPublisher = mock(ApplicationEventPublisher.class);
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.bson.codecs.configuration.CodecRegistry;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.springframework.data.geo.Metrics;
|
||||
@@ -66,6 +67,7 @@ import com.mongodb.client.ClientSession;
|
||||
* control the behavior by using the methods dedicated for {@link ClientSession} directly.
|
||||
*
|
||||
* @author Christoph Strobl
|
||||
* @author Jens Schauder
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@RunWith(MockitoJUnitRunner.Silent.class)
|
||||
@@ -77,7 +79,7 @@ public class SessionBoundMongoTemplateUnitTests {
|
||||
|
||||
MongoDbFactory factory;
|
||||
|
||||
@Mock MongoCollection collection;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS) MongoCollection collection;
|
||||
@Mock MongoDatabase database;
|
||||
@Mock MongoClient client;
|
||||
@Mock ClientSession clientSession;
|
||||
|
||||
Reference in New Issue
Block a user