Browse Source

DATAMONGO-2290 - Polishing.

Extracted complex lambdas into methods.
Added null check.

Original pull request: #762.
pull/768/head
Jens Schauder 7 years ago
parent
commit
597354ea7e
  1. 55
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultBulkOperations.java
  2. 6
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java
  3. 4
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SessionBoundMongoTemplateUnitTests.java

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

@ -15,9 +15,6 @@ @@ -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; @@ -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.*; @@ -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 { @@ -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.
*

6
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java

@ -33,6 +33,7 @@ import org.bson.Document; @@ -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; @@ -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 { @@ -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);

4
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SessionBoundMongoTemplateUnitTests.java

@ -27,6 +27,7 @@ import org.bson.codecs.configuration.CodecRegistry; @@ -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; @@ -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 { @@ -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;

Loading…
Cancel
Save