From 997888678acf18c005bad8e5ada648bc7547b7cf Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 30 Aug 2017 08:45:02 +0200 Subject: [PATCH] =?UTF-8?q?DATACASS-145=20-=20Make=20SimpleCassandraReposi?= =?UTF-8?q?tory.createInsert(=E2=80=A6)=20protected.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expose createInsert(…) in the synchronous and reactive repository base classes to simplify base class extension. Derived classes are no longer required to implement createInsert(…) themselves but can reuse the existing methods. Extract createInsert(…) body to InsertUtil. --- .../repository/support/InsertUtil.java | 62 +++++++++++++++++++ .../support/SimpleCassandraRepository.java | 30 +++------ .../SimpleReactiveCassandraRepository.java | 42 +++++-------- 3 files changed, 87 insertions(+), 47 deletions(-) create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/InsertUtil.java 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; - } }