diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java index 19e62236f..9dc7a5ddc 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java @@ -50,6 +50,7 @@ * @author Peter-Josef Meisch * @author Peer Mueller * @author vdisk + * @author owen.qq */ public class NativeSearchQueryBuilder { @@ -80,6 +81,7 @@ public class NativeSearchQueryBuilder { @Nullable private Duration timeout; private final List rescorerQueries = new ArrayList<>(); @Nullable private SuggestBuilder suggestBuilder; + @Nullable private List searchAfter; public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) { this.queryBuilder = queryBuilder; @@ -342,6 +344,15 @@ public NativeSearchQueryBuilder withSuggestBuilder(SuggestBuilder suggestBuilder return this; } + public NativeSearchQueryBuilder withSearchAfter(List searchAfter) { + if (searchAfter != null && searchAfter.isEmpty()) { + return this; + } + + this.searchAfter = searchAfter; + return this; + } + public NativeSearchQuery build() { NativeSearchQuery nativeSearchQuery = new NativeSearchQuery( // @@ -431,6 +442,11 @@ public NativeSearchQuery build() { if (suggestBuilder != null) { nativeSearchQuery.setSuggestBuilder(suggestBuilder); } + + if (searchAfter != null) { + nativeSearchQuery.setSearchAfter(searchAfter); + } + return nativeSearchQuery; } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilderTests.java b/src/test/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilderTests.java new file mode 100644 index 000000000..724f5e7b8 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilderTests.java @@ -0,0 +1,47 @@ +package org.springframework.data.elasticsearch.core.query; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.Lists; + +/** + * @author owen.qq + */ +public class NativeSearchQueryBuilderTests { + + @Test // #2105 + void shouldContainEffectiveSearchAfterValue() { + Long lastSortValue = 1L; + List searchAfter = Lists.newArrayList(lastSortValue); + + NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); + nativeSearchQueryBuilder.withSearchAfter(searchAfter); + NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build(); + + assertThat(nativeSearchQuery.getSearchAfter()).isNotNull(); + } + + @Test // #2105 + void shouldIgnoreNullableSearchAfterValue() { + List emptySearchValueByFirstSearch = null; + NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); + nativeSearchQueryBuilder.withSearchAfter(emptySearchValueByFirstSearch); + NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build(); + + assertThat(nativeSearchQuery.getSearchAfter()).isNull(); + } + + @Test // #2105 + void shouldIgnoreEmptySearchAfterValue() { + List emptySearchValueByFirstSearch = Lists.newArrayList(); + NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); + nativeSearchQueryBuilder.withSearchAfter(emptySearchValueByFirstSearch); + NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build(); + + assertThat(nativeSearchQuery.getSearchAfter()).isNull(); + } +}