Skip to content

Commit 4f3aa52

Browse files
xhaggisothawo
authored andcommitted
Fix IndexOutOfBoundsException when try to map inner hits with no results returned.
Original Pull Request #1998 Closes #1997 Co-authored-by: Peter-Josef Meisch <[email protected]> (cherry picked from commit 49324a3)
1 parent 3256a2b commit 4f3aa52

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

Diff for: src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java

+4-2
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.core.convert.ElasticsearchConverter;
2829
import org.springframework.data.elasticsearch.core.document.Document;
2930
import org.springframework.data.elasticsearch.core.document.NestedMetaData;
@@ -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
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;

Diff for: src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

+27
Original file line numberDiff line numberDiff line change
@@ -2783,6 +2783,33 @@ public void shouldReturnDocumentWithCollapsedFieldAndInnerHits() {
27832783
assertThat(searchHits.getSearchHit(1).getInnerHits("innerHits").getTotalHits()).isEqualTo(1);
27842784
}
27852785

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

0 commit comments

Comments
 (0)