diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java index 8d28ae2fe..5b59d3665 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java @@ -55,6 +55,7 @@ public interface CassandraAdminOperations extends CassandraOperations { void createTable(boolean ifNotExists, CqlIdentifier tableName, Class entityClass, Map optionsByName); + /** * Drops a table based on the given {@link Class entity type}. The name of the table is derived from either the simple * name of the {@link Class entity class} or name of the table specified with the {@link Table} mapping annotation. diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java index 937a9cfb7..596185ae7 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java @@ -29,8 +29,10 @@ import org.springframework.data.cassandra.core.cql.generator.DropUserTypeCqlGene import org.springframework.data.cassandra.core.cql.keyspace.CreateTableSpecification; import org.springframework.data.cassandra.core.cql.keyspace.DropTableSpecification; import org.springframework.data.cassandra.core.cql.keyspace.DropUserTypeSpecification; +import org.springframework.data.cassandra.core.cql.keyspace.TableOption; import org.springframework.data.cassandra.core.mapping.CassandraPersistentEntity; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; @@ -44,6 +46,7 @@ import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; * @author Fabio J. Mendes * @author John Blum * @author Vagif Zeynalov + * @author Mikhail Polivakha */ public class CassandraAdminTemplate extends CassandraTemplate implements CassandraAdminOperations { @@ -105,13 +108,23 @@ public class CassandraAdminTemplate extends CassandraTemplate implements Cassand } @Override - public void createTable(boolean ifNotExists, CqlIdentifier tableName, Class entityClass, - Map optionsByName) { - + public void createTable(boolean ifNotExists, CqlIdentifier tableName, Class entityClass, Map optionsByName) { CassandraPersistentEntity entity = getConverter().getMappingContext().getRequiredPersistentEntity(entityClass); CreateTableSpecification createTableSpecification = this.schemaFactory - .getCreateTableSpecificationFor(entity, tableName).ifNotExists(ifNotExists); + .getCreateTableSpecificationFor(entity, tableName) + .ifNotExists(ifNotExists); + + if (!CollectionUtils.isEmpty(optionsByName)) { + optionsByName.forEach((key, value) -> { + TableOption tableOption = TableOption.valueOfIgnoreCase(key); + if (tableOption.requiresValue()) { + createTableSpecification.with(tableOption, value); + } else { + createTableSpecification.with(tableOption); + } + }); + } getCqlOperations().execute(CreateTableCqlGenerator.toCql(createTableSpecification)); } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/EntityOperations.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/EntityOperations.java index 819513f17..d2dc44897 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/EntityOperations.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/EntityOperations.java @@ -196,7 +196,7 @@ class EntityOperations { StatementBuilder appendVersionCondition(StatementBuilder delete); /** - * Initializes the version property of the of the current entity if available. + * Initializes the version property of the current entity if available. * * @return the entity with the version property updated if available. */ diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java index f44ef8908..79c9b3ec1 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/StatementFactory.java @@ -295,6 +295,7 @@ public class StatementFactory { Assert.notNull(persistentEntity, "CassandraPersistentEntity must not be null"); boolean insertNulls; + if (options instanceof InsertOptions) { InsertOptions insertOptions = (InsertOptions) options; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java index 5e9cbda1b..83b4af7b4 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java @@ -258,12 +258,12 @@ public class MappingCassandraConverter extends AbstractCassandraConverter @SuppressWarnings("unchecked") private ConvertingPropertyAccessor newConvertingPropertyAccessor(S source, CassandraPersistentEntity entity) { - PersistentPropertyAccessor propertyAccessor = source instanceof PersistentPropertyAccessor - ? (PersistentPropertyAccessor) source - : entity.getPropertyAccessor(source); + ? (PersistentPropertyAccessor) source + : entity.getPropertyAccessor(source); return new ConvertingPropertyAccessor<>(propertyAccessor, getConversionService()); + } private CassandraPersistentEntityParameterValueProvider newParameterValueProvider(ConversionContext context, diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/SchemaFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/SchemaFactory.java index b13444024..d9543bfc8 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/SchemaFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/SchemaFactory.java @@ -147,7 +147,7 @@ public class SchemaFactory { if (property.isCompositePrimaryKey()) { CassandraPersistentEntity primaryKeyEntity = mappingContext - .getRequiredPersistentEntity(property.getRawType()); + .getRequiredPersistentEntity(property.getRawType()); for (CassandraPersistentProperty primaryKeyProperty : primaryKeyEntity) { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/UserTypeUtil.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/UserTypeUtil.java index 48300fe18..ce059b5b9 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/UserTypeUtil.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/UserTypeUtil.java @@ -43,9 +43,8 @@ class UserTypeUtil { Assert.notNull(dataType, "DataType must not be null"); - if (dataType instanceof ListType) { + if (dataType instanceof ListType collectionType) { - ListType collectionType = (ListType) dataType; DataType elementType = collectionType.getElementType(); if (isCollectionType(elementType) || isNonFrozenUdt(elementType)) { @@ -53,9 +52,8 @@ class UserTypeUtil { } } - if (dataType instanceof SetType) { + if (dataType instanceof SetType collectionType) { - SetType collectionType = (SetType) dataType; DataType elementType = collectionType.getElementType(); if (isCollectionType(elementType) || isNonFrozenUdt(elementType)) { @@ -63,9 +61,7 @@ class UserTypeUtil { } } - if (dataType instanceof MapType) { - - MapType collectionType = (MapType) dataType; + if (dataType instanceof MapType collectionType) { DataType keyType = collectionType.getKeyType(); DataType valueType = collectionType.getValueType(); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableOption.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableOption.java index 0a5dc1a56..fee52fb4e 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableOption.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableOption.java @@ -18,6 +18,7 @@ package org.springframework.data.cassandra.core.cql.keyspace; import java.util.Map; import org.springframework.lang.Nullable; +import org.springframework.util.StringUtils; /** * Enumeration that represents all known table options. If a table option is not listed here, but is supported by @@ -26,6 +27,7 @@ import org.springframework.lang.Nullable; * * @author Matthew T. Adams * @author Mark Paluch + * @author Mikhail Polivakha * @see CompactionOption * @see CompressionOption * @see CachingOption @@ -84,6 +86,15 @@ public enum TableOption implements Option { this.delegate = new DefaultOption(name, type, requiresValue, escapesValue, quotesValue); } + public static TableOption valueOfIgnoreCase(String optionName) { + for (TableOption value : values()) { + if (value.getName().equalsIgnoreCase(optionName)) { + return value; + } + } + throw new IllegalArgumentException(String.format("Unable to recognize specified Table option '%s'", optionName)); + } + @Override public Class getType() { return this.delegate.getType(); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableSpecification.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableSpecification.java index 61b05c030..2e8f8a880 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableSpecification.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/keyspace/TableSpecification.java @@ -296,7 +296,7 @@ public class TableSpecification extends TableOptionsSpecification