Fix @Query method implementation for unpaged queries.

Original Pull Request #1919 
Closes #1917
This commit is contained in:
Peter-Josef Meisch 2021-09-03 21:36:57 +02:00 committed by GitHub
parent 35c7ef4fed
commit e71758686c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 24 deletions

View File

@ -16,6 +16,7 @@
package org.springframework.data.elasticsearch.repository.query; package org.springframework.data.elasticsearch.repository.query;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHitSupport; import org.springframework.data.elasticsearch.core.SearchHitSupport;
import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.SearchHits;
@ -81,16 +82,11 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue
.unwrapSearchHits(SearchHitSupport.searchPageFor(searchHits, stringQuery.getPageable())); .unwrapSearchHits(SearchHitSupport.searchPageFor(searchHits, stringQuery.getPageable()));
} }
} else if (queryMethod.isStreamQuery()) { } else if (queryMethod.isStreamQuery()) {
if (accessor.getPageable().isUnpaged()) { stringQuery.setPageable(
stringQuery.setPageable(PageRequest.of(0, DEFAULT_STREAM_BATCH_SIZE)); accessor.getPageable().isPaged() ? accessor.getPageable() : PageRequest.of(0, DEFAULT_STREAM_BATCH_SIZE));
} else {
stringQuery.setPageable(accessor.getPageable());
}
result = StreamUtils.createStreamFromIterator(elasticsearchOperations.searchForStream(stringQuery, clazz, index)); result = StreamUtils.createStreamFromIterator(elasticsearchOperations.searchForStream(stringQuery, clazz, index));
} else if (queryMethod.isCollectionQuery()) { } else if (queryMethod.isCollectionQuery()) {
if (accessor.getPageable().isPaged()) { stringQuery.setPageable(accessor.getPageable().isPaged() ? accessor.getPageable() : Pageable.unpaged());
stringQuery.setPageable(accessor.getPageable());
}
result = elasticsearchOperations.search(stringQuery, clazz, index); result = elasticsearchOperations.search(stringQuery, clazz, index);
} else { } else {
result = elasticsearchOperations.searchOne(stringQuery, clazz, index); result = elasticsearchOperations.searchOne(stringQuery, clazz, index);

View File

@ -1612,19 +1612,18 @@ public abstract class CustomMethodRepositoryBaseTests {
assertThat((nextPageable.getPageNumber())).isEqualTo(1); assertThat((nextPageable.getPageNumber())).isEqualTo(1);
} }
private List<SampleEntity> createSampleEntities(String type, int numberOfEntities) { @Test // #1917
@DisplayName("shouldReturnAllDocumentsWithUnpagedQuery")
void shouldReturnAllDocumentsWithUnpagedQuery() {
List<SampleEntity> entities = new ArrayList<>(); List<SampleEntity> entities = createSampleEntities("abc", 20);
for (int i = 0; i < numberOfEntities; i++) { repository.saveAll(entities);
SampleEntity entity = new SampleEntity();
entity.setId(UUID.randomUUID().toString());
entity.setAvailable(true);
entity.setMessage("Message");
entity.setType(type);
entities.add(entity);
}
return entities; SearchHits<SampleEntity> searchHits = repository.searchWithQueryByMessageUnpaged("Message");
assertThat(searchHits).isNotNull();
assertThat((searchHits.getTotalHits())).isEqualTo(20);
assertThat(searchHits.getSearchHits()).hasSize(20);
} }
@Test // DATAES-891 @Test // DATAES-891
@ -1649,6 +1648,21 @@ public abstract class CustomMethodRepositoryBaseTests {
assertThat(count).isEqualTo(20); assertThat(count).isEqualTo(20);
} }
private List<SampleEntity> createSampleEntities(String type, int numberOfEntities) {
List<SampleEntity> entities = new ArrayList<>();
for (int i = 0; i < numberOfEntities; i++) {
SampleEntity entity = new SampleEntity();
entity.setId(UUID.randomUUID().toString());
entity.setAvailable(true);
entity.setMessage("Message");
entity.setType(type);
entities.add(entity);
}
return entities;
}
@Document(indexName = "#{@indexNameProvider.indexName()}") @Document(indexName = "#{@indexNameProvider.indexName()}")
static class SampleEntity { static class SampleEntity {
@Nullable @Id private String id; @Nullable @Id private String id;
@ -1857,6 +1871,9 @@ public abstract class CustomMethodRepositoryBaseTests {
@Query("{\"match\": {\"message\": \"?0\"}}") @Query("{\"match\": {\"message\": \"?0\"}}")
SearchPage<SampleEntity> searchWithQueryByMessage(String message, Pageable pageable); SearchPage<SampleEntity> searchWithQueryByMessage(String message, Pageable pageable);
@Query("{\"match\": {\"message\": \"?0\"}}")
SearchHits<SampleEntity> searchWithQueryByMessageUnpaged(String message);
@CountQuery("{\"bool\" : {\"must\" : {\"term\" : {\"type\" : \"?0\"}}}}") @CountQuery("{\"bool\" : {\"must\" : {\"term\" : {\"type\" : \"?0\"}}}}")
long countWithQueryByType(String type); long countWithQueryByType(String type);
} }

View File

@ -28,6 +28,7 @@ import java.lang.Long;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import org.elasticsearch.ElasticsearchStatusException; import org.elasticsearch.ElasticsearchStatusException;
@ -541,14 +542,36 @@ class SimpleReactiveElasticsearchRepositoryTests {
@Test // DATAES-519 @Test // DATAES-519
void annotatedFinderMethodShouldBeExecutedCorrectly() { void annotatedFinderMethodShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "message"), // int count = 30;
new SampleEntity("id-two", "test message"), // SampleEntity[] sampleEntities = IntStream.range(1, count + 1)
new SampleEntity("id-three", "test test")) // .mapToObj(i -> new SampleEntity("id-" + i, "test " + i)).collect(Collectors.toList())
.block(); .toArray(new SampleEntity[count]);
bulkIndex(sampleEntities).block();
repository.findAllViaAnnotatedQueryByMessageLike("test") // repository.findAllViaAnnotatedQueryByMessageLike("test") //
.as(StepVerifier::create) // .as(StepVerifier::create) //
.expectNextCount(2) // .expectNextCount(count) //
.verifyComplete();
}
@Test // #1917
void annotatedFinderMethodPagedShouldBeExecutedCorrectly() {
int count = 30;
SampleEntity[] sampleEntities = IntStream.range(1, count + 1)
.mapToObj(i -> new SampleEntity("id-" + i, "test " + i)).collect(Collectors.toList())
.toArray(new SampleEntity[count]);
bulkIndex(sampleEntities).block();
repository.findAllViaAnnotatedQueryByMessageLikePaged("test", PageRequest.of(0, 20)) //
.as(StepVerifier::create) //
.expectNextCount(20) //
.verifyComplete();
repository.findAllViaAnnotatedQueryByMessageLikePaged("test", PageRequest.of(1, 20)) //
.as(StepVerifier::create) //
.expectNextCount(10) //
.verifyComplete(); .verifyComplete();
} }
@ -596,6 +619,9 @@ class SimpleReactiveElasticsearchRepositoryTests {
@Query("{ \"bool\" : { \"must\" : { \"term\" : { \"message\" : \"?0\" } } } }") @Query("{ \"bool\" : { \"must\" : { \"term\" : { \"message\" : \"?0\" } } } }")
Flux<SampleEntity> findAllViaAnnotatedQueryByMessageLike(String message); Flux<SampleEntity> findAllViaAnnotatedQueryByMessageLike(String message);
@Query("{ \"bool\" : { \"must\" : { \"term\" : { \"message\" : \"?0\" } } } }")
Flux<SampleEntity> findAllViaAnnotatedQueryByMessageLikePaged(String message, Pageable pageable);
Mono<SampleEntity> findFirstByMessageLike(String message); Mono<SampleEntity> findFirstByMessageLike(String message);
Mono<Long> countAllByMessage(String message); Mono<Long> countAllByMessage(String message);