DATAMONGO-2290 - Polishing.

Extracted complex lambdas into methods.
Added null check.

Original pull request: #762.
This commit is contained in:
Jens Schauder
2019-06-13 14:18:16 +02:00
parent c09188561c
commit 597354ea7e
3 changed files with 42 additions and 23 deletions

View File

@@ -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.
*

View File

@@ -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);

View File

@@ -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;