Skip to content

Commit 5b82f64

Browse files
committed
Create unit test for NativeSearchQueryBuilder
- add validate conditions in searchAfter() - cause SearchAfterBuilder.setSortValues() assert not allow empty values - delete not appropriate tests for searchAfter in SearchAfterIntegrationTests
1 parent 5a66569 commit 5b82f64

File tree

3 files changed

+53
-41
lines changed

3 files changed

+53
-41
lines changed

src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java

+4
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,10 @@ public NativeSearchQueryBuilder withSuggestBuilder(SuggestBuilder suggestBuilder
345345
}
346346

347347
public NativeSearchQueryBuilder withSearchAfter(List<Object> searchAfter) {
348+
if (searchAfter != null && searchAfter.isEmpty()) {
349+
return this;
350+
}
351+
348352
this.searchAfter = searchAfter;
349353
return this;
350354
}

src/test/java/org/springframework/data/elasticsearch/core/paginating/SearchAfterIntegrationTests.java

+2-41
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core.paginating;
1717

18-
import static org.assertj.core.api.Assertions.assertThat;
19-
import static org.assertj.core.api.Assertions.fail;
18+
import static org.assertj.core.api.Assertions.*;
2019

2120
import java.util.ArrayList;
2221
import java.util.List;
2322
import java.util.stream.Collectors;
2423
import java.util.stream.IntStream;
2524

26-
import org.elasticsearch.search.sort.SortBuilders;
27-
import org.elasticsearch.search.sort.SortOrder;
2825
import org.junit.jupiter.api.DisplayName;
2926
import org.junit.jupiter.api.Test;
3027
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,7 +33,6 @@
3633
import org.springframework.data.elasticsearch.annotations.FieldType;
3734
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
3835
import org.springframework.data.elasticsearch.core.SearchHits;
39-
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
4036
import org.springframework.data.elasticsearch.core.query.Query;
4137
import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest;
4238
import org.springframework.lang.Nullable;
@@ -61,7 +57,7 @@ void shouldReadPagesWithSearchAfter() {
6157
query.setPageable(PageRequest.of(0, 3));
6258
query.addSort(Sort.by(Sort.Direction.ASC, "id"));
6359

64-
List<Object> searchAfter = null;
60+
List<Object> searchAfter = new ArrayList<>();
6561
List<Entity> foundEntities = new ArrayList<>();
6662

6763
int loop = 0;
@@ -83,41 +79,6 @@ void shouldReadPagesWithSearchAfter() {
8379
assertThat(foundEntities).containsExactlyElementsOf(entities);
8480
}
8581

86-
@Test // #2105
87-
@DisplayName("should read pages with search_after using native search query")
88-
void shouldReadPagesWithSearchAfterUsingNativeSearchQuery() {
89-
90-
List<Entity> entities = IntStream.rangeClosed(1, 10).mapToObj(i -> new Entity((long) i, "message " + i))
91-
.collect(Collectors.toList());
92-
operations.save(entities);
93-
94-
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
95-
96-
nativeSearchQueryBuilder.withPageable(PageRequest.of(0, 3));
97-
nativeSearchQueryBuilder.withSorts(SortBuilders.fieldSort("id").order(SortOrder.ASC));
98-
99-
List<Object> searchAfter = null;
100-
List<Entity> foundEntities = new ArrayList<>();
101-
102-
int loop = 0;
103-
do {
104-
nativeSearchQueryBuilder.withSearchAfter(searchAfter);
105-
SearchHits<Entity> searchHits = operations.search(nativeSearchQueryBuilder.build(), Entity.class);
106-
107-
if (searchHits.getSearchHits().size() == 0) {
108-
break;
109-
}
110-
foundEntities.addAll(searchHits.stream().map(searchHit -> searchHit.getContent()).collect(Collectors.toList()));
111-
searchAfter = searchHits.getSearchHit((int) (searchHits.getSearchHits().size() - 1)).getSortValues();
112-
113-
if (++loop > 10) {
114-
fail("loop not terminating");
115-
}
116-
} while (true);
117-
118-
assertThat(foundEntities).containsExactlyElementsOf(entities);
119-
}
120-
12182
@Document(indexName = "test-search-after")
12283
private static class Entity {
12384
@Nullable
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.springframework.data.elasticsearch.core.query;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.List;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
import com.google.common.collect.Lists;
10+
11+
/**
12+
* @author owen.qq
13+
*/
14+
public class NativeSearchQueryBuilderTests {
15+
16+
@Test // #2105
17+
void shouldContainEffectiveSearchAfterValue() {
18+
Long lastSortValue = 1L;
19+
List<Object> searchAfter = Lists.newArrayList(lastSortValue);
20+
21+
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
22+
nativeSearchQueryBuilder.withSearchAfter(searchAfter);
23+
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
24+
25+
assertThat(nativeSearchQuery.getSearchAfter()).isNotNull();
26+
}
27+
28+
@Test // #2105
29+
void shouldIgnoreNullableSearchAfterValue() {
30+
List<Object> emptySearchValueByFirstSearch = null;
31+
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
32+
nativeSearchQueryBuilder.withSearchAfter(emptySearchValueByFirstSearch);
33+
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
34+
35+
assertThat(nativeSearchQuery.getSearchAfter()).isNull();
36+
}
37+
38+
@Test // #2105
39+
void shouldIgnoreEmptySearchAfterValue() {
40+
List<Object> emptySearchValueByFirstSearch = Lists.newArrayList();
41+
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
42+
nativeSearchQueryBuilder.withSearchAfter(emptySearchValueByFirstSearch);
43+
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
44+
45+
assertThat(nativeSearchQuery.getSearchAfter()).isNull();
46+
}
47+
}

0 commit comments

Comments
 (0)