From b4ebca7ab566620ea873edd3f689e86fea94fb00 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sun, 18 Aug 2019 21:04:11 +0200 Subject: [PATCH] DATAES-142 - AbstractRepository.saveAll can process empty list. Original PR: #307 --- .../AbstractElasticsearchRepository.java | 24 +++++----- ...eReactiveElasticsearchRepositoryTests.java | 7 ++- .../SimpleElasticsearchRepositoryTests.java | 44 +++++++++++++++++-- src/test/resources/simple-repository-test.xml | 19 -------- 4 files changed, 55 insertions(+), 39 deletions(-) delete mode 100644 src/test/resources/simple-repository-test.xml diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java index ce8534e5a..0a1f4e2b7 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.index.query.QueryBuilder; @@ -42,6 +43,7 @@ import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.data.util.Streamable; import org.springframework.util.Assert; /** @@ -57,6 +59,7 @@ import org.springframework.util.Assert; * @author Michael Wirth * @author Sascha Woo * @author Murali Chevuri + * @author Peter-Josef Meisch */ public abstract class AbstractElasticsearchRepository implements ElasticsearchRepository { @@ -182,16 +185,8 @@ public abstract class AbstractElasticsearchRepository implements Elastics public List save(List entities) { Assert.notNull(entities, "Cannot insert 'null' as a List."); - Assert.notEmpty(entities, "Cannot insert empty List."); - List queries = new ArrayList<>(); - for (S s : entities) { - queries.add(createIndexQuery(s)); - } - elasticsearchOperations.bulkIndex(queries); - elasticsearchOperations.refresh(entityInformation.getIndexName()); - - return entities; + return Streamable.of(saveAll(entities)).stream().collect(Collectors.toList()); } @Override @@ -215,12 +210,13 @@ public abstract class AbstractElasticsearchRepository implements Elastics Assert.notNull(entities, "Cannot insert 'null' as a List."); - List queries = new ArrayList<>(); - for (S s : entities) { - queries.add(createIndexQuery(s)); + List queries = Streamable.of(entities).stream().map(this::createIndexQuery) + .collect(Collectors.toList()); + + if (!queries.isEmpty()) { + elasticsearchOperations.bulkIndex(queries); + elasticsearchOperations.refresh(entityInformation.getIndexName()); } - elasticsearchOperations.bulkIndex(queries); - elasticsearchOperations.refresh(entityInformation.getIndexName()); return entities; } diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepositoryTests.java index 59417482b..94d24f7f9 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepositoryTests.java @@ -40,10 +40,10 @@ import org.elasticsearch.action.support.WriteRequest.RefreshPolicy; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.reactivestreams.Publisher; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.data.annotation.Id; @@ -52,6 +52,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; +import org.springframework.data.elasticsearch.TestNodeResource; import org.springframework.data.elasticsearch.TestUtils; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; @@ -67,12 +68,14 @@ import org.springframework.util.StringUtils; /** * @author Christoph Strobl - * @currentRead Fool's Fate - Robin Hobb + * @author Peter-Josef Meisch */ @RunWith(SpringRunner.class) @ContextConfiguration public class SimpleReactiveElasticsearchRepositoryTests { + @ClassRule public static TestNodeResource testNodeResource = new TestNodeResource(); + @Configuration @EnableReactiveElasticsearchRepositories(considerNestedRepositories = true) static class Config extends AbstractReactiveElasticsearchConfiguration { diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/support/simple/SimpleElasticsearchRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/support/simple/SimpleElasticsearchRepositoryTests.java index fb9dd9752..c1845a291 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/support/simple/SimpleElasticsearchRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/support/simple/SimpleElasticsearchRepositoryTests.java @@ -28,11 +28,13 @@ import lombok.NoArgsConstructor; import java.lang.Long; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Optional; import org.elasticsearch.action.ActionRequestValidationException; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -42,12 +44,15 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; +import org.springframework.data.elasticsearch.RestElasticsearchTestConfiguration; +import org.springframework.data.elasticsearch.TestNodeResource; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.elasticsearch.utils.IndexInitializer; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @@ -62,16 +67,19 @@ import org.springframework.test.context.junit4.SpringRunner; * @author Murali Chevuri */ @RunWith(SpringRunner.class) -@ContextConfiguration("classpath:/simple-repository-test.xml") +@ContextConfiguration(classes = { SimpleElasticsearchRepositoryTests.class, RestElasticsearchTestConfiguration.class }) +@EnableElasticsearchRepositories(considerNestedRepositories = true) public class SimpleElasticsearchRepositoryTests { + @ClassRule public static TestNodeResource testNodeResource = new TestNodeResource(); + @Autowired private SampleElasticsearchRepository repository; - @Autowired private ElasticsearchTemplate elasticsearchTemplate; + @Autowired private ElasticsearchOperations elasticsearchOperations; @Before public void before() { - IndexInitializer.init(elasticsearchTemplate, SampleEntity.class); + IndexInitializer.init(elasticsearchOperations, SampleEntity.class); } @Test @@ -636,6 +644,34 @@ public class SimpleElasticsearchRepositoryTests { assertThat(results.getTotalElements()).isGreaterThanOrEqualTo(1L); } + @Test // DATAES-142 + public void shouldIndexNotEmptyList() { + // given + List list = new ArrayList<>(); + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("world"); + list.add(sampleEntity1); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("hello"); + list.add(sampleEntity2); + + Iterable savedEntities = repository.saveAll(list); + + assertThat(savedEntities).containsExactlyElementsOf(list); + } + + @Test // DATAES-142 + public void shouldNotFailOnIndexingEmptyList() { + Iterable savedEntities = repository.saveAll(Collections.emptyList()); + + assertThat(savedEntities).hasSize(0); + } + private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { List sampleEntities = new ArrayList<>(); for (int i = 0; i < numberOfEntities; i++) { diff --git a/src/test/resources/simple-repository-test.xml b/src/test/resources/simple-repository-test.xml deleted file mode 100644 index 3733f53fc..000000000 --- a/src/test/resources/simple-repository-test.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - -