DATAES-717 - Enable Repositories to return a SearchHits instance instead of a list.

Original PR: #372
This commit is contained in:
Peter-Josef Meisch
2020-01-03 23:20:17 +01:00
committed by GitHub
parent e2d4ed96c8
commit 0d272fe9bf
15 changed files with 304 additions and 22 deletions

View File

@@ -30,6 +30,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.AfterEach;
@@ -48,6 +49,8 @@ import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.geo.GeoBox;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest;
@@ -379,7 +382,7 @@ public abstract class CustomMethodRepositoryBaseTests {
List<SampleEntity> list = repository.findByKeywordIn(keywords);
// then
assertThat(list).hasSize(1);
assertThat(list).hasSize(1);
assertThat(list.get(0).getId()).isEqualTo(documentId1);
}
@@ -1366,6 +1369,53 @@ public abstract class CustomMethodRepositoryBaseTests {
stream.forEach(o -> assertThat(o).isInstanceOf(SampleEntity.class));
}
@Test // DATAES-717
void shouldReturnSearchHits() {
List<SampleEntity> entities = createSampleEntities("abc", 20);
repository.saveAll(entities);
// when
SearchHits<SampleEntity> searchHits = repository.queryByType("abc");
assertThat(searchHits.getTotalHits()).isEqualTo(20);
}
@Test // DATAES-717
void shouldReturnSearchHitList() {
List<SampleEntity> entities = createSampleEntities("abc", 20);
repository.saveAll(entities);
// when
List<SearchHit<SampleEntity>> searchHitList = repository.queryByMessage("Message");
assertThat(searchHitList).hasSize(20);
}
@Test // DATAES-717
void shouldReturnSearchHitStream() {
List<SampleEntity> entities = createSampleEntities("abc", 20);
repository.saveAll(entities);
// when
Stream<SearchHit<SampleEntity>> searchHitStream = repository.readByMessage("Message");
List<SearchHit<SampleEntity>> searchHitList = searchHitStream //
.peek(searchHit -> assertThat(searchHit.getContent().getType()).isEqualTo("abc")) //
.collect(Collectors.toList());
assertThat(searchHitList).hasSize(20);
}
@Test // DATAES-717
void shouldReturnSearchHitsForStringQuery() {
List<SampleEntity> entities = createSampleEntities("abc", 20);
repository.saveAll(entities);
// when
SearchHits<SampleEntity> searchHits = repository.queryByString("abc");
assertThat(searchHits.getTotalHits()).isEqualTo(20);
}
private List<SampleEntity> createSampleEntities(String type, int numberOfEntities) {
List<SampleEntity> entities = new ArrayList<>();
@@ -1386,8 +1436,7 @@ public abstract class CustomMethodRepositoryBaseTests {
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-sample-repositories-custo-method", replicas = 0,
refreshInterval = "-1")
@Document(indexName = "test-index-sample-repositories-custom-method", replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@@ -1502,6 +1551,15 @@ public abstract class CustomMethodRepositoryBaseTests {
long countByLocationNear(Point point, Distance distance);
long countByLocationNear(GeoPoint point, String distance);
SearchHits<SampleEntity> queryByType(String type);
@Query("{\"bool\": {\"must\": [{\"term\": {\"type\": \"?0\"}}]}}")
SearchHits<SampleEntity> queryByString(String type);
List<SearchHit<SampleEntity>> queryByMessage(String type);
Stream<SearchHit<SampleEntity>> readByMessage(String type);
}
/**

View File

@@ -23,7 +23,6 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.AfterEach;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
@@ -43,6 +42,7 @@ import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.support.WriteRequest.RefreshPolicy;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.reactivestreams.Publisher;
@@ -62,6 +62,7 @@ import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient;
import org.springframework.data.elasticsearch.config.AbstractReactiveElasticsearchConfiguration;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration;
import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest;
import org.springframework.data.elasticsearch.repository.config.EnableReactiveElasticsearchRepositories;
@@ -181,7 +182,8 @@ public class SimpleReactiveElasticsearchRepositoryTests {
repository.findAllById(Arrays.asList("id-one", "id-two")) //
.as(StepVerifier::create)//
.expectNextCount(2) //
.expectNextMatches(entity -> entity.getId().equals("id-one") || entity.getId().equals("id-two")) //
.expectNextMatches(entity -> entity.getId().equals("id-one") || entity.getId().equals("id-two")) //
.verifyComplete();
}
@@ -197,6 +199,34 @@ public class SimpleReactiveElasticsearchRepositoryTests {
.verifyComplete();
}
@Test // DATAES-717
void shouldReturnFluxOfSearchHit() throws IOException {
bulkIndex(SampleEntity.builder().id("id-one").message("message").build(), //
SampleEntity.builder().id("id-two").message("message").build(), //
SampleEntity.builder().id("id-three").message("message").build());
repository.queryByMessageWithString("message") //
.as(StepVerifier::create) //
.expectNextMatches(searchHit -> SearchHit.class.isAssignableFrom(searchHit.getClass()))//
.expectNextCount(2) //
.verifyComplete();
}
@Test // DATAES-717
void shouldReturnFluxOfSearchHitForStringQuery() throws IOException {
bulkIndex(SampleEntity.builder().id("id-one").message("message").build(), //
SampleEntity.builder().id("id-two").message("message").build(), //
SampleEntity.builder().id("id-three").message("message").build());
repository.queryAllByMessage("message") //
.as(StepVerifier::create) //
.expectNextMatches(searchHit -> SearchHit.class.isAssignableFrom(searchHit.getClass()))//
.expectNextCount(2) //
.verifyComplete();
}
@Test // DATAES-519
public void countShouldReturnZeroWhenIndexDoesNotExist() {
repository.count().as(StepVerifier::create).expectNext(0L).verifyComplete();
@@ -505,6 +535,11 @@ public class SimpleReactiveElasticsearchRepositoryTests {
Flux<SampleEntity> findAllByMessage(Publisher<String> message);
Flux<SearchHit<SampleEntity>> queryAllByMessage(String message);
@Query("{\"bool\": {\"must\": [{\"term\": {\"message\": \"?0\"}}]}}")
Flux<SearchHit<SampleEntity>> queryByMessageWithString(String message);
@Query("{ \"bool\" : { \"must\" : { \"term\" : { \"message\" : \"?0\" } } } }")
Flux<SampleEntity> findAllViaAnnotatedQueryByMessageLike(String message);