Skip to content

Commit eb15c11

Browse files
hobbutxhaggi
authored andcommitted
DATAES-457 - ElasticsearchTemplate.prepareScroll() does not add sorting.
Original pull request: spring-projects#273
1 parent 4ab8af5 commit eb15c11

File tree

3 files changed

+153
-33
lines changed

3 files changed

+153
-33
lines changed

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

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,11 @@ private SearchRequest prepareScroll(Query query, long scrollTimeInMillis) {
945945
if (!isEmpty(query.getFields())) {
946946
searchSourceBuilder.fetchSource(toArray(query.getFields()), null);
947947
}
948+
949+
if (query.getSort() != null) {
950+
prepareSort(query, searchSourceBuilder);
951+
}
952+
948953
request.source(searchSourceBuilder);
949954
return request;
950955
}
@@ -992,6 +997,12 @@ private SearchResponse doScroll(SearchRequest request, SearchQuery searchQuery)
992997
}
993998
request.source().version(true);
994999

1000+
if (!isEmpty(searchQuery.getElasticsearchSorts())) {
1001+
for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
1002+
request.source().sort(sort);
1003+
}
1004+
}
1005+
9951006
try {
9961007
return client.search(request);
9971008
} catch (IOException e) {
@@ -1304,16 +1315,7 @@ private SearchRequest prepareSearch(Query query, Optional<QueryBuilder> builder)
13041315
}
13051316

13061317
if (query.getSort() != null) {
1307-
for (Sort.Order order : query.getSort()) {
1308-
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
1309-
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
1310-
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1311-
sort.missing("_first");
1312-
} else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1313-
sort.missing("_last");
1314-
}
1315-
sourceBuilder.sort(sort);
1316-
}
1318+
prepareSort(query, sourceBuilder);
13171319
}
13181320

13191321
if (query.getMinScore() > 0) {
@@ -1323,6 +1325,19 @@ private SearchRequest prepareSearch(Query query, Optional<QueryBuilder> builder)
13231325
return request;
13241326
}
13251327

1328+
private void prepareSort(Query query, SearchSourceBuilder sourceBuilder) {
1329+
for (Sort.Order order : query.getSort()) {
1330+
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
1331+
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
1332+
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1333+
sort.missing("_first");
1334+
} else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1335+
sort.missing("_last");
1336+
}
1337+
sourceBuilder.sort(sort);
1338+
}
1339+
}
1340+
13261341
private IndexRequest prepareIndex(IndexQuery query) {
13271342
try {
13281343
String indexName = StringUtils.isEmpty(query.getIndexName())

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

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,11 @@ private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis)
825825
if (!isEmpty(query.getFields())) {
826826
requestBuilder.setFetchSource(toArray(query.getFields()), null);
827827
}
828+
829+
if (query.getSort() != null) {
830+
prepareSort(query, requestBuilder);
831+
}
832+
828833
return requestBuilder;
829834
}
830835

@@ -859,6 +864,12 @@ private SearchResponse doScroll(SearchRequestBuilder requestBuilder, SearchQuery
859864
requestBuilder.setPostFilter(searchQuery.getFilter());
860865
}
861866

867+
if (!isEmpty(searchQuery.getElasticsearchSorts())) {
868+
for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
869+
requestBuilder.addSort(sort);
870+
}
871+
}
872+
862873
return getSearchResponse(requestBuilder.setQuery(searchQuery.getQuery()));
863874
}
864875

@@ -1110,29 +1121,7 @@ private SearchRequestBuilder prepareSearch(Query query) {
11101121
}
11111122

11121123
if (query.getSort() != null) {
1113-
for (Sort.Order order : query.getSort()) {
1114-
SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC;
1115-
1116-
if (FIELD_SCORE.equals(order.getProperty())) {
1117-
ScoreSortBuilder sort = SortBuilders //
1118-
.scoreSort() //
1119-
.order(sortOrder);
1120-
1121-
searchRequestBuilder.addSort(sort);
1122-
} else {
1123-
FieldSortBuilder sort = SortBuilders //
1124-
.fieldSort(order.getProperty()) //
1125-
.order(sortOrder);
1126-
1127-
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1128-
sort.missing("_first");
1129-
} else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1130-
sort.missing("_last");
1131-
}
1132-
1133-
searchRequestBuilder.addSort(sort);
1134-
}
1135-
}
1124+
prepareSort(query, searchRequestBuilder);
11361125
}
11371126

11381127
if (query.getMinScore() > 0) {
@@ -1141,6 +1130,32 @@ private SearchRequestBuilder prepareSearch(Query query) {
11411130
return searchRequestBuilder;
11421131
}
11431132

1133+
private void prepareSort(Query query, SearchRequestBuilder searchRequestBuilder) {
1134+
for (Sort.Order order : query.getSort()) {
1135+
SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC;
1136+
1137+
if (FIELD_SCORE.equals(order.getProperty())) {
1138+
ScoreSortBuilder sort = SortBuilders //
1139+
.scoreSort() //
1140+
.order(sortOrder);
1141+
1142+
searchRequestBuilder.addSort(sort);
1143+
} else {
1144+
FieldSortBuilder sort = SortBuilders //
1145+
.fieldSort(order.getProperty()) //
1146+
.order(sortOrder);
1147+
1148+
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1149+
sort.missing("_first");
1150+
} else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1151+
sort.missing("_last");
1152+
}
1153+
1154+
searchRequestBuilder.addSort(sort);
1155+
}
1156+
}
1157+
}
1158+
11441159
private IndexRequestBuilder prepareIndex(IndexQuery query) {
11451160
try {
11461161
String indexName = StringUtils.isEmpty(query.getIndexName())

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2717,6 +2717,96 @@ public void shouldRespectSourceFilterWithScanAndScrollForGivenSearchQuery() {
27172717
everyItem(nullValue()));
27182718
}
27192719

2720+
@Test //DATAES-457
2721+
public void shouldSortResultsGivenSortCriteriaWithScanAndScroll() {
2722+
// given
2723+
List<IndexQuery> indexQueries = new ArrayList<>();
2724+
// first document
2725+
String documentId = randomNumeric(5);
2726+
SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("abc").rate(10)
2727+
.version(System.currentTimeMillis()).build();
2728+
2729+
// second document
2730+
String documentId2 = randomNumeric(5);
2731+
SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("xyz").rate(5)
2732+
.version(System.currentTimeMillis()).build();
2733+
2734+
// third document
2735+
String documentId3 = randomNumeric(5);
2736+
SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3).message("xyz").rate(10)
2737+
.version(System.currentTimeMillis()).build();
2738+
2739+
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
2740+
2741+
elasticsearchTemplate.bulkIndex(indexQueries);
2742+
elasticsearchTemplate.refresh(SampleEntity.class);
2743+
2744+
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
2745+
.withSort(new FieldSortBuilder("rate").order(SortOrder.ASC))
2746+
.withSort(new FieldSortBuilder("message").order(SortOrder.DESC)).withPageable(PageRequest.of(0, 10))
2747+
.build();
2748+
// when
2749+
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
2750+
.startScroll(1000, searchQuery, SampleEntity.class);
2751+
List<SampleEntity> sampleEntities = new ArrayList<>();
2752+
while (scroll.hasContent()) {
2753+
sampleEntities.addAll(scroll.getContent());
2754+
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
2755+
.continueScroll(scroll.getScrollId(), 1000, SampleEntity.class);
2756+
}
2757+
// then
2758+
assertThat(sampleEntities.size(), equalTo(3));
2759+
assertThat(sampleEntities.get(0).getRate(), is(sampleEntity2.getRate()));
2760+
assertThat(sampleEntities.get(1).getRate(), is(sampleEntity3.getRate()));
2761+
assertThat(sampleEntities.get(1).getMessage(), is(sampleEntity3.getMessage()));
2762+
assertThat(sampleEntities.get(2).getRate(), is(sampleEntity1.getRate()));
2763+
assertThat(sampleEntities.get(2).getMessage(), is(sampleEntity1.getMessage()));
2764+
}
2765+
2766+
@Test //DATAES-457
2767+
public void shouldSortResultsGivenSortCriteriaFromPageableWithScanAndScroll() {
2768+
// given
2769+
List<IndexQuery> indexQueries = new ArrayList<>();
2770+
// first document
2771+
String documentId = randomNumeric(5);
2772+
SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("abc").rate(10)
2773+
.version(System.currentTimeMillis()).build();
2774+
2775+
// second document
2776+
String documentId2 = randomNumeric(5);
2777+
SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("xyz").rate(5)
2778+
.version(System.currentTimeMillis()).build();
2779+
2780+
// third document
2781+
String documentId3 = randomNumeric(5);
2782+
SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3).message("xyz").rate(10)
2783+
.version(System.currentTimeMillis()).build();
2784+
2785+
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
2786+
2787+
elasticsearchTemplate.bulkIndex(indexQueries);
2788+
elasticsearchTemplate.refresh(SampleEntity.class);
2789+
2790+
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(
2791+
PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "rate").and(Sort.by(Sort.Direction.DESC, "message"))))
2792+
.build();
2793+
// when
2794+
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
2795+
.startScroll(1000, searchQuery, SampleEntity.class);
2796+
List<SampleEntity> sampleEntities = new ArrayList<>();
2797+
while (scroll.hasContent()) {
2798+
sampleEntities.addAll(scroll.getContent());
2799+
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
2800+
.continueScroll(scroll.getScrollId(), 1000, SampleEntity.class);
2801+
}
2802+
// then
2803+
assertThat(sampleEntities.size(), equalTo(3));
2804+
assertThat(sampleEntities.get(0).getRate(), is(sampleEntity2.getRate()));
2805+
assertThat(sampleEntities.get(1).getRate(), is(sampleEntity3.getRate()));
2806+
assertThat(sampleEntities.get(1).getMessage(), is(sampleEntity3.getMessage()));
2807+
assertThat(sampleEntities.get(2).getRate(), is(sampleEntity1.getRate()));
2808+
assertThat(sampleEntities.get(2).getMessage(), is(sampleEntity1.getMessage()));
2809+
}
27202810

27212811
private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
27222812
return new IndexQueryBuilder()

0 commit comments

Comments
 (0)