diff --git a/pom.xml b/pom.xml index 0eec33a1a..577b6c38b 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-cassandra-parent - 3.2.0-SNAPSHOT + 3.2.0-DATACASS-825-SNAPSHOT pom Spring Data for Apache Cassandra @@ -98,7 +98,7 @@ 0.5.4 1.01 multi - 2.5.0-SNAPSHOT + 2.4.0-DATACMNS-800-SNAPSHOT diff --git a/spring-data-cassandra-distribution/pom.xml b/spring-data-cassandra-distribution/pom.xml index b814eecbf..a1a92c62a 100644 --- a/spring-data-cassandra-distribution/pom.xml +++ b/spring-data-cassandra-distribution/pom.xml @@ -8,7 +8,7 @@ org.springframework.data spring-data-cassandra-parent - 3.2.0-SNAPSHOT + 3.2.0-DATACASS-825-SNAPSHOT ../pom.xml diff --git a/spring-data-cassandra/pom.xml b/spring-data-cassandra/pom.xml index c8229277b..b2503e082 100644 --- a/spring-data-cassandra/pom.xml +++ b/spring-data-cassandra/pom.xml @@ -8,7 +8,7 @@ org.springframework.data spring-data-cassandra-parent - 3.2.0-SNAPSHOT + 3.2.0-DATACASS-825-SNAPSHOT ../pom.xml diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepository.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepository.java index b81a3bcb6..13a59ce2c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepository.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepository.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Optional; +import org.jetbrains.annotations.NotNull; import org.springframework.data.cassandra.core.CassandraOperations; import org.springframework.data.cassandra.core.CassandraTemplate; import org.springframework.data.cassandra.core.InsertOptions; @@ -44,6 +45,7 @@ * @author Matthew T. Adams * @author Mark Paluch * @author John Blum + * @author Jens Schauder * @see org.springframework.data.cassandra.repository.CassandraRepository */ public class SimpleCassandraRepository implements CassandraRepository { @@ -188,19 +190,11 @@ public List findAllById(Iterable ids) { Assert.notNull(ids, "The given Iterable of id's must not be null"); - FindByIdQuery mapIdQuery = FindByIdQuery.forIds(ids); - List idCollection = mapIdQuery.getIdCollection(); - String idField = mapIdQuery.getIdProperty(); - - if (idCollection.isEmpty()) { + if (!ids.iterator().hasNext()) { return Collections.emptyList(); } - if (idField == null) { - idField = this.entityInformation.getIdAttribute(); - } - - return this.operations.select(Query.query(where(idField).in(idCollection)), this.entityInformation.getJavaType()); + return this.operations.select(createIdsInQuery(ids), this.entityInformation.getJavaType()); } /* (non-Javadoc) @@ -247,6 +241,18 @@ public void deleteAll(Iterable entities) { entities.forEach(this.operations::delete); } + @Override + public void deleteAllById(Iterable ids) { + + Assert.notNull(ids, "The given Iterable of ids must not be null"); + + if (!ids.iterator().hasNext()) { + return; + } + + this.operations.delete(createIdsInQuery(ids), this.entityInformation.getJavaType()); + } + /* (non-Javadoc) * @see org.springframework.data.repository.CrudRepository#deleteAll() */ @@ -254,4 +260,17 @@ public void deleteAll(Iterable entities) { public void deleteAll() { this.operations.truncate(this.entityInformation.getJavaType()); } + + private Query createIdsInQuery(Iterable ids) { + FindByIdQuery mapIdQuery = FindByIdQuery.forIds(ids); + List idCollection = mapIdQuery.getIdCollection(); + String idField = mapIdQuery.getIdProperty(); + + if (idField == null) { + idField = this.entityInformation.getIdAttribute(); + } + + return Query.query(where(idField).in(idCollection)); + } + } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepository.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepository.java index 70ae3d66e..b1067c537 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepository.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepository.java @@ -17,6 +17,7 @@ import static org.springframework.data.cassandra.core.query.Criteria.*; +import org.jetbrains.annotations.NotNull; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -40,6 +41,7 @@ * * @author Mark Paluch * @author Christoph Strobl + * @author Jens Schauder * @since 2.0 */ public class SimpleReactiveCassandraRepository implements ReactiveCassandraRepository { @@ -224,19 +226,11 @@ public Flux findAllById(Iterable ids) { return findAllById(Flux.fromIterable(ids)); } - FindByIdQuery query = FindByIdQuery.forIds(ids); - List idCollection = query.getIdCollection(); - String idField = query.getIdProperty(); - - if (idCollection.isEmpty()) { + if (!ids.iterator().hasNext()) { return Flux.empty(); } - if (idField == null) { - idField = this.entityInformation.getIdAttribute(); - } - - return this.operations.select(Query.query(where(idField).in(idCollection)), this.entityInformation.getJavaType()); + return this.operations.select(createIdsInCollectionQuery(ids), this.entityInformation.getJavaType()); } /* @@ -304,6 +298,22 @@ public Mono deleteAll(Iterable entities) { return Flux.fromIterable(entities).flatMap(this.operations::delete).then(); } + @Override + public Mono deleteAllById(Iterable ids) { + + Assert.notNull(ids, "The given Iterable of entities must not be null"); + + if (FindByIdQuery.hasCompositeKeys(ids)) { + return deleteById(Flux.fromIterable(ids)); + } + + if (!ids.iterator().hasNext()) { + return Mono.empty(); + } + + return this.operations.delete(createIdsInCollectionQuery(ids), this.entityInformation.getJavaType()).then(); + } + /* (non-Javadoc) * @see org.springframework.data.repository.reactive.ReactiveCrudRepository#deleteAll(org.reactivestreams.Publisher) */ @@ -314,4 +324,17 @@ public Mono deleteAll(Publisher entityStream) { return Flux.from(entityStream).flatMap(this.operations::delete).then(); } + + private Query createIdsInCollectionQuery(Iterable ids) { + + FindByIdQuery query = FindByIdQuery.forIds(ids); + List idCollection = query.getIdCollection(); + String idField = query.getIdProperty(); + + if (idField == null) { + idField = this.entityInformation.getIdAttribute(); + } + + return Query.query(where(idField).in(idCollection)); + } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java index 59afe765f..4adac539a 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleCassandraRepositoryIntegrationTests.java @@ -62,6 +62,7 @@ * Integration tests for {@link SimpleCassandraRepository}. * * @author Mark Paluch + * @author Jens Schauder */ @SpringJUnitConfig public class SimpleCassandraRepositoryIntegrationTests extends IntegrationTestsSupport @@ -355,6 +356,16 @@ void deleteByIdShouldRemoveEntity() { assertThat(loaded).isEmpty(); } + @Test // DATACASS-825 + void deleteAllByIdShouldRemoveEntity() { + + repository.deleteAllById(Arrays.asList(dave.getId())); + + Optional loaded = repository.findById(dave.getId()); + + assertThat(loaded).isEmpty(); + } + @Test // DATACASS-396 void deleteShouldRemoveEntity() { diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepositoryIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepositoryIntegrationTests.java index d3337fc32..74f808cd3 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepositoryIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/repository/support/SimpleReactiveCassandraRepositoryIntegrationTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.cassandra.repository.support; +import static org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils.*; import static org.assertj.core.api.Assertions.*; import static org.junit.Assume.*; @@ -59,6 +60,7 @@ * * @author Mark Paluch * @author Christoph Strobl + * @author Jens Schauder */ @SpringJUnitConfig public class SimpleReactiveCassandraRepositoryIntegrationTests extends IntegrationTestsSupport @@ -391,6 +393,17 @@ void deleteByIdUsingMonoShouldRemoveEntity() { repository.existsById(dave.getId()).as(StepVerifier::create).expectNext(false).verifyComplete(); } + @Test // DATACASS-825 + void deleteAllByIdRemovesEntities() { + + insertTestData(); + + repository.deleteAllById(Arrays.asList(dave.getId(), carter.getId())).as(StepVerifier::create).verifyComplete(); + + repository.existsById(dave.getId()).as(StepVerifier::create).expectNext(false).verifyComplete(); + repository.existsById(carter.getId()).as(StepVerifier::create).expectNext(false).verifyComplete(); + } + @Test // DATACASS-462 void deleteByIdUsingFluxShouldRemoveFirstEntity() {