From 81a083af6360bdd9985721dd9ddad49cb7d14b43 Mon Sep 17 00:00:00 2001 From: Alex Shvid Date: Tue, 3 Dec 2013 13:58:02 -0800 Subject: [PATCH] moved create table from CqlUtils to cql generator --- .../generator/CreateTableCqlGenerator.java | 4 + .../core/keyspace/TableSpecification.java | 7 +- .../cassandra/convert/CassandraConverter.java | 3 + .../convert/MappingCassandraConverter.java | 47 ++++++++ .../core/CassandraAdminTemplate.java | 2 +- .../core/CassandraKeyspaceFactoryBean.java | 2 +- .../BasicCassandraPersistentProperty.java | 11 ++ .../mapping/CassandraPersistentProperty.java | 8 ++ .../data/cassandra/mapping/Column.java | 30 ++++++ .../data/cassandra/mapping/Order.java | 34 ++++++ .../data/cassandra/util/CqlUtils.java | 102 ++---------------- 11 files changed, 150 insertions(+), 100 deletions(-) create mode 100644 spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/Order.java diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java index 9af43eeb9..655a5f559 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java @@ -91,6 +91,10 @@ public class CreateTableCqlGenerator extends TableCqlGenerator extends TableOptionsSpecification, CassandraPersistentProperty, Object, Object> { + CreateTableSpecification getCreateTableSpecification(CassandraPersistentEntity entity); + } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java index e40e6bd5c..79387b654 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/MappingCassandraConverter.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.cassandra.core.keyspace.CreateTableSpecification; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.convert.support.DefaultConversionService; @@ -258,6 +259,52 @@ public class MappingCassandraConverter extends AbstractCassandraConverter implem } + public CreateTableSpecification getCreateTableSpecification(CassandraPersistentEntity entity) { + + final CreateTableSpecification spec = new CreateTableSpecification(); + + spec.name(entity.getTable()); + + entity.doWithProperties(new PropertyHandler() { + public void doWithPersistentProperty(CassandraPersistentProperty prop) { + + if (prop.isCompositePrimaryKey()) { + + CassandraPersistentEntity pkEntity = mappingContext.getPersistentEntity(prop.getRawType()); + + pkEntity.doWithProperties(new PropertyHandler() { + public void doWithPersistentProperty(CassandraPersistentProperty pkProp) { + + if (pkProp.isPartitioned()) { + spec.partitionKeyColumn(pkProp.getColumnName(), pkProp.getDataType()); + } else { + spec.clusteredKeyColumn(pkProp.getColumnName(), pkProp.getDataType(), pkProp.getOrdering()); + } + + } + }); + + } else { + + if (prop.isIdProperty()) { + spec.partitionKeyColumn(prop.getColumnName(), prop.getDataType()); + } else { + spec.column(prop.getColumnName(), prop.getDataType()); + } + + } + } + + }); + + if (spec.getPartitionKeyColumns().isEmpty()) { + throw new MappingException("not found partition key in the entity " + entity.getType()); + } + + return spec; + + } + @SuppressWarnings("unchecked") private Class transformClassToBeanClassLoaderClass(Class entity) { try { 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 eff4dd3d1..7a36405ff 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 @@ -83,7 +83,7 @@ public class CassandraAdminTemplate implements CassandraAdminOperations { execute(new SessionCallback() { public Object doInSession(Session s) throws DataAccessException { - String cql = CqlUtils.createTable(tableName, entity, mappingContext); + String cql = CqlUtils.createTable(tableName, entity, converter); log.info("CREATE TABLE CQL -> " + cql); s.execute(cql); return null; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java index 9444b8772..06d7bb784 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java @@ -249,7 +249,7 @@ public class CassandraKeyspaceFactoryBean implements FactoryBean entity) throws NoHostAvailableException { - String cql = CqlUtils.createTable(useTableName, entity, mappingContext); + String cql = CqlUtils.createTable(useTableName, entity, converter); log.info("Execute on keyspace " + keyspace + " CQL " + cql); session.execute(cql); for (String indexCQL : CqlUtils.createIndexes(useTableName, entity)) { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java index 48e742b95..18a8a971c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java @@ -20,6 +20,7 @@ import java.lang.reflect.Field; import java.util.List; import java.util.Set; +import org.springframework.cassandra.core.Ordering; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.mapping.Association; import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty; @@ -85,6 +86,16 @@ public class BasicCassandraPersistentProperty extends AnnotationBasedPersistentP return annotation != null && StringUtils.hasText(annotation.value()) ? annotation.value() : field.getName(); } + /** + * Returns ordering for the column. Valid only for clustered columns. + * + * @return + */ + public Ordering getOrdering() { + Order annotation = getField().getAnnotation(Order.class); + return annotation != null ? annotation.value() : null; + } + /** * Returns the data type information if exists. * diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraPersistentProperty.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraPersistentProperty.java index f1460ed86..528446419 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraPersistentProperty.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/CassandraPersistentProperty.java @@ -15,6 +15,7 @@ */ package org.springframework.data.cassandra.mapping; +import org.springframework.cassandra.core.Ordering; import org.springframework.data.mapping.PersistentProperty; import com.datastax.driver.core.DataType; @@ -40,6 +41,13 @@ public interface CassandraPersistentProperty extends PersistentProperty entity, - final MappingContext, CassandraPersistentProperty> mappingContext) { + CassandraConverter cassandraConverter) { - final StringBuilder str = new StringBuilder(); - str.append("CREATE TABLE "); - str.append(tableName); - str.append('('); + CreateTableSpecification spec = cassandraConverter.getCreateTableSpecification(entity); + spec.name(tableName); - final List clusteredIds = new ArrayList(); - final List partitionedIds = new ArrayList(); + CreateTableCqlGenerator generator = new CreateTableCqlGenerator(spec); - entity.doWithProperties(new PropertyHandler() { - public void doWithPersistentProperty(CassandraPersistentProperty prop) { - - if (prop.isCompositePrimaryKey()) { - - CassandraPersistentEntity pkEntity = mappingContext.getPersistentEntity(prop.getRawType()); - - pkEntity.doWithProperties(new PropertyHandler() { - public void doWithPersistentProperty(CassandraPersistentProperty pkProp) { - - if (pkProp.isPartitioned()) { - partitionedIds.add(pkProp.getColumnName()); - } else { - clusteredIds.add(pkProp.getColumnName()); - } - - if (str.charAt(str.length() - 1) != '(') { - str.append(','); - } - - String columnName = pkProp.getColumnName(); - - str.append(columnName); - str.append(' '); - - DataType dataType = pkProp.getDataType(); - - str.append(toCQL(dataType)); - - } - }); - - } else { - - if (str.charAt(str.length() - 1) != '(') { - str.append(','); - } - - String columnName = prop.getColumnName(); - - str.append(columnName); - str.append(' '); - - DataType dataType = prop.getDataType(); - - str.append(toCQL(dataType)); - - if (prop.isIdProperty()) { - partitionedIds.add(prop.getColumnName()); - } - } - - } - - }); - - if (partitionedIds.isEmpty()) { - throw new InvalidDataAccessApiUsageException("not found partition key in the entity " + entity.getType()); - } - - str.append(",PRIMARY KEY("); - - if (partitionedIds.size() > 1) { - str.append('('); - } - - for (String id : partitionedIds) { - if (str.charAt(str.length() - 1) != '(') { - str.append(','); - } - str.append(id); - } - - if (partitionedIds.size() > 1) { - str.append(')'); - } - - for (String id : clusteredIds) { - str.append(','); - str.append(id); - } - - str.append("));"); - - return str.toString(); + return generator.toCql(); } /**