diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java index 77e06a3fe..0799130d1 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java @@ -24,6 +24,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.elasticsearch.UncategorizedElasticsearchException; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.document.Document; import org.springframework.data.elasticsearch.core.document.NestedMetaData; @@ -45,6 +46,7 @@ import org.springframework.util.Assert; * @author Mark Paluch * @author Roman Puchkovskiy * @author Matt Gilene + * @author Sascha Woo * @since 4.0 */ class SearchHitMapping { @@ -194,7 +196,7 @@ class SearchHitMapping { */ private SearchHits mapInnerDocuments(SearchHits searchHits, Class type) { - if (searchHits.getTotalHits() == 0) { + if (searchHits.isEmpty()) { return searchHits; } @@ -239,7 +241,7 @@ class SearchHitMapping { searchHits.getSuggest()); } } catch (Exception e) { - LOGGER.warn("Could not map inner_hits", e); + throw new UncategorizedElasticsearchException("Unable to convert inner hits.", e); } return searchHits; 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 60a911f82..a86235852 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -2783,6 +2783,33 @@ public abstract class ElasticsearchTemplateTests { assertThat(searchHits.getSearchHit(1).getInnerHits("innerHits").getTotalHits()).isEqualTo(1); } + @Test // #1997 + @DisplayName("should return document with inner hits size zero") + void shouldReturnDocumentWithInnerHitsSizeZero() { + + // given + SampleEntity sampleEntity = SampleEntity.builder().id(nextIdAsString()).message("message 1").rate(1) + .version(System.currentTimeMillis()).build(); + + List indexQueries = getIndexQueries(Arrays.asList(sampleEntity)); + + operations.bulkIndex(indexQueries, IndexCoordinates.of(indexNameProvider.indexName())); + + NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withCollapseBuilder(new CollapseBuilder("rate").setInnerHits(new InnerHitBuilder("innerHits").setSize(0))) + .build(); + + // when + SearchHits searchHits = operations.search(searchQuery, SampleEntity.class, + IndexCoordinates.of(indexNameProvider.indexName())); + + // then + assertThat(searchHits).isNotNull(); + assertThat(searchHits.getTotalHits()).isEqualTo(1); + assertThat(searchHits.getSearchHits()).hasSize(1); + assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("message 1"); + } + private IndexQuery getIndexQuery(SampleEntity sampleEntity) { return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity) .withVersion(sampleEntity.getVersion()).build();