From 39fb25cbb9d9dedde4d45d87a8065318a91a59ce Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Tue, 14 Apr 2020 22:12:19 +0200 Subject: [PATCH] DATAES-791 - DocumentOperations.multiGet() implementations must return null values for not found entities. Original PR: #428 --- .../core/DocumentOperations.java | 3 +- .../core/document/DocumentAdapters.java | 9 +++-- .../core/ElasticsearchTemplateTests.java | 33 +++++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/DocumentOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/DocumentOperations.java index f664f38c9..1c05cd801 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/DocumentOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/DocumentOperations.java @@ -16,7 +16,6 @@ package org.springframework.data.elasticsearch.core; import java.util.List; -import java.util.Optional; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.BulkOptions; @@ -121,7 +120,7 @@ public interface DocumentOperations { * @param query the query defining the ids of the objects to get * @param clazz the type of the object to be returned * @param index the index(es) from which the objects are read. - * @return list of objects + * @return list of objects, contains null values for ids that are not found */ List multiGet(Query query, Class clazz, IndexCoordinates index); diff --git a/src/main/java/org/springframework/data/elasticsearch/core/document/DocumentAdapters.java b/src/main/java/org/springframework/data/elasticsearch/core/document/DocumentAdapters.java index b4226908a..fb1a491a8 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/document/DocumentAdapters.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/document/DocumentAdapters.java @@ -118,16 +118,16 @@ public class DocumentAdapters { * Creates a List of {@link Document}s from {@link MultiGetResponse}. * * @param source the source {@link MultiGetResponse}, not {@literal null}. - * @return a possibly empty list of the Documents. + * @return a list of Documents, contains null values for not found Documents. */ public static List from(MultiGetResponse source) { Assert.notNull(source, "MultiGetResponse must not be null"); - //noinspection ReturnOfNull + // noinspection ReturnOfNull return Arrays.stream(source.getResponses()) // .map(itemResponse -> itemResponse.isFailed() ? null : DocumentAdapters.from(itemResponse.getResponse())) // - .filter(Objects::nonNull).collect(Collectors.toList()); + .collect(Collectors.toList()); } /** @@ -299,8 +299,7 @@ public class DocumentAdapters { public Object get(Object key) { return documentFields.stream() // .filter(documentField -> documentField.getName().equals(key)) // - .map(DocumentField::getValue) - .findFirst() // + .map(DocumentField::getValue).findFirst() // .orElse(null); // } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index fa83206ba..145a8784f 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -240,6 +240,39 @@ public abstract class ElasticsearchTemplateTests { assertThat(sampleEntities.get(1)).isEqualTo(sampleEntity2); } + @Test // DATAES-791 + public void shouldReturnNullObjectForNotExistingIdUsingMultiGet() { + + // given + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") + .version(System.currentTimeMillis()).build(); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") + .version(System.currentTimeMillis()).build(); + + List indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); + + operations.bulkIndex(indexQueries, index); + indexOperations.refresh(); + + // when + List idsToSearch = Arrays.asList(documentId, randomNumeric(5), documentId2); + assertThat(idsToSearch).hasSize(3); + + NativeSearchQuery query = new NativeSearchQueryBuilder().withIds(idsToSearch).build(); + List sampleEntities = operations.multiGet(query, SampleEntity.class, index); + + // then + assertThat(sampleEntities).hasSize(3); + assertThat(sampleEntities.get(0)).isEqualTo(sampleEntity1); + assertThat(sampleEntities.get(1)).isNull(); + assertThat(sampleEntities.get(2)).isEqualTo(sampleEntity2); + } + @Test public void shouldReturnObjectsForGivenIdsUsingMultiGetWithFields() {