From 597354ea7e09bf5265bf1c9daf9d5109d045706a Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 13 Jun 2019 14:18:16 +0200 Subject: [PATCH] DATAMONGO-2290 - Polishing. Extracted complex lambdas into methods. Added null check. Original pull request: #762. --- .../mongodb/core/DefaultBulkOperations.java | 55 ++++++++++++------- .../core/DefaultBulkOperationsUnitTests.java | 6 +- .../SessionBoundMongoTemplateUnitTests.java | 4 +- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultBulkOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultBulkOperations.java index 17f22cae8..a2c80790e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultBulkOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultBulkOperations.java @@ -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) it.getModel()).getDocument(); - maybeInvokeBeforeSaveCallback(it.getSource(), target); - } else if (it.getModel() instanceof ReplaceOneModel) { - - Document target = ((ReplaceOneModel) 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 collection) { + + return collection.bulkWrite( // + models.stream() // + .map(this::extractAndMapWriteModel) // + .collect(Collectors.toList()), // + bulkOptions); + } + + private WriteModel extractAndMapWriteModel(SourceAwareWriteModelHolder it) { + + maybeEmitBeforeSaveEvent(it); + + if (it.getModel() instanceof InsertOneModel) { + + Document target = ((InsertOneModel) it.getModel()).getDocument(); + maybeInvokeBeforeSaveCallback(it.getSource(), target); + } else if (it.getModel() instanceof ReplaceOneModel) { + + Document target = ((ReplaceOneModel) it.getModel()).getReplacement(); + maybeInvokeBeforeSaveCallback(it.getSource(), target); + } + + return mapWriteModel(it.getModel()); + } + /** * Performs update and upsert bulk operations. * diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java index edf120159..1b1c4e0d8 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/DefaultBulkOperationsUnitTests.java @@ -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 collection; + @Mock(answer= Answers.RETURNS_DEEP_STUBS) MongoCollection collection; @Mock MongoDbFactory factory; @Mock DbRefResolver dbRefResolver; @Captor ArgumentCaptor>> 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); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SessionBoundMongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SessionBoundMongoTemplateUnitTests.java index ef8b23dc6..ac0c3b974 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SessionBoundMongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/SessionBoundMongoTemplateUnitTests.java @@ -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;