diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/InsertUtil.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/InsertUtil.java new file mode 100644 index 000000000..d548ee6ea --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/InsertUtil.java @@ -0,0 +1,62 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.cassandra.repository.support; + +import lombok.experimental.UtilityClass; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.springframework.data.cassandra.core.convert.CassandraConverter; +import org.springframework.data.cassandra.core.mapping.CassandraPersistentEntity; + +import com.datastax.driver.core.querybuilder.Insert; +import com.datastax.driver.core.querybuilder.QueryBuilder; + +/** + * Utility to create {@link com.datastax.driver.core.querybuilder.Insert} statements for repository use. + * + * @author Mark Paluch + * @since 2.0 + */ +@UtilityClass +class InsertUtil { + + /** + * Create a {@link Insert} statement containing all properties including these with {@literal null} values. + * + * @param entity the entity, must not be {@literal null}. + * @return the constructed {@link Insert} statement. + */ + static Insert createInsert(CassandraConverter converter, Object entity) { + + CassandraPersistentEntity persistentEntity = converter.getMappingContext() + .getRequiredPersistentEntity(entity.getClass()); + + Map toInsert = new LinkedHashMap<>(); + + converter.write(entity, toInsert, persistentEntity); + + Insert insert = QueryBuilder.insertInto(persistentEntity.getTableName().toCql()); + + for (Entry entry : toInsert.entrySet()) { + insert.value(entry.getKey(), entry.getValue()); + } + + return insert; + } +} 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 fa8aca368..07b4cb3be 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 @@ -76,7 +76,7 @@ public class SimpleCassandraRepository implements CassandraRepository implements CassandraRepository Insert createFullInsert(S entity) { - - CassandraConverter converter = operations.getConverter(); - - CassandraPersistentEntity persistentEntity = converter.getMappingContext() - .getRequiredPersistentEntity(entity.getClass()); - - Map toInsert = new LinkedHashMap<>(); - - converter.write(entity, toInsert, persistentEntity); - - Insert insert = QueryBuilder.insertInto(persistentEntity.getTableName().toCql()); - - for (Entry entry : toInsert.entrySet()) { - insert.value(entry.getKey(), entry.getValue()); - } - - return insert; + /** + * Create a {@link Insert} statement containing all properties including these with {@literal null} values. + * + * @param entity the entity, must not be {@literal null}. + * @return the constructed {@link Insert} statement. + */ + protected Insert createInsert(S entity) { + return InsertUtil.createInsert(operations.getConverter(), entity); } /* (non-Javadoc) 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 415fc1071..9dc67ec9f 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 @@ -15,13 +15,14 @@ */ package org.springframework.data.cassandra.repository.support; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - +import org.reactivestreams.Publisher; import org.springframework.data.cassandra.core.ReactiveCassandraOperations; import org.springframework.data.cassandra.core.convert.CassandraConverter; import org.springframework.data.cassandra.core.mapping.CassandraPersistentEntity; @@ -29,8 +30,6 @@ import org.springframework.data.cassandra.repository.ReactiveCassandraRepository import org.springframework.data.cassandra.repository.query.CassandraEntityInformation; import org.springframework.util.Assert; -import org.reactivestreams.Publisher; - import com.datastax.driver.core.querybuilder.Insert; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.datastax.driver.core.querybuilder.Select; @@ -73,8 +72,17 @@ public class SimpleReactiveCassandraRepository implements ReactiveCassand Assert.notNull(entity, "Entity must not be null"); - return operations.getReactiveCqlOperations().execute(createFullInsert(entity)).map(it -> entity); + return operations.getReactiveCqlOperations().execute(createInsert(entity)).map(it -> entity); + } + /** + * Create a {@link Insert} statement containing all properties including these with {@literal null} values. + * + * @param entity the entity, must not be {@literal null}. + * @return the constructed {@link Insert} statement. + */ + protected Insert createInsert(S entity) { + return InsertUtil.createInsert(operations.getConverter(), entity); } /* (non-Javadoc) @@ -97,7 +105,7 @@ public class SimpleReactiveCassandraRepository implements ReactiveCassand Assert.notNull(entityStream, "The given Publisher of entities must not be null"); return Flux.from(entityStream) - .flatMap(entity -> operations.getReactiveCqlOperations().execute(createFullInsert(entity)).map(it -> entity)); + .flatMap(entity -> operations.getReactiveCqlOperations().execute(createInsert(entity)).map(it -> entity)); } /* (non-Javadoc) @@ -289,24 +297,4 @@ public class SimpleReactiveCassandraRepository implements ReactiveCassand return Flux.from(entityStream).flatMap(operations::delete).then(); } - - private Insert createFullInsert(S entity) { - - CassandraConverter converter = operations.getConverter(); - - CassandraPersistentEntity persistentEntity = - converter.getMappingContext().getRequiredPersistentEntity(entity.getClass()); - - Map toInsert = new LinkedHashMap<>(); - - converter.write(entity, toInsert, persistentEntity); - - Insert insert = QueryBuilder.insertInto(persistentEntity.getTableName().toCql()); - - for (Entry entry : toInsert.entrySet()) { - insert.value(entry.getKey(), entry.getValue()); - } - - return insert; - } }