From 34e3dc735c4bd26133e22ef00f150a45a10bd720 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sun, 17 May 2020 20:01:47 +0200 Subject: [PATCH] DATAES-832 - findAllById repository method returns iterable with null elements for not found ids. --- .../AbstractElasticsearchRepository.java | 4 +- .../SimpleElasticsearchRepositoryTests.java | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) 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 8567aeb76..550026431 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 @@ -22,6 +22,7 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -155,7 +156,8 @@ public abstract class AbstractElasticsearchRepository implements Elastics public Iterable findAllById(Iterable ids) { Assert.notNull(ids, "ids can't be null."); NativeSearchQuery query = new NativeSearchQueryBuilder().withIds(stringIdsRepresentation(ids)).build(); - return operations.multiGet(query, getEntityClass(), getIndexCoordinates()); + return operations.multiGet(query, getEntityClass(), getIndexCoordinates()).stream().filter(Objects::nonNull) + .collect(Collectors.toList()); } @Override 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 284fa8f66..bae702a96 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 @@ -25,12 +25,14 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.IOException; 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 java.util.stream.Collectors; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -56,6 +58,7 @@ import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTes 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.data.util.StreamUtils; import org.springframework.test.context.ContextConfiguration; /** @@ -361,6 +364,14 @@ public class SimpleElasticsearchRepositoryTests { @Test public void shouldDeleteAll() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("hello world."); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + // when repository.deleteAll(); @@ -677,6 +688,32 @@ public class SimpleElasticsearchRepositoryTests { assertThat(savedEntities).hasSize(0); } + @Test // DATAES-832 + void shouldNotReturnNullValuesInFindAllById() { + + // given + String documentId1 = "id-one"; + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId1); + repository.save(sampleEntity1); + String documentId2 = "id-two"; + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + repository.save(sampleEntity2); + String documentId3 = "id-three"; + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + repository.save(sampleEntity3); + + Iterable allById = repository + .findAllById(Arrays.asList("id-one", "does-not-exist", "id-two", "where-am-i", "id-three")); + List results = StreamUtils.createStreamFromIterator(allById.iterator()).collect(Collectors.toList()); + + assertThat(results).hasSize(3); + assertThat(results.stream().map(SampleEntity::getId).collect(Collectors.toList())) + .containsExactlyInAnyOrder("id-one", "id-two", "id-three"); + } + private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { List sampleEntities = new ArrayList<>();