diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGenerator.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGenerator.java index eab6f7404..92644c214 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGenerator.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGenerator.java @@ -32,6 +32,7 @@ import org.springframework.util.StringUtils; * * @author Matthew T. Adams * @author Alex Shvid + * @author Mark Paluch */ public class CreateTableCqlGenerator extends TableOptionsCqlGenerator> { @@ -43,6 +44,9 @@ public class CreateTableCqlGenerator extends TableOptionsCqlGenerator options = spec().getOptions(); - if (!options.isEmpty()) { + if (!options.isEmpty() || StringUtils.hasText(ordering)) { // option preamble boolean first = true; @@ -164,8 +168,8 @@ public class CreateTableCqlGenerator extends TableOptionsCqlGenerator The concrete unit test class to which this integration test corresponds. - */ - public static abstract class Base extends AbstractKeyspaceCreatingIntegrationTest { + @Before + public void setUp() { - T unit; - - public abstract T unit(); - - @Test - public void test() { - - unit = unit(); - unit.prepare(); - - session.execute(unit.cql); - - CqlTableSpecificationAssertions.assertTable(unit.specification, keyspace, session); - } + session.execute("DROP TABLE IF EXISTS person;"); + session.execute("DROP TABLE IF EXISTS address;"); } - public static class BasicIntegrationTest extends Base { + @Test // DATACASS-518 + public void shouldGenerateSimpleTable() { - @Override - public BasicTest unit() { - return new BasicTest(); - } + CreateTableSpecification table = CreateTableSpecification.createTable("person") // + .partitionKeyColumn("id", DataType.ascii()) // + .clusteredKeyColumn("date_of_birth", DataType.date()) // + .column("name", DataType.ascii()); + + session.execute(CreateTableCqlGenerator.toCql(table)); } - public static class CompositePartitionKeyIntegrationTest extends Base { + @Test // DATACASS-518 + public void shouldGenerateTableWithClusterKeyOrdering() { - @Override - public CompositePartitionKeyTest unit() { - return new CompositePartitionKeyTest(); - } + CreateTableSpecification table = CreateTableSpecification.createTable("person") // + .partitionKeyColumn("id", DataType.ascii()) // + .partitionKeyColumn("country", DataType.ascii()) // + .clusteredKeyColumn("date_of_birth", DataType.date(), Ordering.ASCENDING) // + .clusteredKeyColumn("age", DataType.smallint()) // + .column("name", DataType.ascii()); + + TableMetadata person = cluster.getMetadata().getKeyspace(getKeyspace()).getTable("person"); + assertThat(person.getPartitionKey()).hasSize(2); + assertThat(person.getClusteringColumns()).hasSize(2); + + session.execute(CreateTableCqlGenerator.toCql(table)); + } + + @Test // DATACASS-518 + public void shouldGenerateTableWithClusterKeyAndOptions() { + + CreateTableSpecification table = CreateTableSpecification.createTable("person") // + .partitionKeyColumn("id", DataType.ascii()) // + .clusteredKeyColumn("date_of_birth", DataType.date(), Ordering.ASCENDING) // + .column("name", DataType.ascii()).with(TableOption.COMPACT_STORAGE); + + session.execute(CreateTableCqlGenerator.toCql(table)); + + TableMetadata person = cluster.getMetadata().getKeyspace(getKeyspace()).getTable("person"); + assertThat(person.getPartitionKey()).hasSize(1); + assertThat(person.getClusteringColumns()).hasSize(1); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGeneratorUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGeneratorUnitTests.java index 6d723dfa5..ec75a672b 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGeneratorUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/generator/CreateTableCqlGeneratorUnitTests.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.cassandra.core.cql.CqlIdentifier; +import org.springframework.data.cassandra.core.cql.Ordering; import org.springframework.data.cassandra.core.cql.ReservedKeyword; import org.springframework.data.cassandra.core.cql.keyspace.CreateTableSpecification; import org.springframework.data.cassandra.core.cql.keyspace.Option; @@ -46,11 +47,40 @@ import com.datastax.driver.core.DataType; * * @author Matthew T. Adams * @author David Webb + * @author Mark Paluch */ public class CreateTableCqlGeneratorUnitTests { private static final Logger log = LoggerFactory.getLogger(CreateTableCqlGeneratorUnitTests.class); + @Test // DATACASS-518 + public void createTableWithOrderedClustering() { + + CreateTableSpecification table = CreateTableSpecification.createTable("person") // + .partitionKeyColumn("id", DataType.ascii()) // + .clusteredKeyColumn("date_of_birth", DataType.date(), Ordering.ASCENDING) // + .column("name", DataType.ascii()); + + assertThat(CreateTableCqlGenerator.toCql(table)) + .isEqualTo("CREATE TABLE person (id ascii, date_of_birth date, name ascii, " // + + "PRIMARY KEY (id, date_of_birth)) " // + + "WITH CLUSTERING ORDER BY (date_of_birth ASC);"); + } + + @Test // DATACASS-518 + public void createTableWithOrderedClusteringAndOptions() { + + CreateTableSpecification table = CreateTableSpecification.createTable("person") // + .partitionKeyColumn("id", DataType.ascii()) // + .clusteredKeyColumn("date_of_birth", DataType.date(), Ordering.ASCENDING) // + .column("name", DataType.ascii()).with(TableOption.COMPACT_STORAGE); + + assertThat(CreateTableCqlGenerator.toCql(table)) + .isEqualTo("CREATE TABLE person (id ascii, date_of_birth date, name ascii, " // + + "PRIMARY KEY (id, date_of_birth)) " // + + "WITH CLUSTERING ORDER BY (date_of_birth ASC) AND COMPACT STORAGE;"); + } + /** * Asserts that the preamble is first & correctly formatted in the given CQL string. */