From e41866fc5468f3e8c03d7068cad276e250c36074 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Thu, 13 May 2021 16:46:44 +0200 Subject: [PATCH] SearchPage result in StringQuery methods. Closes #1811 --- .../query/ElasticsearchStringQuery.java | 11 +++++++-- .../CustomMethodRepositoryBaseTests.java | 24 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java index 81cc926b0..3f5e9ed83 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java @@ -74,7 +74,12 @@ public Object execute(Object[] parameters) { } else if (queryMethod.isPageQuery()) { stringQuery.setPageable(accessor.getPageable()); SearchHits searchHits = elasticsearchOperations.search(stringQuery, clazz, index); - result = SearchHitSupport.searchPageFor(searchHits, stringQuery.getPageable()); + if (queryMethod.isSearchPageMethod()) { + result = SearchHitSupport.searchPageFor(searchHits, stringQuery.getPageable()); + } else { + result = SearchHitSupport + .unwrapSearchHits(SearchHitSupport.searchPageFor(searchHits, stringQuery.getPageable())); + } } else if (queryMethod.isStreamQuery()) { if (accessor.getPageable().isUnpaged()) { stringQuery.setPageable(PageRequest.of(0, DEFAULT_STREAM_BATCH_SIZE)); @@ -91,7 +96,9 @@ public Object execute(Object[] parameters) { result = elasticsearchOperations.searchOne(stringQuery, clazz, index); } - return queryMethod.isNotSearchHitMethod() ? SearchHitSupport.unwrapSearchHits(result) : result; + return (queryMethod.isNotSearchHitMethod() && queryMethod.isNotSearchPageMethod()) + ? SearchHitSupport.unwrapSearchHits(result) + : result; } protected StringQuery createQuery(ParametersParameterAccessor parameterAccessor) { diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryBaseTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryBaseTests.java index 4284f03ab..81665558f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryBaseTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryBaseTests.java @@ -1593,11 +1593,27 @@ void shouldReturnSearchPage() { assertThat((nextPageable.getPageNumber())).isEqualTo(1); } + @Test // #1811 + @DisplayName("should return SearchPage with query") + void shouldReturnSearchPageWithQuery() { + List entities = createSampleEntities("abc", 20); + repository.saveAll(entities); + + SearchPage searchPage = repository.searchWithQueryByMessage("Message", PageRequest.of(0, 10)); + + assertThat(searchPage).isNotNull(); + SearchHits searchHits = searchPage.getSearchHits(); + assertThat(searchHits).isNotNull(); + assertThat((searchHits.getTotalHits())).isEqualTo(20); + assertThat(searchHits.getSearchHits()).hasSize(10); + Pageable nextPageable = searchPage.nextPageable(); + assertThat((nextPageable.getPageNumber())).isEqualTo(1); + } + private List createSampleEntities(String type, int numberOfEntities) { List entities = new ArrayList<>(); for (int i = 0; i < numberOfEntities; i++) { - SampleEntity entity = new SampleEntity(); entity.setId(UUID.randomUUID().toString()); entity.setAvailable(true); @@ -1633,8 +1649,7 @@ void shouldStreamSearchHitsWithQueryAnnotatedMethod() { @Document(indexName = "test-index-sample-repositories-custom-method") static class SampleEntity { - @Nullable - @Id private String id; + @Nullable @Id private String id; @Nullable @Field(type = Text, store = true, fielddata = true) private String type; @Nullable @Field(type = Text, store = true, fielddata = true) private String message; @Nullable @Field(type = Keyword) private String keyword; @@ -1836,6 +1851,9 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository searchByMessage(String message, Pageable pageable); + @Query("{\"match\": {\"message\": \"?0\"}}") + SearchPage searchWithQueryByMessage(String message, Pageable pageable); + @CountQuery("{\"bool\" : {\"must\" : {\"term\" : {\"type\" : \"?0\"}}}}") long countWithQueryByType(String type); }