Skip to content

Commit c116438

Browse files
committed
Polishing.
Original pull request #1211
1 parent 6b02a4e commit c116438

File tree

3 files changed

+26
-19
lines changed

3 files changed

+26
-19
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java

+10-14
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232
import org.springframework.data.mapping.IdentifierAccessor;
3333
import org.springframework.data.mapping.callback.EntityCallbacks;
3434
import org.springframework.data.relational.core.conversion.AggregateChange;
35-
import org.springframework.data.relational.core.conversion.RootAggregateChange;
3635
import org.springframework.data.relational.core.conversion.BatchingAggregateChange;
3736
import org.springframework.data.relational.core.conversion.MutableAggregateChange;
3837
import org.springframework.data.relational.core.conversion.RelationalEntityDeleteWriter;
3938
import org.springframework.data.relational.core.conversion.RelationalEntityInsertWriter;
4039
import org.springframework.data.relational.core.conversion.RelationalEntityUpdateWriter;
4140
import org.springframework.data.relational.core.conversion.RelationalEntityVersionUtils;
41+
import org.springframework.data.relational.core.conversion.RootAggregateChange;
4242
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
4343
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
4444
import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
@@ -294,8 +294,7 @@ private <T> T afterExecute(AggregateChange<T> change, T entityAfterExecution) {
294294
return triggerAfterSave(entityAfterExecution, change);
295295
}
296296

297-
private <T> RootAggregateChange<T> beforeExecute(T aggregateRoot,
298-
Function<T, RootAggregateChange<T>> changeCreator) {
297+
private <T> RootAggregateChange<T> beforeExecute(T aggregateRoot, Function<T, RootAggregateChange<T>> changeCreator) {
299298

300299
Assert.notNull(aggregateRoot, "Aggregate instance must not be null!");
301300

@@ -337,19 +336,17 @@ private <T> T performSave(T instance, Function<T, RootAggregateChange<T>> change
337336

338337
private <T> List<T> performSaveAll(Iterable<T> instances) {
339338

340-
Iterator<T> iterator = instances.iterator();
341-
T firstInstance = iterator.next();
339+
BatchingAggregateChange<T, RootAggregateChange<T>> batchingAggregateChange = null;
342340

343-
// noinspection unchecked
344-
BatchingAggregateChange<T, RootAggregateChange<T>> batchingAggregateChange = //
345-
BatchingAggregateChange.forSave((Class<T>) ClassUtils.getUserClass(firstInstance));
346-
batchingAggregateChange.add(beforeExecute(firstInstance, changeCreatorSelectorForSave(firstInstance)));
347-
348-
while (iterator.hasNext()) {
349-
T instance = iterator.next();
341+
for (T instance : instances) {
342+
if (batchingAggregateChange == null) {
343+
batchingAggregateChange = BatchingAggregateChange.forSave((Class<T>) ClassUtils.getUserClass(instance));
344+
}
350345
batchingAggregateChange.add(beforeExecute(instance, changeCreatorSelectorForSave(instance)));
351346
}
352347

348+
Assert.notNull(batchingAggregateChange, "Iterable in saveAll must not be empty");
349+
353350
List<T> instancesAfterExecution = executor.executeSave(batchingAggregateChange);
354351

355352
ArrayList<T> results = new ArrayList<>(instancesAfterExecution.size());
@@ -378,8 +375,7 @@ private <T> RootAggregateChange<T> createUpdateChange(EntityAndPreviousVersion<T
378375

379376
RootAggregateChange<T> aggregateChange = MutableAggregateChange.forSave(entityAndVersion.entity,
380377
entityAndVersion.version);
381-
new RelationalEntityUpdateWriter<T>(context).write(entityAndVersion.entity,
382-
aggregateChange);
378+
new RelationalEntityUpdateWriter<T>(context).write(entityAndVersion.entity, aggregateChange);
383379
return aggregateChange;
384380
}
385381

spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/DbAction.java

+15-4
Original file line numberDiff line numberDiff line change
@@ -353,18 +353,29 @@ public String toString() {
353353
* @since 3.0
354354
*/
355355
abstract class BatchWithValue<T, A extends DbAction<T>, B> implements DbAction<T> {
356+
356357
private final List<A> actions;
357358
private final B batchValue;
358359

359-
public BatchWithValue(List<A> actions, Function<A, B> batchValueExtractor) {
360+
/**
361+
* Creates a {@link BatchWithValue} instance from the given actions and the value which can be extracted by applying #batchValueExtractor on any of the actions.
362+
*
363+
* All actions must result in the same value when #batchValueExtractor is applied.
364+
*
365+
* @param actions the actions forming the batch.
366+
* @param batchValueExtractor function for extracting the {@link #batchValue} from an action.
367+
*/
368+
BatchWithValue(List<A> actions, Function<A, B> batchValueExtractor) {
369+
360370
Assert.notEmpty(actions, "Actions must contain at least one action");
371+
361372
Iterator<A> actionIterator = actions.iterator();
362373
this.batchValue = batchValueExtractor.apply(actionIterator.next());
363374
actionIterator.forEachRemaining(action -> {
364-
if (!batchValueExtractor.apply(action).equals(batchValue)) {
365-
throw new IllegalArgumentException("All actions in the batch must have matching batchValue");
366-
}
375+
Assert.isTrue(batchValueExtractor.apply(action).equals(batchValue),
376+
"All actions in the batch must have matching batchValue");
367377
});
378+
368379
this.actions = actions;
369380
}
370381

spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/SaveBatchingAggregateChange.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class SaveBatchingAggregateChange<T> implements BatchingAggregateChange<T
4949
private final Map<PersistentPropertyPath<RelationalPersistentProperty>, List<DbAction.Delete<?>>> deleteActions = //
5050
new HashMap<>();
5151

52-
public SaveBatchingAggregateChange(Class<T> entityType) {
52+
SaveBatchingAggregateChange(Class<T> entityType) {
5353
this.entityType = entityType;
5454
}
5555

0 commit comments

Comments
 (0)