DATACASS-145 - Make SimpleCassandraRepository.createInsert(…) protected.

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.
This commit is contained in:
Mark Paluch
2017-08-30 08:45:02 +02:00
committed by John Blum
parent 9fc7cd9eaa
commit 997888678a
3 changed files with 87 additions and 47 deletions

View File

@@ -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<String, Object> toInsert = new LinkedHashMap<>();
converter.write(entity, toInsert, persistentEntity);
Insert insert = QueryBuilder.insertInto(persistentEntity.getTableName().toCql());
for (Entry<String, Object> entry : toInsert.entrySet()) {
insert.value(entry.getKey(), entry.getValue());
}
return insert;
}
}

View File

@@ -76,7 +76,7 @@ public class SimpleCassandraRepository<T, ID> implements CassandraRepository<T,
Assert.notNull(entity, "Entity must not be null");
Insert insert = createFullInsert(entity);
Insert insert = createInsert(entity);
operations.getCqlOperations().execute(insert);
@@ -96,30 +96,20 @@ public class SimpleCassandraRepository<T, ID> implements CassandraRepository<T,
for (S entity : entities) {
result.add(entity);
operations.getCqlOperations().execute(createFullInsert(entity));
operations.getCqlOperations().execute(createInsert(entity));
}
return result;
}
private <S extends T> Insert createFullInsert(S entity) {
CassandraConverter converter = operations.getConverter();
CassandraPersistentEntity<?> persistentEntity = converter.getMappingContext()
.getRequiredPersistentEntity(entity.getClass());
Map<String, Object> toInsert = new LinkedHashMap<>();
converter.write(entity, toInsert, persistentEntity);
Insert insert = QueryBuilder.insertInto(persistentEntity.getTableName().toCql());
for (Entry<String, Object> 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 <S extends T> Insert createInsert(S entity) {
return InsertUtil.createInsert(operations.getConverter(), entity);
}
/* (non-Javadoc)

View File

@@ -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<T, ID> 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 <S extends T> Insert createInsert(S entity) {
return InsertUtil.createInsert(operations.getConverter(), entity);
}
/* (non-Javadoc)
@@ -97,7 +105,7 @@ public class SimpleReactiveCassandraRepository<T, ID> 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<T, ID> implements ReactiveCassand
return Flux.from(entityStream).flatMap(operations::delete).then();
}
private <S extends T> Insert createFullInsert(S entity) {
CassandraConverter converter = operations.getConverter();
CassandraPersistentEntity<?> persistentEntity =
converter.getMappingContext().getRequiredPersistentEntity(entity.getClass());
Map<String, Object> toInsert = new LinkedHashMap<>();
converter.write(entity, toInsert, persistentEntity);
Insert insert = QueryBuilder.insertInto(persistentEntity.getTableName().toCql());
for (Entry<String, Object> entry : toInsert.entrySet()) {
insert.value(entry.getKey(), entry.getValue());
}
return insert;
}
}