Skip to content

Commit 88d8b36

Browse files
committed
Fix IndexOutOfBoundsException when try to map inner hits with no results returned
1 parent 45b4c99 commit 88d8b36

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import org.slf4j.Logger;
2626
import org.slf4j.LoggerFactory;
27+
import org.springframework.data.elasticsearch.UncategorizedElasticsearchException;
2728
import org.springframework.data.elasticsearch.backend.elasticsearch7.document.SearchDocumentResponse;
2829
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
2930
import org.springframework.data.elasticsearch.core.document.Document;
@@ -45,6 +46,7 @@
4546
* @author Mark Paluch
4647
* @author Roman Puchkovskiy
4748
* @author Matt Gilene
49+
* @author Sascha Woo
4850
* @since 4.0
4951
*/
5052
public class SearchHitMapping<T> {
@@ -194,7 +196,7 @@ private Map<String, SearchHits<?>> mapInnerHits(SearchDocument searchDocument) {
194196
*/
195197
private SearchHits<?> mapInnerDocuments(SearchHits<SearchDocument> searchHits, Class<T> type) {
196198

197-
if (searchHits.getTotalHits() == 0) {
199+
if (searchHits.isEmpty()) {
198200
return searchHits;
199201
}
200202

@@ -239,7 +241,7 @@ private SearchHits<?> mapInnerDocuments(SearchHits<SearchDocument> searchHits, C
239241
searchHits.getSuggest());
240242
}
241243
} catch (Exception e) {
242-
LOGGER.warn("Could not map inner_hits", e);
244+
throw new UncategorizedElasticsearchException("Unable to convert inner hits.", e);
243245
}
244246

245247
return searchHits;

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2787,6 +2787,33 @@ public void shouldReturnDocumentWithCollapsedFieldAndInnerHits() {
27872787
assertThat(searchHits.getSearchHit(1).getInnerHits("innerHits").getTotalHits()).isEqualTo(1);
27882788
}
27892789

2790+
@Test // #1997
2791+
@DisplayName("should return document with inner hits size zero")
2792+
void shouldReturnDocumentWithInnerHitsSizeZero() {
2793+
2794+
// given
2795+
SampleEntity sampleEntity = SampleEntity.builder().id(nextIdAsString()).message("message 1").rate(1)
2796+
.version(System.currentTimeMillis()).build();
2797+
2798+
List<IndexQuery> indexQueries = getIndexQueries(Arrays.asList(sampleEntity));
2799+
2800+
operations.bulkIndex(indexQueries, IndexCoordinates.of(indexNameProvider.indexName()));
2801+
2802+
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
2803+
.withCollapseBuilder(new CollapseBuilder("rate").setInnerHits(new InnerHitBuilder("innerHits").setSize(0)))
2804+
.build();
2805+
2806+
// when
2807+
SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class,
2808+
IndexCoordinates.of(indexNameProvider.indexName()));
2809+
2810+
// then
2811+
assertThat(searchHits).isNotNull();
2812+
assertThat(searchHits.getTotalHits()).isEqualTo(1);
2813+
assertThat(searchHits.getSearchHits()).hasSize(1);
2814+
assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("message 1");
2815+
}
2816+
27902817
private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
27912818
return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity)
27922819
.withVersion(sampleEntity.getVersion()).build();

0 commit comments

Comments
 (0)