From 9045368408dd7361f2c7fc6f4711efaf7098adbb Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Fri, 22 Jul 2022 21:55:10 +0200 Subject: [PATCH] Fix exists query for imperative repository implementation. Closes #2162 --- .../query/ElasticsearchPartQuery.java | 3 +++ .../QueryKeywordsIntegrationTests.java | 13 ++++++++++++ ...ReactiveQueryKeywordsIntegrationTests.java | 20 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java index f9923b226..cea66fe49 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java @@ -128,6 +128,9 @@ public Object execute(Object[] parameters) { } else if (tree.isCountProjection()) { result = elasticsearchOperations.count(query, clazz, index); + } else if (tree.isExistsProjection()) { + long count = elasticsearchOperations.count(query, clazz, index); + result = count > 0; } else { result = elasticsearchOperations.searchOne(query, clazz, index); } diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/QueryKeywordsIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/QueryKeywordsIntegrationTests.java index 3307b2cf2..f10eed3f0 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/QueryKeywordsIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/QueryKeywordsIntegrationTests.java @@ -310,6 +310,17 @@ void shouldFindByNonEmptyProperty() { assertThat(searchHits.getTotalHits()).isEqualTo(5); } + @Test // #2162 + @DisplayName("should run exists query") + void shouldRunExistsQuery() { + + Boolean existsCaneSugar = repository.existsByText("Cane sugar"); + Boolean existsSand = repository.existsByText("Sand"); + + assertThat(existsCaneSugar).isTrue(); + assertThat(existsSand).isFalse(); + } + @SuppressWarnings("unused") @Document(indexName = "#{@indexNameProvider.indexName()}") static class Product { @@ -452,6 +463,8 @@ interface ProductRepository extends ElasticsearchRepository { SearchHits findByNameEmpty(); SearchHits findByNameNotEmpty(); + + Boolean existsByText(String text); } } diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/ReactiveQueryKeywordsIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/ReactiveQueryKeywordsIntegrationTests.java index 63857df87..2f2bfc665 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/ReactiveQueryKeywordsIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/keywords/ReactiveQueryKeywordsIntegrationTests.java @@ -19,8 +19,11 @@ import static org.springframework.data.elasticsearch.annotations.FieldType.*; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import reactor.test.StepVerifier; +import java.lang.Boolean; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Order; @@ -121,6 +124,21 @@ void shouldFindByNotEmptyProperty() { }).verifyComplete(); } + @Test // #2162 + @DisplayName("should run exists query") + void shouldRunExistsQuery() { + + loadEntities(); + repository.existsByMessage("message") // + .as(StepVerifier::create) // + .expectNext(true) // + .verifyComplete(); + repository.existsByMessage("without") // + .as(StepVerifier::create) // + .expectNext(false) // + .verifyComplete(); + } + @SuppressWarnings("SpringDataMethodInconsistencyInspection") interface SampleRepository extends ReactiveElasticsearchRepository { Flux> findByMessageExists(); @@ -132,6 +150,8 @@ interface SampleRepository extends ReactiveElasticsearchRepository> findByMessageIsNotEmpty(); Flux> findByMessageIsEmpty(); + + Mono existsByMessage(String message); } private void loadEntities() {