findAllById returns all requested documents.

Original Pull Request #2421
Closes #2417

(cherry picked from commit 28489ffee8f405d8f5d2000bb40161d61b21485d)
(cherry picked from commit 6551a80ccc503b20c09eae2ebc3ac33dafcb3c34)
This commit is contained in:
Peter-Josef Meisch 2023-01-04 17:13:22 +01:00
parent b896694d3a
commit 87540bcabc
No known key found for this signature in database
GPG Key ID: DE108246970C7708
2 changed files with 113 additions and 117 deletions

View File

@ -202,29 +202,27 @@ abstract class ElasticsearchRepositoryIntegrationTests {
assertThat(entityFromElasticSearch).isNotPresent();
}
@Test // DATAES-82
@Test // DATAES-82, #2417
void shouldFindAllByIdQuery() {
// given
String documentId = nextIdAsString();
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage("hello world.");
sampleEntity.setVersion(System.currentTimeMillis());
repository.save(sampleEntity);
// create more than 10 documents to see that the number of input ids is set as requested size
int numEntities = 20;
List<String> ids = new ArrayList<>(numEntities);
List<SampleEntity> entities = new ArrayList<>(numEntities);
for (int i = 0; i < numEntities; i++) {
String documentId = nextIdAsString();
ids.add(documentId);
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage("hello world.");
sampleEntity.setVersion(System.currentTimeMillis());
entities.add(sampleEntity);
}
repository.saveAll(entities);
String documentId2 = nextIdAsString();
SampleEntity sampleEntity2 = new SampleEntity();
sampleEntity2.setId(documentId2);
sampleEntity2.setMessage("hello world.");
sampleEntity2.setVersion(System.currentTimeMillis());
repository.save(sampleEntity2);
Iterable<SampleEntity> sampleEntities = repository.findAllById(ids);
// when
Iterable<SampleEntity> sampleEntities = repository.findAllById(Arrays.asList(documentId, documentId2));
// then
assertThat(sampleEntities).isNotNull().hasSize(2);
assertThat(sampleEntities).isNotNull().hasSize(numEntities);
}
@Test

View File

@ -17,11 +17,13 @@ package org.springframework.data.elasticsearch.repository.support;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.elasticsearch.core.query.Query.*;
import static org.springframework.data.elasticsearch.utils.IdGenerator.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@ -63,13 +65,10 @@ import org.springframework.lang.Nullable;
@SpringIntegrationTest
abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
@Autowired
ReactiveElasticsearchOperations operations;
@Autowired
ReactiveSampleEntityRepository repository;
@Autowired ReactiveElasticsearchOperations operations;
@Autowired ReactiveSampleEntityRepository repository;
@Autowired
private IndexNameProvider indexNameProvider;
@Autowired private IndexNameProvider indexNameProvider;
@BeforeEach
void before() {
@ -84,7 +83,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void saveShouldSaveSingleEntity() {
repository.save(new SampleEntity()) //
@ -99,7 +98,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void saveShouldComputeMultipleEntities() {
repository.saveAll(Arrays.asList(new SampleEntity(), new SampleEntity(), new SampleEntity()))
@ -113,7 +112,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519, DATAES-767, DATAES-822
// DATAES-519, DATAES-767, DATAES-822
void findByIdShouldErrorIfIndexDoesNotExist() {
operations.indexOps(SampleEntity.class).delete().block();
@ -124,13 +123,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void findShouldRetrieveSingleEntityById() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two"), //
new SampleEntity("id-three")) //
.block();
.block();
repository.findById("id-two").as(StepVerifier::create)//
.consumeNextWith(it -> assertThat(it.getId()).isEqualTo("id-two")) //
@ -138,27 +137,27 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void findByIdShouldCompleteIfNothingFound() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two"), //
new SampleEntity("id-three")) //
.block();
.block();
repository.findById("does-not-exist").as(StepVerifier::create) //
.verifyComplete();
}
@Test
// DATAES-720
// DATAES-720
void findAllShouldReturnAllElements() {
// make sure to be above the default page size of the Query interface
int count = DEFAULT_PAGE_SIZE * 2;
bulkIndex(IntStream.range(1, count + 1) //
.mapToObj(it -> new SampleEntity(String.valueOf(it))) //
.toArray(SampleEntity[]::new)) //
.block();
.block();
repository.findAll() //
.as(StepVerifier::create) //
@ -167,35 +166,43 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void findAllByIdByIdShouldCompleteIfIndexDoesNotExist() {
repository.findAllById(Arrays.asList("id-two", "id-two")).as(StepVerifier::create).verifyComplete();
}
@Test
// DATAES-519
@Test // DATAES-519, #2417
void findAllByIdShouldRetrieveMatchingDocuments() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two"), //
new SampleEntity("id-three")) //
.block();
// create more than 10 documents to see that the number of input ids is set as requested size
int numEntities = 20;
List<String> ids = new ArrayList<>(numEntities);
List<SampleEntity> entities = new ArrayList<>(numEntities);
for (int i = 0; i < numEntities; i++) {
String documentId = nextIdAsString();
ids.add(documentId);
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage("hello world.");
sampleEntity.setVersion(System.currentTimeMillis());
entities.add(sampleEntity);
}
repository.saveAll(entities).blockLast();
repository.findAllById(Arrays.asList("id-one", "id-two")) //
repository.findAllById(ids) //
.as(StepVerifier::create)//
.expectNextMatches(entity -> entity.getId().equals("id-one") || entity.getId().equals("id-two")) //
.expectNextMatches(entity -> entity.getId().equals("id-one") || entity.getId().equals("id-two")) //
.expectNextCount(numEntities) //
.verifyComplete();
}
@Test
// DATAES-519
// DATAES-519
void findAllByIdShouldCompleteWhenNothingFound() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two"), //
new SampleEntity("id-three")) //
.block();
.block();
repository.findAllById(Arrays.asList("can't", "touch", "this")) //
.as(StepVerifier::create)//
@ -203,13 +210,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-717
// DATAES-717
void shouldReturnFluxOfSearchHit() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "message"), //
new SampleEntity("id-three", "message")) //
.block();
.block();
repository.queryAllByMessage("message") //
.as(StepVerifier::create) //
@ -219,13 +226,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-717
// DATAES-717
void shouldReturnFluxOfSearchHitForStringQuery() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "message"), //
new SampleEntity("id-three", "message")) //
.block();
.block();
repository.queryByMessageWithString("message") //
.as(StepVerifier::create) //
@ -235,13 +242,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-372
// DATAES-372
void shouldReturnHighlightsOnAnnotatedMethod() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "message"), //
new SampleEntity("id-three", "message")) //
.block();
.block();
repository.queryAllByMessage("message") //
.as(StepVerifier::create) //
@ -254,13 +261,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-372
// DATAES-372
void shouldReturnHighlightsOnAnnotatedStringQueryMethod() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "message"), //
new SampleEntity("id-three", "message")) //
.block();
.block();
repository.queryByMessageWithString("message") //
.as(StepVerifier::create) //
@ -273,7 +280,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519, DATAES-767, DATAES-822
// DATAES-519, DATAES-767, DATAES-822
void countShouldErrorWhenIndexDoesNotExist() {
operations.indexOps(SampleEntity.class).delete().block();
@ -284,24 +291,24 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void countShouldCountDocuments() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two")) //
.block();
.block();
repository.count().as(StepVerifier::create).expectNext(2L).verifyComplete();
}
@Test
// DATAES-519
// DATAES-519
void existsByIdShouldReturnTrueIfExists() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.existsById("id-two") //
.as(StepVerifier::create) //
@ -310,13 +317,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void existsByIdShouldReturnFalseIfNotExists() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.existsById("wrecking ball") //
.as(StepVerifier::create) //
@ -325,7 +332,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void countShouldCountMatchingDocuments() {
bulkIndex(new SampleEntity("id-one", "message"), //
@ -353,13 +360,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void existsShouldReturnTrueIfExists() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.existsAllByMessage("message") //
.as(StepVerifier::create) //
@ -368,13 +375,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void existsShouldReturnFalseIfNotExists() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.existsAllByMessage("these days") //
.as(StepVerifier::create) //
@ -383,18 +390,18 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void deleteByIdShouldCompleteIfNothingDeleted() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two")) //
.block();
.block();
repository.deleteById("does-not-exist").as(StepVerifier::create).verifyComplete();
}
@Test
// DATAES-519, DATAES-767, DATAES-822, DATAES-678
// DATAES-519, DATAES-767, DATAES-822, DATAES-678
void deleteByIdShouldCompleteWhenIndexDoesNotExist() {
repository.deleteById("does-not-exist") //
.as(StepVerifier::create) //
@ -402,7 +409,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void deleteByIdShouldDeleteEntry() {
SampleEntity toBeDeleted = new SampleEntity("id-two");
@ -415,21 +422,20 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-976
// DATAES-976
void deleteAllByIdShouldDeleteEntry() {
SampleEntity toBeDeleted = new SampleEntity("id-two");
bulkIndex(new SampleEntity("id-one"), toBeDeleted) //
.block();
repository.deleteAllById(Collections.singletonList(toBeDeleted.getId())).as(StepVerifier::create)
.verifyComplete();
repository.deleteAllById(Collections.singletonList(toBeDeleted.getId())).as(StepVerifier::create).verifyComplete();
assertThat(documentWithIdExistsInIndex(toBeDeleted.getId()).block()).isFalse();
}
@Test
// DATAES-519
// DATAES-519
void deleteShouldDeleteEntry() {
SampleEntity toBeDeleted = new SampleEntity("id-two");
@ -442,7 +448,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void deleteAllShouldDeleteGivenEntries() {
SampleEntity toBeDeleted = new SampleEntity("id-one");
@ -460,13 +466,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void deleteAllShouldDeleteAllEntries() {
bulkIndex(new SampleEntity("id-one"), //
new SampleEntity("id-two"), //
new SampleEntity("id-three")) //
.block();
.block();
repository.deleteAll().as(StepVerifier::create).verifyComplete();
@ -477,13 +483,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedFinderMethodShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.findAllByMessageLike("test") //
.as(StepVerifier::create) //
@ -492,13 +498,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedFinderMethodShouldBeExecutedCorrectlyWhenGivenPublisher() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.findAllByMessage(Mono.just("test")) //
.as(StepVerifier::create) //
@ -507,13 +513,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedFinderWithDerivedSortMethodShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "test", 3), //
new SampleEntity("id-two", "test test", 1), //
new SampleEntity("id-three", "test test", 2)) //
.block();
.block();
repository.findAllByMessageLikeOrderByRate("test") //
.as(StepVerifier::create) //
@ -524,13 +530,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedFinderMethodWithSortParameterShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "test", 3), //
new SampleEntity("id-two", "test test", 1), //
new SampleEntity("id-three", "test test", 2)) //
.block();
.block();
repository.findAllByMessage("test", Sort.by(Order.asc("rate"))) //
.as(StepVerifier::create) //
@ -541,13 +547,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedFinderMethodWithPageableParameterShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "test", 3), //
new SampleEntity("id-two", "test test", 1), //
new SampleEntity("id-three", "test test", 2)) //
.block();
.block();
repository.findAllByMessage("test", PageRequest.of(0, 2, Sort.by(Order.asc("rate")))) //
.as(StepVerifier::create) //
@ -557,13 +563,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedFinderMethodReturningMonoShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.findFirstByMessageLike("test") //
.as(StepVerifier::create) //
@ -572,7 +578,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void annotatedFinderMethodShouldBeExecutedCorrectly() {
int count = 30;
@ -589,7 +595,7 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// #1917
// #1917
void annotatedFinderMethodPagedShouldBeExecutedCorrectly() {
int count = 30;
@ -610,13 +616,13 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// DATAES-519
// DATAES-519
void derivedDeleteMethodShouldBeExecutedCorrectly() {
bulkIndex(new SampleEntity("id-one", "message"), //
new SampleEntity("id-two", "test message"), //
new SampleEntity("id-three", "test test")) //
.block();
.block();
repository.deleteAllByMessage("message") //
.as(StepVerifier::create) //
@ -629,12 +635,12 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// #2135
// #2135
void FluxOfSearchHitForArrayQuery() {
bulkIndex(new SampleEntity("id-one", "message1"), //
new SampleEntity("id-two", "message2"), //
new SampleEntity("id-three", "message3")) //
.block();
.block();
repository.findAllViaAnnotatedQueryByMessageIn(Arrays.asList("message1", "message3")) //
.as(StepVerifier::create) //
@ -645,12 +651,12 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// #2135
// #2135
void FluxOfSearchHitForIntegerArrayQuery() {
bulkIndex(new SampleEntity("id-one", "test", 3), //
new SampleEntity("id-two", "test test", 1), //
new SampleEntity("id-three", "test test", 2)) //
.block();
.block();
repository.findAllViaAnnotatedQueryByRatesIn(Arrays.asList(2, 3)) //
.as(StepVerifier::create) //
@ -661,17 +667,16 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
}
@Test
// #2135
// #2135
void FluxOfSearchHitForStringAndIntegerArrayQuery() {
bulkIndex(new SampleEntity("id-one", "message1", 1), //
new SampleEntity("id-two", "message2", 2), //
new SampleEntity("id-three", "message3", 3), //
new SampleEntity("id-four", "message4", 4), //
new SampleEntity("id-five", "message5", 5)) //
.block();
.block();
repository.findAllViaAnnotatedQueryByMessageInAndRatesIn(Arrays.asList("message5", "message3"), Arrays.asList(2,
3)) //
repository.findAllViaAnnotatedQueryByMessageInAndRatesIn(Arrays.asList("message5", "message3"), Arrays.asList(2, 3)) //
.as(StepVerifier::create) //
.consumeNextWith(it -> assertThat(it.getId()).isEqualTo("id-three")) //
.verifyComplete();
@ -694,11 +699,11 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
Flux<SampleEntity> findAllByMessage(Publisher<String> message);
@Highlight(fields = {@HighlightField(name = "message")})
@Highlight(fields = { @HighlightField(name = "message") })
Flux<SearchHit<SampleEntity>> queryAllByMessage(String message);
@Query("{\"bool\": {\"must\": [{\"term\": {\"message\": \"?0\"}}]}}")
@Highlight(fields = {@HighlightField(name = "message")})
@Highlight(fields = { @HighlightField(name = "message") })
Flux<SearchHit<SampleEntity>> queryByMessageWithString(String message);
@Query("{ \"bool\" : { \"must\" : { \"term\" : { \"message\" : \"?0\" } } } }")
@ -732,24 +737,17 @@ abstract class SimpleReactiveElasticsearchRepositoryIntegrationTests {
@Document(indexName = "#{@indexNameProvider.indexName()}")
static class SampleEntity {
@Nullable
@Id
private String id;
@Id private String id;
@Nullable
@Field(type = FieldType.Text, store = true, fielddata = true)
private String type;
@Field(type = FieldType.Text, store = true, fielddata = true) private String type;
@Nullable
@Field(type = FieldType.Text, store = true, fielddata = true)
private String message;
@Field(type = FieldType.Text, store = true, fielddata = true) private String message;
@Nullable private int rate;
@Nullable private boolean available;
@Nullable
private int rate;
@Nullable
private boolean available;
@Nullable
@Version
private Long version;
@Version private Long version;
public SampleEntity() {
}
public SampleEntity() {}
public SampleEntity(@Nullable String id) {
this.id = id;