Skip to content

Commit a833c89

Browse files
committed
DATAES-39 : SearchResultMapper support for scroll and queryForPage
1 parent f824f4f commit a833c89

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,17 @@ public interface ElasticsearchOperations {
310310
*/
311311
<T> Page<T> scroll(String scrollId, long scrollTimeInMillis, Class<T> clazz);
312312

313+
/**
314+
* Scrolls the results for give scroll id using custom result mapper
315+
*
316+
* @param scrollId
317+
* @param scrollTimeInMillis
318+
* @param mapper
319+
* @param <T>
320+
* @return
321+
*/
322+
<T> Page<T> scroll(String scrollId, long scrollTimeInMillis, SearchResultMapper mapper);
323+
313324
/**
314325
* more like this query to search for documents that are "like" a specific document.
315326
*

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,13 @@ public <T> Page<T> scroll(String scrollId, long scrollTimeInMillis, Class<T> cla
367367
return resultsMapper.mapResults(response, clazz, null);
368368
}
369369

370+
@Override
371+
public <T> Page<T> scroll(String scrollId, long scrollTimeInMillis, SearchResultMapper mapper) {
372+
SearchResponse response = client.prepareSearchScroll(scrollId)
373+
.setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute().actionGet();
374+
return mapper.mapResults(response, null, null);
375+
}
376+
370377
@Override
371378
public <T> Page<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz) {
372379
int startRecord = 0;

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,50 @@ public void shouldReturnResultsWithScanAndScroll() {
556556
assertThat(sampleEntities.size(), is(equalTo(30)));
557557
}
558558

559+
@Test
560+
public void shouldReturnResultsForScanAndScrollWithCustomResultMapper() {
561+
//given
562+
List<IndexQuery> entities = createSampleEntitiesWithMessage("Test message", 30);
563+
// when
564+
elasticsearchTemplate.bulkIndex(entities);
565+
elasticsearchTemplate.refresh(SampleEntity.class, true);
566+
// then
567+
568+
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices("test-index")
569+
.withTypes("test-type").withPageable(new PageRequest(0, 10)).build();
570+
571+
String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false);
572+
List<SampleEntity> sampleEntities = new ArrayList<SampleEntity>();
573+
boolean hasRecords = true;
574+
while (hasRecords) {
575+
Page<SampleEntity> page = elasticsearchTemplate.scroll(scrollId, 5000L, new SearchResultMapper() {
576+
@Override
577+
public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
578+
List<SampleEntity> chunk = new ArrayList<SampleEntity>();
579+
for (SearchHit searchHit : response.getHits()) {
580+
if (response.getHits().getHits().length <= 0) {
581+
return null;
582+
}
583+
SampleEntity user = new SampleEntity();
584+
user.setId(searchHit.getId());
585+
user.setMessage((String) searchHit.getSource().get("message"));
586+
chunk.add(user);
587+
}
588+
if (chunk.size() > 0) {
589+
return new FacetedPageImpl<T>((List<T>) chunk);
590+
}
591+
return null;
592+
}
593+
});
594+
if (page != null) {
595+
sampleEntities.addAll(page.getContent());
596+
} else {
597+
hasRecords = false;
598+
}
599+
}
600+
assertThat(sampleEntities.size(), is(equalTo(30)));
601+
}
602+
559603
private static List<IndexQuery> createSampleEntitiesWithMessage(String message, int numberOfEntities) {
560604
List<IndexQuery> indexQueries = new ArrayList<IndexQuery>();
561605
for (int i = 0; i < numberOfEntities; i++) {

0 commit comments

Comments
 (0)