DATAES-457 - ElasticsearchTemplate.prepareScroll() does not add sorting.

Original pull request: #273
This commit is contained in:
Dmitriy Yakovlev 2019-04-18 17:35:19 +03:00 committed by xhaggi
parent 4ab8af5116
commit eb15c114b8
3 changed files with 153 additions and 33 deletions

View File

@ -945,6 +945,11 @@ public class ElasticsearchRestTemplate
if (!isEmpty(query.getFields())) {
searchSourceBuilder.fetchSource(toArray(query.getFields()), null);
}
if (query.getSort() != null) {
prepareSort(query, searchSourceBuilder);
}
request.source(searchSourceBuilder);
return request;
}
@ -992,6 +997,12 @@ public class ElasticsearchRestTemplate
}
request.source().version(true);
if (!isEmpty(searchQuery.getElasticsearchSorts())) {
for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
request.source().sort(sort);
}
}
try {
return client.search(request);
} catch (IOException e) {
@ -1304,6 +1315,17 @@ public class ElasticsearchRestTemplate
}
if (query.getSort() != null) {
prepareSort(query, sourceBuilder);
}
if (query.getMinScore() > 0) {
sourceBuilder.minScore(query.getMinScore());
}
request.source(sourceBuilder);
return request;
}
private void prepareSort(Query query, SearchSourceBuilder sourceBuilder) {
for (Sort.Order order : query.getSort()) {
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
@ -1316,13 +1338,6 @@ public class ElasticsearchRestTemplate
}
}
if (query.getMinScore() > 0) {
sourceBuilder.minScore(query.getMinScore());
}
request.source(sourceBuilder);
return request;
}
private IndexRequest prepareIndex(IndexQuery query) {
try {
String indexName = StringUtils.isEmpty(query.getIndexName())

View File

@ -825,6 +825,11 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
if (!isEmpty(query.getFields())) {
requestBuilder.setFetchSource(toArray(query.getFields()), null);
}
if (query.getSort() != null) {
prepareSort(query, requestBuilder);
}
return requestBuilder;
}
@ -859,6 +864,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
requestBuilder.setPostFilter(searchQuery.getFilter());
}
if (!isEmpty(searchQuery.getElasticsearchSorts())) {
for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
requestBuilder.addSort(sort);
}
}
return getSearchResponse(requestBuilder.setQuery(searchQuery.getQuery()));
}
@ -1110,6 +1121,16 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
}
if (query.getSort() != null) {
prepareSort(query, searchRequestBuilder);
}
if (query.getMinScore() > 0) {
searchRequestBuilder.setMinScore(query.getMinScore());
}
return searchRequestBuilder;
}
private void prepareSort(Query query, SearchRequestBuilder searchRequestBuilder) {
for (Sort.Order order : query.getSort()) {
SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC;
@ -1135,12 +1156,6 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
}
}
if (query.getMinScore() > 0) {
searchRequestBuilder.setMinScore(query.getMinScore());
}
return searchRequestBuilder;
}
private IndexRequestBuilder prepareIndex(IndexQuery query) {
try {
String indexName = StringUtils.isEmpty(query.getIndexName())

View File

@ -2717,6 +2717,96 @@ public class ElasticsearchTemplateTests {
everyItem(nullValue()));
}
@Test //DATAES-457
public void shouldSortResultsGivenSortCriteriaWithScanAndScroll() {
// given
List<IndexQuery> indexQueries = new ArrayList<>();
// first document
String documentId = randomNumeric(5);
SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("abc").rate(10)
.version(System.currentTimeMillis()).build();
// second document
String documentId2 = randomNumeric(5);
SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("xyz").rate(5)
.version(System.currentTimeMillis()).build();
// third document
String documentId3 = randomNumeric(5);
SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3).message("xyz").rate(10)
.version(System.currentTimeMillis()).build();
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withSort(new FieldSortBuilder("rate").order(SortOrder.ASC))
.withSort(new FieldSortBuilder("message").order(SortOrder.DESC)).withPageable(PageRequest.of(0, 10))
.build();
// when
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
.startScroll(1000, searchQuery, SampleEntity.class);
List<SampleEntity> sampleEntities = new ArrayList<>();
while (scroll.hasContent()) {
sampleEntities.addAll(scroll.getContent());
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
.continueScroll(scroll.getScrollId(), 1000, SampleEntity.class);
}
// then
assertThat(sampleEntities.size(), equalTo(3));
assertThat(sampleEntities.get(0).getRate(), is(sampleEntity2.getRate()));
assertThat(sampleEntities.get(1).getRate(), is(sampleEntity3.getRate()));
assertThat(sampleEntities.get(1).getMessage(), is(sampleEntity3.getMessage()));
assertThat(sampleEntities.get(2).getRate(), is(sampleEntity1.getRate()));
assertThat(sampleEntities.get(2).getMessage(), is(sampleEntity1.getMessage()));
}
@Test //DATAES-457
public void shouldSortResultsGivenSortCriteriaFromPageableWithScanAndScroll() {
// given
List<IndexQuery> indexQueries = new ArrayList<>();
// first document
String documentId = randomNumeric(5);
SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("abc").rate(10)
.version(System.currentTimeMillis()).build();
// second document
String documentId2 = randomNumeric(5);
SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("xyz").rate(5)
.version(System.currentTimeMillis()).build();
// third document
String documentId3 = randomNumeric(5);
SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3).message("xyz").rate(10)
.version(System.currentTimeMillis()).build();
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(
PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "rate").and(Sort.by(Sort.Direction.DESC, "message"))))
.build();
// when
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
.startScroll(1000, searchQuery, SampleEntity.class);
List<SampleEntity> sampleEntities = new ArrayList<>();
while (scroll.hasContent()) {
sampleEntities.addAll(scroll.getContent());
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
.continueScroll(scroll.getScrollId(), 1000, SampleEntity.class);
}
// then
assertThat(sampleEntities.size(), equalTo(3));
assertThat(sampleEntities.get(0).getRate(), is(sampleEntity2.getRate()));
assertThat(sampleEntities.get(1).getRate(), is(sampleEntity3.getRate()));
assertThat(sampleEntities.get(1).getMessage(), is(sampleEntity3.getMessage()));
assertThat(sampleEntities.get(2).getRate(), is(sampleEntity1.getRate()));
assertThat(sampleEntities.get(2).getMessage(), is(sampleEntity1.getMessage()));
}
private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
return new IndexQueryBuilder()