Skip to content

Commit 749270b

Browse files
schaudermp911de
authored andcommitted
DATAES-976 - Implement CrudRepository and ReactiveCrudRepository.deleteAllById(Iterable<ID> ids).
Original pull request: spring-projects#554.
1 parent b17999f commit 749270b

File tree

4 files changed

+98
-7
lines changed

4 files changed

+98
-7
lines changed

src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
* @author Murali Chevuri
6767
* @author Peter-Josef Meisch
6868
* @author Aleksei Arsenev
69+
* @author Jens Schauder
6970
*/
7071
public class SimpleElasticsearchRepository<T, ID> implements ElasticsearchRepository<T, ID> {
7172

@@ -315,6 +316,31 @@ public void deleteAll(Iterable<? extends T> entities) {
315316
});
316317
}
317318

319+
@Override
320+
public void deleteAllById(Iterable<? extends ID> ids) {
321+
322+
Assert.notNull(ids, "Cannot delete 'null' list.");
323+
324+
IndexCoordinates indexCoordinates = getIndexCoordinates();
325+
IdsQueryBuilder idsQueryBuilder = idsQuery();
326+
for (ID id : ids) {
327+
if (id != null) {
328+
idsQueryBuilder.addIds(stringIdRepresentation(id));
329+
}
330+
}
331+
332+
if (idsQueryBuilder.ids().isEmpty()) {
333+
return;
334+
}
335+
336+
Query query = new NativeSearchQueryBuilder().withQuery(idsQueryBuilder).build();
337+
338+
executeAndRefresh((OperationsCallback<Void>) operations -> {
339+
operations.delete(query, entityClass, indexCoordinates);
340+
return null;
341+
});
342+
}
343+
318344
private void doDelete(@Nullable ID id, @Nullable String routing, IndexCoordinates indexCoordinates) {
319345

320346
if (id != null) {

src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepository.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@
3535
import org.springframework.data.elasticsearch.core.query.Query;
3636
import org.springframework.data.elasticsearch.core.query.StringQuery;
3737
import org.springframework.data.elasticsearch.repository.ReactiveElasticsearchRepository;
38+
import org.springframework.data.util.Streamable;
3839
import org.springframework.util.Assert;
3940

4041
/**
4142
* @author Christoph Strobl
4243
* @author Peter-Josef Meisch
4344
* @author Aleksei Arsenev
45+
* @author Jens Schauder
4446
* @since 3.2
4547
*/
4648
public class SimpleReactiveElasticsearchRepository<T, ID> implements ReactiveElasticsearchRepository<T, ID> {
@@ -52,7 +54,7 @@ public class SimpleReactiveElasticsearchRepository<T, ID> implements ReactiveEla
5254
private final ReactiveIndexOperations indexOperations;
5355

5456
public SimpleReactiveElasticsearchRepository(ElasticsearchEntityInformation<T, ID> entityInformation,
55-
ReactiveElasticsearchOperations operations) {
57+
ReactiveElasticsearchOperations operations) {
5658

5759
Assert.notNull(entityInformation, "EntityInformation must not be null!");
5860
Assert.notNull(operations, "ElasticsearchOperations must not be null!");
@@ -211,6 +213,21 @@ public Mono<Void> deleteAll(Iterable<? extends T> entities) {
211213
return deleteAll(Flux.fromIterable(entities));
212214
}
213215

216+
@Override
217+
public Mono<Void> deleteAllById(Iterable<? extends ID> ids) {
218+
219+
Assert.notNull(ids, "Ids must not be null!");
220+
221+
return Mono.just(Streamable.of(ids) //
222+
.map(this::convertId).toList() //
223+
).map(objects -> new StringQuery(QueryBuilders.idsQuery() //
224+
.addIds(objects.toArray(new String[0])) //
225+
.toString()) //
226+
).flatMap(
227+
query -> operations.delete(query, entityInformation.getJavaType(), entityInformation.getIndexCoordinates())) //
228+
.then(doRefresh());
229+
}
230+
214231
@Override
215232
public Mono<Void> deleteAll(Publisher<? extends T> entityStream) {
216233

src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepositoryTests.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.elasticsearch.repository.support;
1717

18+
import static java.util.Arrays.*;
1819
import static org.assertj.core.api.Assertions.*;
1920
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
2021
import static org.springframework.data.elasticsearch.core.query.Query.*;
@@ -64,6 +65,7 @@
6465
/**
6566
* @author Christoph Strobl
6667
* @author Peter-Josef Meisch
68+
* @author Jens Schauder
6769
*/
6870
@SpringIntegrationTest
6971
@ContextConfiguration(classes = { SimpleReactiveElasticsearchRepositoryTests.Config.class })
@@ -107,7 +109,7 @@ private Mono<Boolean> documentWithIdExistsInIndex(String id) {
107109
public void saveShouldComputeMultipleEntities() {
108110

109111
repository
110-
.saveAll(Arrays.asList(SampleEntity.builder().build(), SampleEntity.builder().build(),
112+
.saveAll(asList(SampleEntity.builder().build(), SampleEntity.builder().build(),
111113
SampleEntity.builder().build())) //
112114
.map(SampleEntity::getId) //
113115
.flatMap(this::documentWithIdExistsInIndex) //
@@ -167,7 +169,7 @@ public void findAllShouldReturnAllElements() {
167169

168170
@Test // DATAES-519
169171
public void findAllByIdByIdShouldCompleteIfIndexDoesNotExist() {
170-
repository.findAllById(Arrays.asList("id-two", "id-two")).as(StepVerifier::create).verifyComplete();
172+
repository.findAllById(asList("id-two", "id-two")).as(StepVerifier::create).verifyComplete();
171173
}
172174

173175
@Test // DATAES-519
@@ -178,7 +180,7 @@ public void findAllByIdShouldRetrieveMatchingDocuments() {
178180
SampleEntity.builder().id("id-three").build()) //
179181
.block();
180182

181-
repository.findAllById(Arrays.asList("id-one", "id-two")) //
183+
repository.findAllById(asList("id-one", "id-two")) //
182184
.as(StepVerifier::create)//
183185
.expectNextMatches(entity -> entity.getId().equals("id-one") || entity.getId().equals("id-two")) //
184186
.expectNextMatches(entity -> entity.getId().equals("id-one") || entity.getId().equals("id-two")) //
@@ -193,7 +195,7 @@ public void findAllByIdShouldCompleteWhenNothingFound() {
193195
SampleEntity.builder().id("id-three").build()) //
194196
.block();
195197

196-
repository.findAllById(Arrays.asList("can't", "touch", "this")) //
198+
repository.findAllById(asList("can't", "touch", "this")) //
197199
.as(StepVerifier::create)//
198200
.verifyComplete();
199201
}
@@ -380,6 +382,18 @@ public void deleteByIdShouldDeleteEntry() {
380382
assertThat(documentWithIdExistsInIndex(toBeDeleted.getId()).block()).isFalse();
381383
}
382384

385+
@Test // DATAES-976
386+
public void deleteAllByIdShouldDeleteEntry() {
387+
388+
SampleEntity toBeDeleted = SampleEntity.builder().id("id-two").build();
389+
bulkIndex(SampleEntity.builder().id("id-one").build(), toBeDeleted) //
390+
.block();
391+
392+
repository.deleteAllById(asList(toBeDeleted.getId())).as(StepVerifier::create).verifyComplete();
393+
394+
assertThat(documentWithIdExistsInIndex(toBeDeleted.getId()).block()).isFalse();
395+
}
396+
383397
@Test // DATAES-519
384398
public void deleteShouldDeleteEntry() {
385399

@@ -402,7 +416,7 @@ public void deleteAllShouldDeleteGivenEntries() {
402416
bulkIndex(toBeDeleted, hangInThere, toBeDeleted2) //
403417
.block();
404418

405-
repository.deleteAll(Arrays.asList(toBeDeleted, toBeDeleted2)).as(StepVerifier::create).verifyComplete();
419+
repository.deleteAll(asList(toBeDeleted, toBeDeleted2)).as(StepVerifier::create).verifyComplete();
406420

407421
assertThat(documentWithIdExistsInIndex(toBeDeleted.getId()).block()).isFalse();
408422
assertThat(documentWithIdExistsInIndex(toBeDeleted2.getId()).block()).isFalse();
@@ -547,7 +561,7 @@ public void derivedDeleteMethodShouldBeExecutedCorrectly() {
547561
}
548562

549563
Mono<Void> bulkIndex(SampleEntity... entities) {
550-
return operations.saveAll(Arrays.asList(entities), IndexCoordinates.of(INDEX)).then();
564+
return operations.saveAll(asList(entities), IndexCoordinates.of(INDEX)).then();
551565
}
552566

553567
interface ReactiveSampleEntityRepository extends ReactiveCrudRepository<SampleEntity, String> {

src/test/java/org/springframework/data/elasticsearch/repository/support/simple/SimpleElasticsearchRepositoryIntegrationTests.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,40 @@ public void shouldDeleteById() {
406406
assertThat(result).isEqualTo(1L);
407407
}
408408

409+
@Test //DATAES-976
410+
public void shouldDeleteAllById() {
411+
412+
// given
413+
String id1 = nextIdAsString();
414+
SampleEntity sampleEntity1 = new SampleEntity();
415+
sampleEntity1.setId(id1);
416+
sampleEntity1.setMessage("hello world 1");
417+
sampleEntity1.setAvailable(true);
418+
sampleEntity1.setVersion(System.currentTimeMillis());
419+
420+
String id2 = nextIdAsString();
421+
SampleEntity sampleEntity2 = new SampleEntity();
422+
sampleEntity2.setId(id2);
423+
sampleEntity2.setMessage("hello world 2");
424+
sampleEntity2.setAvailable(true);
425+
sampleEntity2.setVersion(System.currentTimeMillis());
426+
427+
String id3 = nextIdAsString();
428+
SampleEntity sampleEntity3 = new SampleEntity();
429+
sampleEntity3.setId(id3);
430+
sampleEntity3.setMessage("hello world 3");
431+
sampleEntity3.setAvailable(false);
432+
sampleEntity3.setVersion(System.currentTimeMillis());
433+
434+
repository.saveAll(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
435+
436+
// when
437+
repository.deleteAllById(Arrays.asList(id1, id3));
438+
439+
// then
440+
assertThat(repository.findAll()).extracting(SampleEntity::getId).containsExactly(id2);
441+
}
442+
409443
@Test
410444
public void shouldDeleteByMessageAndReturnList() {
411445

0 commit comments

Comments
 (0)