Skip to content

Commit b4ebca7

Browse files
committed
DATAES-142 - AbstractRepository.saveAll can process empty list.
Original PR: spring-projects#307
1 parent 4bb7b5e commit b4ebca7

File tree

4 files changed

+55
-39
lines changed

4 files changed

+55
-39
lines changed

src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Collections;
2424
import java.util.List;
2525
import java.util.Optional;
26+
import java.util.stream.Collectors;
2627

2728
import org.elasticsearch.ElasticsearchException;
2829
import org.elasticsearch.index.query.QueryBuilder;
@@ -42,6 +43,7 @@
4243
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
4344
import org.springframework.data.elasticsearch.core.query.SearchQuery;
4445
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
46+
import org.springframework.data.util.Streamable;
4547
import org.springframework.util.Assert;
4648

4749
/**
@@ -57,6 +59,7 @@
5759
* @author Michael Wirth
5860
* @author Sascha Woo
5961
* @author Murali Chevuri
62+
* @author Peter-Josef Meisch
6063
*/
6164
public abstract class AbstractElasticsearchRepository<T, ID> implements ElasticsearchRepository<T, ID> {
6265

@@ -182,16 +185,8 @@ public <S extends T> S save(S entity) {
182185
public <S extends T> List<S> save(List<S> entities) {
183186

184187
Assert.notNull(entities, "Cannot insert 'null' as a List.");
185-
Assert.notEmpty(entities, "Cannot insert empty List.");
186188

187-
List<IndexQuery> queries = new ArrayList<>();
188-
for (S s : entities) {
189-
queries.add(createIndexQuery(s));
190-
}
191-
elasticsearchOperations.bulkIndex(queries);
192-
elasticsearchOperations.refresh(entityInformation.getIndexName());
193-
194-
return entities;
189+
return Streamable.of(saveAll(entities)).stream().collect(Collectors.toList());
195190
}
196191

197192
@Override
@@ -215,12 +210,13 @@ public <S extends T> Iterable<S> saveAll(Iterable<S> entities) {
215210

216211
Assert.notNull(entities, "Cannot insert 'null' as a List.");
217212

218-
List<IndexQuery> queries = new ArrayList<>();
219-
for (S s : entities) {
220-
queries.add(createIndexQuery(s));
213+
List<IndexQuery> queries = Streamable.of(entities).stream().map(this::createIndexQuery)
214+
.collect(Collectors.toList());
215+
216+
if (!queries.isEmpty()) {
217+
elasticsearchOperations.bulkIndex(queries);
218+
elasticsearchOperations.refresh(entityInformation.getIndexName());
221219
}
222-
elasticsearchOperations.bulkIndex(queries);
223-
elasticsearchOperations.refresh(entityInformation.getIndexName());
224220

225221
return entities;
226222
}

src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepositoryTests.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@
4040
import org.elasticsearch.client.RequestOptions;
4141
import org.elasticsearch.client.RestHighLevelClient;
4242
import org.junit.Before;
43+
import org.junit.ClassRule;
4344
import org.junit.Test;
4445
import org.junit.runner.RunWith;
4546
import org.reactivestreams.Publisher;
46-
4747
import org.springframework.beans.factory.annotation.Autowired;
4848
import org.springframework.context.annotation.Configuration;
4949
import org.springframework.data.annotation.Id;
@@ -52,6 +52,7 @@
5252
import org.springframework.data.domain.Pageable;
5353
import org.springframework.data.domain.Sort;
5454
import org.springframework.data.domain.Sort.Order;
55+
import org.springframework.data.elasticsearch.TestNodeResource;
5556
import org.springframework.data.elasticsearch.TestUtils;
5657
import org.springframework.data.elasticsearch.annotations.Document;
5758
import org.springframework.data.elasticsearch.annotations.Field;
@@ -67,12 +68,14 @@
6768

6869
/**
6970
* @author Christoph Strobl
70-
* @currentRead Fool's Fate - Robin Hobb
71+
* @author Peter-Josef Meisch
7172
*/
7273
@RunWith(SpringRunner.class)
7374
@ContextConfiguration
7475
public class SimpleReactiveElasticsearchRepositoryTests {
7576

77+
@ClassRule public static TestNodeResource testNodeResource = new TestNodeResource();
78+
7679
@Configuration
7780
@EnableReactiveElasticsearchRepositories(considerNestedRepositories = true)
7881
static class Config extends AbstractReactiveElasticsearchConfiguration {

src/test/java/org/springframework/data/elasticsearch/repository/support/simple/SimpleElasticsearchRepositoryTests.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
import java.lang.Long;
2929
import java.util.ArrayList;
3030
import java.util.Arrays;
31+
import java.util.Collections;
3132
import java.util.List;
3233
import java.util.Optional;
3334

3435
import org.elasticsearch.action.ActionRequestValidationException;
3536
import org.junit.Before;
37+
import org.junit.ClassRule;
3638
import org.junit.Test;
3739
import org.junit.runner.RunWith;
3840
import org.springframework.beans.factory.annotation.Autowired;
@@ -42,12 +44,15 @@
4244
import org.springframework.data.domain.PageRequest;
4345
import org.springframework.data.domain.Sort;
4446
import org.springframework.data.domain.Sort.Order;
47+
import org.springframework.data.elasticsearch.RestElasticsearchTestConfiguration;
48+
import org.springframework.data.elasticsearch.TestNodeResource;
4549
import org.springframework.data.elasticsearch.annotations.Document;
4650
import org.springframework.data.elasticsearch.annotations.Field;
47-
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
51+
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
4852
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
4953
import org.springframework.data.elasticsearch.core.query.SearchQuery;
5054
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
55+
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
5156
import org.springframework.data.elasticsearch.utils.IndexInitializer;
5257
import org.springframework.test.context.ContextConfiguration;
5358
import org.springframework.test.context.junit4.SpringRunner;
@@ -62,16 +67,19 @@
6267
* @author Murali Chevuri
6368
*/
6469
@RunWith(SpringRunner.class)
65-
@ContextConfiguration("classpath:/simple-repository-test.xml")
70+
@ContextConfiguration(classes = { SimpleElasticsearchRepositoryTests.class, RestElasticsearchTestConfiguration.class })
71+
@EnableElasticsearchRepositories(considerNestedRepositories = true)
6672
public class SimpleElasticsearchRepositoryTests {
6773

74+
@ClassRule public static TestNodeResource testNodeResource = new TestNodeResource();
75+
6876
@Autowired private SampleElasticsearchRepository repository;
6977

70-
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
78+
@Autowired private ElasticsearchOperations elasticsearchOperations;
7179

7280
@Before
7381
public void before() {
74-
IndexInitializer.init(elasticsearchTemplate, SampleEntity.class);
82+
IndexInitializer.init(elasticsearchOperations, SampleEntity.class);
7583
}
7684

7785
@Test
@@ -636,6 +644,34 @@ public void shouldReturnSimilarEntities() {
636644
assertThat(results.getTotalElements()).isGreaterThanOrEqualTo(1L);
637645
}
638646

647+
@Test // DATAES-142
648+
public void shouldIndexNotEmptyList() {
649+
// given
650+
List<SampleEntity> list = new ArrayList<>();
651+
String documentId = randomNumeric(5);
652+
SampleEntity sampleEntity1 = new SampleEntity();
653+
sampleEntity1.setId(documentId);
654+
sampleEntity1.setMessage("world");
655+
list.add(sampleEntity1);
656+
657+
String documentId2 = randomNumeric(5);
658+
SampleEntity sampleEntity2 = new SampleEntity();
659+
sampleEntity2.setId(documentId2);
660+
sampleEntity2.setMessage("hello");
661+
list.add(sampleEntity2);
662+
663+
Iterable<SampleEntity> savedEntities = repository.saveAll(list);
664+
665+
assertThat(savedEntities).containsExactlyElementsOf(list);
666+
}
667+
668+
@Test // DATAES-142
669+
public void shouldNotFailOnIndexingEmptyList() {
670+
Iterable<SampleEntity> savedEntities = repository.saveAll(Collections.emptyList());
671+
672+
assertThat(savedEntities).hasSize(0);
673+
}
674+
639675
private static List<SampleEntity> createSampleEntitiesWithMessage(String message, int numberOfEntities) {
640676
List<SampleEntity> sampleEntities = new ArrayList<>();
641677
for (int i = 0; i < numberOfEntities; i++) {

src/test/resources/simple-repository-test.xml

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)