DATAES-832 - findAllById repository method returns iterable with null elements for not found ids.

This commit is contained in:
Peter-Josef Meisch 2020-05-17 20:01:47 +02:00
parent e7110c14ab
commit 34e3dc735c
2 changed files with 40 additions and 1 deletions

View File

@ -22,6 +22,7 @@ import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -155,7 +156,8 @@ public abstract class AbstractElasticsearchRepository<T, ID> implements Elastics
public Iterable<T> findAllById(Iterable<ID> ids) { public Iterable<T> findAllById(Iterable<ID> ids) {
Assert.notNull(ids, "ids can't be null."); Assert.notNull(ids, "ids can't be null.");
NativeSearchQuery query = new NativeSearchQueryBuilder().withIds(stringIdsRepresentation(ids)).build(); 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 @Override

View File

@ -25,12 +25,14 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.IOException;
import java.lang.Long; import java.lang.Long;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; 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.ElasticsearchRepository;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.data.elasticsearch.utils.IndexInitializer; import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.data.util.StreamUtils;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
/** /**
@ -361,6 +364,14 @@ public class SimpleElasticsearchRepositoryTests {
@Test @Test
public void shouldDeleteAll() { 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 // when
repository.deleteAll(); repository.deleteAll();
@ -677,6 +688,32 @@ public class SimpleElasticsearchRepositoryTests {
assertThat(savedEntities).hasSize(0); 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<SampleEntity> allById = repository
.findAllById(Arrays.asList("id-one", "does-not-exist", "id-two", "where-am-i", "id-three"));
List<SampleEntity> 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<SampleEntity> createSampleEntitiesWithMessage(String message, int numberOfEntities) { private static List<SampleEntity> createSampleEntitiesWithMessage(String message, int numberOfEntities) {
List<SampleEntity> sampleEntities = new ArrayList<>(); List<SampleEntity> sampleEntities = new ArrayList<>();