Skip to content

Commit 418c743

Browse files
schaudermp911de
authored andcommitted
DATACASS-825 - Implements CrudRepository and ReactiveCrudRepository.deleteAllById(Iterable<ID> ids).
Original pull request: #181.
1 parent b874071 commit 418c743

File tree

4 files changed

+86
-20
lines changed

4 files changed

+86
-20
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepository.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import java.util.Optional;
2424

25+
import org.jetbrains.annotations.NotNull;
2526
import org.springframework.data.cassandra.core.CassandraOperations;
2627
import org.springframework.data.cassandra.core.CassandraTemplate;
2728
import org.springframework.data.cassandra.core.InsertOptions;
@@ -44,6 +45,7 @@
4445
* @author Matthew T. Adams
4546
* @author Mark Paluch
4647
* @author John Blum
48+
* @author Jens Schauder
4749
* @see org.springframework.data.cassandra.repository.CassandraRepository
4850
*/
4951
public class SimpleCassandraRepository<T, ID> implements CassandraRepository<T, ID> {
@@ -188,19 +190,11 @@ public List<T> findAllById(Iterable<ID> ids) {
188190

189191
Assert.notNull(ids, "The given Iterable of id's must not be null");
190192

191-
FindByIdQuery mapIdQuery = FindByIdQuery.forIds(ids);
192-
List<Object> idCollection = mapIdQuery.getIdCollection();
193-
String idField = mapIdQuery.getIdProperty();
194-
195-
if (idCollection.isEmpty()) {
193+
if (!ids.iterator().hasNext()) {
196194
return Collections.emptyList();
197195
}
198196

199-
if (idField == null) {
200-
idField = this.entityInformation.getIdAttribute();
201-
}
202-
203-
return this.operations.select(Query.query(where(idField).in(idCollection)), this.entityInformation.getJavaType());
197+
return this.operations.select(createIdsInQuery(ids), this.entityInformation.getJavaType());
204198
}
205199

206200
/* (non-Javadoc)
@@ -247,11 +241,36 @@ public void deleteAll(Iterable<? extends T> entities) {
247241
entities.forEach(this.operations::delete);
248242
}
249243

244+
@Override
245+
public void deleteAllById(Iterable<? extends ID> ids) {
246+
247+
Assert.notNull(ids, "The given Iterable of ids must not be null");
248+
249+
if (!ids.iterator().hasNext()) {
250+
return;
251+
}
252+
253+
this.operations.delete(createIdsInQuery(ids), this.entityInformation.getJavaType());
254+
}
255+
250256
/* (non-Javadoc)
251257
* @see org.springframework.data.repository.CrudRepository#deleteAll()
252258
*/
253259
@Override
254260
public void deleteAll() {
255261
this.operations.truncate(this.entityInformation.getJavaType());
256262
}
263+
264+
private Query createIdsInQuery(Iterable<? extends ID> ids) {
265+
FindByIdQuery mapIdQuery = FindByIdQuery.forIds(ids);
266+
List<Object> idCollection = mapIdQuery.getIdCollection();
267+
String idField = mapIdQuery.getIdProperty();
268+
269+
if (idField == null) {
270+
idField = this.entityInformation.getIdAttribute();
271+
}
272+
273+
return Query.query(where(idField).in(idCollection));
274+
}
275+
257276
}

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepository.java

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.springframework.data.cassandra.core.query.Criteria.*;
1919

20+
import org.jetbrains.annotations.NotNull;
2021
import reactor.core.publisher.Flux;
2122
import reactor.core.publisher.Mono;
2223

@@ -40,6 +41,7 @@
4041
*
4142
* @author Mark Paluch
4243
* @author Christoph Strobl
44+
* @author Jens Schauder
4345
* @since 2.0
4446
*/
4547
public class SimpleReactiveCassandraRepository<T, ID> implements ReactiveCassandraRepository<T, ID> {
@@ -224,19 +226,11 @@ public Flux<T> findAllById(Iterable<ID> ids) {
224226
return findAllById(Flux.fromIterable(ids));
225227
}
226228

227-
FindByIdQuery query = FindByIdQuery.forIds(ids);
228-
List<Object> idCollection = query.getIdCollection();
229-
String idField = query.getIdProperty();
230-
231-
if (idCollection.isEmpty()) {
229+
if (!ids.iterator().hasNext()) {
232230
return Flux.empty();
233231
}
234232

235-
if (idField == null) {
236-
idField = this.entityInformation.getIdAttribute();
237-
}
238-
239-
return this.operations.select(Query.query(where(idField).in(idCollection)), this.entityInformation.getJavaType());
233+
return this.operations.select(createIdsInCollectionQuery(ids), this.entityInformation.getJavaType());
240234
}
241235

242236
/*
@@ -304,6 +298,22 @@ public Mono<Void> deleteAll(Iterable<? extends T> entities) {
304298
return Flux.fromIterable(entities).flatMap(this.operations::delete).then();
305299
}
306300

301+
@Override
302+
public Mono<Void> deleteAllById(Iterable<? extends ID> ids) {
303+
304+
Assert.notNull(ids, "The given Iterable of entities must not be null");
305+
306+
if (FindByIdQuery.hasCompositeKeys(ids)) {
307+
return deleteById(Flux.fromIterable(ids));
308+
}
309+
310+
if (!ids.iterator().hasNext()) {
311+
return Mono.empty();
312+
}
313+
314+
return this.operations.delete(createIdsInCollectionQuery(ids), this.entityInformation.getJavaType()).then();
315+
}
316+
307317
/* (non-Javadoc)
308318
* @see org.springframework.data.repository.reactive.ReactiveCrudRepository#deleteAll(org.reactivestreams.Publisher)
309319
*/
@@ -314,4 +324,17 @@ public Mono<Void> deleteAll(Publisher<? extends T> entityStream) {
314324

315325
return Flux.from(entityStream).flatMap(this.operations::delete).then();
316326
}
327+
328+
private Query createIdsInCollectionQuery(Iterable<? extends ID> ids) {
329+
330+
FindByIdQuery query = FindByIdQuery.forIds(ids);
331+
List<Object> idCollection = query.getIdCollection();
332+
String idField = query.getIdProperty();
333+
334+
if (idField == null) {
335+
idField = this.entityInformation.getIdAttribute();
336+
}
337+
338+
return Query.query(where(idField).in(idCollection));
339+
}
317340
}

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
* Integration tests for {@link SimpleCassandraRepository}.
6363
*
6464
* @author Mark Paluch
65+
* @author Jens Schauder
6566
*/
6667
@SpringJUnitConfig
6768
public class SimpleCassandraRepositoryIntegrationTests extends IntegrationTestsSupport
@@ -355,6 +356,16 @@ void deleteByIdShouldRemoveEntity() {
355356
assertThat(loaded).isEmpty();
356357
}
357358

359+
@Test // DATACASS-825
360+
void deleteAllByIdShouldRemoveEntity() {
361+
362+
repository.deleteAllById(Arrays.asList(dave.getId()));
363+
364+
Optional<User> loaded = repository.findById(dave.getId());
365+
366+
assertThat(loaded).isEmpty();
367+
}
368+
358369
@Test // DATACASS-396
359370
void deleteShouldRemoveEntity() {
360371

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepositoryIntegrationTests.java

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

18+
import static org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils.*;
1819
import static org.assertj.core.api.Assertions.*;
1920
import static org.junit.Assume.*;
2021

@@ -59,6 +60,7 @@
5960
*
6061
* @author Mark Paluch
6162
* @author Christoph Strobl
63+
* @author Jens Schauder
6264
*/
6365
@SpringJUnitConfig
6466
public class SimpleReactiveCassandraRepositoryIntegrationTests extends IntegrationTestsSupport
@@ -391,6 +393,17 @@ void deleteByIdUsingMonoShouldRemoveEntity() {
391393
repository.existsById(dave.getId()).as(StepVerifier::create).expectNext(false).verifyComplete();
392394
}
393395

396+
@Test // DATACASS-825
397+
void deleteAllByIdRemovesEntities() {
398+
399+
insertTestData();
400+
401+
repository.deleteAllById(Arrays.asList(dave.getId(), carter.getId())).as(StepVerifier::create).verifyComplete();
402+
403+
repository.existsById(dave.getId()).as(StepVerifier::create).expectNext(false).verifyComplete();
404+
repository.existsById(carter.getId()).as(StepVerifier::create).expectNext(false).verifyComplete();
405+
}
406+
394407
@Test // DATACASS-462
395408
void deleteByIdUsingFluxShouldRemoveFirstEntity() {
396409

0 commit comments

Comments
 (0)