diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AbstractTableOperationCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/AbstractTableOperationCqlGenerator.java new file mode 100644 index 000000000..b958e89db --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/AbstractTableOperationCqlGenerator.java @@ -0,0 +1,85 @@ +package org.springframework.cassandra.core.cql.builder; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.escapeSingle; +import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; +import static org.springframework.cassandra.core.cql.CqlStringUtils.singleQuote; + +import java.util.Map; + +import org.springframework.cassandra.core.keyspace.AbstractTableSpecification; +import org.springframework.cassandra.core.keyspace.Option; +import org.springframework.util.Assert; + +/** + * Base class that contains behavior common to table operations. + * + * @author Matthew T. Adams + * @param T The subtype of AbstractTableSpecification for which this is a CQL generator. + */ +public abstract class AbstractTableOperationCqlGenerator> { + + protected abstract StringBuilder toCql(StringBuilder cql); + + private AbstractTableSpecification specification; + + public AbstractTableOperationCqlGenerator(AbstractTableSpecification specification) { + setSpecification(specification); + } + + protected void setSpecification(AbstractTableSpecification specification) { + Assert.notNull(specification); + this.specification = specification; + } + + @SuppressWarnings("unchecked") + public T getSpecification() { + return (T) specification; + } + + /** + * Convenient synonymous method of {@link #getSpecification()}. + */ + protected T spec() { + return getSpecification(); + } + + protected StringBuilder optionValueMap(Map valueMap, StringBuilder cql) { + cql = noNull(cql); + + if (valueMap == null || valueMap.isEmpty()) { + return cql; + } + // else option value is a non-empty map + + // append { 'name' : 'value', ... } + cql.append("{ "); + boolean mapFirst = true; + for (Map.Entry entry : valueMap.entrySet()) { + if (mapFirst) { + mapFirst = false; + } else { + cql.append(", "); + } + + Option option = entry.getKey(); + cql.append(singleQuote(option.getName())); // entries in map keys are always quoted + cql.append(" : "); + Object entryValue = entry.getValue(); + entryValue = entryValue == null ? "" : entryValue.toString(); + if (option.escapesValue()) { + entryValue = escapeSingle(entryValue); + } + if (option.quotesValue()) { + entryValue = singleQuote(entryValue); + } + cql.append(entryValue); + } + cql.append(" }"); + + return cql; + } + + public String toCql() { + return toCql(null).toString(); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AddColumn.java b/src/main/java/org/springframework/cassandra/core/cql/builder/AddColumn.java deleted file mode 100644 index 497e4fc3a..000000000 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/AddColumn.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.springframework.cassandra.core.cql.builder; - -import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; - -import com.datastax.driver.core.DataType; - -public class AddColumn extends ColumnTypeChange { - - public AddColumn(String name, DataType type) { - super(name, type); - } - - @Override - public StringBuilder toCql(StringBuilder cql) { - return noNull(cql).append("ADD ").append(getNameAsIdentifier()).append(" TYPE ").append(getType().getName()); - } -} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AddColumnCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/AddColumnCqlGenerator.java new file mode 100644 index 000000000..72c8b529b --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/AddColumnCqlGenerator.java @@ -0,0 +1,18 @@ +package org.springframework.cassandra.core.cql.builder; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; + +import org.springframework.cassandra.core.keyspace.AddColumnSpecification; + +public class AddColumnCqlGenerator extends ColumnChangeCqlGenerator { + + public AddColumnCqlGenerator(AddColumnSpecification specification) { + super(specification); + } + + @Override + public StringBuilder toCql(StringBuilder cql) { + return noNull(cql).append("ADD ").append(spec().getNameAsIdentifier()).append(" TYPE ") + .append(spec().getType().getName()); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AlterColumnCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/AlterColumnCqlGenerator.java new file mode 100644 index 000000000..8f6db5a44 --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/AlterColumnCqlGenerator.java @@ -0,0 +1,17 @@ +package org.springframework.cassandra.core.cql.builder; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; + +import org.springframework.cassandra.core.keyspace.AlterColumnSpecification; + +public class AlterColumnCqlGenerator extends ColumnChangeCqlGenerator { + + public AlterColumnCqlGenerator(AlterColumnSpecification specification) { + super(specification); + } + + public StringBuilder toCql(StringBuilder cql) { + return noNull(cql).append("ALTER ").append(spec().getNameAsIdentifier()).append(" TYPE ") + .append(spec().getType().getName()); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AlterTableBuilder.java b/src/main/java/org/springframework/cassandra/core/cql/builder/AlterTableBuilder.java deleted file mode 100644 index 511009dcb..000000000 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/AlterTableBuilder.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.springframework.cassandra.core.cql.builder; - -import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.datastax.driver.core.DataType; - -public class AlterTableBuilder extends AbstractTableBuilder { - - private List changes = new ArrayList(); - - public AlterTableBuilder drop(String column) { - changes.add(new DropColumn(column)); - return this; - } - - public AlterTableBuilder add(String column, DataType type) { - changes.add(new AddColumn(column, type)); - return this; - } - - public AlterTableBuilder alter(String column, DataType type) { - changes.add(new AlterColumn(column, type)); - return this; - } - - public AlterTableBuilder name(String name) { - return (AlterTableBuilder) super.name(name); - } - - @Override - public StringBuilder toCql(StringBuilder cql) { - cql = noNull(cql); - - preambleCql(cql); - changesCql(cql); - optionsCql(cql); - - cql.append(";"); - - return cql; - } - - protected StringBuilder preambleCql(StringBuilder cql) { - return noNull(cql).append("ALTER TABLE ").append(getNameAsIdentifier()).append(" "); - } - - protected StringBuilder changesCql(StringBuilder cql) { - cql = noNull(cql); - - boolean first = true; - for (ColumnChange change : changes) { - if (first) { - first = false; - } else { - cql.append(" "); - } - change.toCql(cql); - } - - return cql; - } - - @SuppressWarnings("unchecked") - protected StringBuilder optionsCql(StringBuilder cql) { - cql = noNull(cql); - - Map options = options(); - if (options == null || options.isEmpty()) { - return cql; - } - - cql.append(" WITH "); - boolean first = true; - for (String key : options.keySet()) { - if (first) { - first = false; - } else { - cql.append(" AND "); - } - - cql.append(key); - - Object value = options.get(key); - if (value == null) { - continue; - } - cql.append(" = "); - - if (value instanceof Map) { - optionValueMap((Map) value, cql); - continue; - } - - // else just use value as string - cql.append(value.toString()); - } - return cql; - } -} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AlterTableCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/AlterTableCqlGenerator.java new file mode 100644 index 000000000..0eb367edf --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/AlterTableCqlGenerator.java @@ -0,0 +1,102 @@ +package org.springframework.cassandra.core.cql.builder; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; + +import java.util.Map; + +import org.springframework.cassandra.core.keyspace.AddColumnSpecification; +import org.springframework.cassandra.core.keyspace.AlterColumnSpecification; +import org.springframework.cassandra.core.keyspace.AlterTableSpecification; +import org.springframework.cassandra.core.keyspace.ColumnChangeSpecification; +import org.springframework.cassandra.core.keyspace.DropColumnSpecification; +import org.springframework.cassandra.core.keyspace.Option; + +public class AlterTableCqlGenerator extends AbstractTableOperationCqlGenerator { + + public AlterTableCqlGenerator(AlterTableSpecification specification) { + super(specification); + } + + @Override + public StringBuilder toCql(StringBuilder cql) { + cql = noNull(cql); + + preambleCql(cql); + changesCql(cql); + optionsCql(cql); + + cql.append(";"); + + return cql; + } + + protected StringBuilder preambleCql(StringBuilder cql) { + return noNull(cql).append("ALTER TABLE ").append(spec().getNameAsIdentifier()).append(" "); + } + + protected StringBuilder changesCql(StringBuilder cql) { + cql = noNull(cql); + + boolean first = true; + for (ColumnChangeSpecification change : spec().getChanges()) { + if (first) { + first = false; + } else { + cql.append(" "); + } + getCqlGeneratorFor(change).toCql(cql); + } + + return cql; + } + + protected ColumnChangeCqlGenerator getCqlGeneratorFor(ColumnChangeSpecification change) { + if (change instanceof AddColumnSpecification) { + return new AddColumnCqlGenerator((AddColumnSpecification) change); + } + if (change instanceof DropColumnSpecification) { + return new DropColumnCqlGenerator((DropColumnSpecification) change); + } + if (change instanceof AlterColumnSpecification) { + return new AlterColumnCqlGenerator((AlterColumnSpecification) change); + } + throw new Error("unknown ColumnChangeSpecification type: " + change.getClass().getName()); + } + + @SuppressWarnings("unchecked") + protected StringBuilder optionsCql(StringBuilder cql) { + cql = noNull(cql); + + Map options = spec().getOptions(); + if (options == null || options.isEmpty()) { + return cql; + } + + cql.append(" WITH "); + boolean first = true; + for (String key : options.keySet()) { + if (first) { + first = false; + } else { + cql.append(" AND "); + } + + cql.append(key); + + Object value = options.get(key); + if (value == null) { + continue; + } + cql.append(" = "); + + if (value instanceof Map) { + optionValueMap((Map) value, cql); + continue; + } + + // else just use value as string + cql.append(value.toString()); + } + return cql; + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnChangeCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnChangeCqlGenerator.java new file mode 100644 index 000000000..66236816b --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnChangeCqlGenerator.java @@ -0,0 +1,29 @@ +package org.springframework.cassandra.core.cql.builder; + +import org.springframework.cassandra.core.keyspace.ColumnChangeSpecification; +import org.springframework.util.Assert; + +public abstract class ColumnChangeCqlGenerator { + + public abstract StringBuilder toCql(StringBuilder cql); + + private ColumnChangeSpecification specification; + + public ColumnChangeCqlGenerator(ColumnChangeSpecification specification) { + setSpecification(specification); + } + + protected void setSpecification(ColumnChangeSpecification specification) { + Assert.notNull(specification); + this.specification = specification; + } + + @SuppressWarnings("unchecked") + public T getSpecification() { + return (T) specification; + } + + protected T spec() { + return getSpecification(); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/CreateTableBuilder.java b/src/main/java/org/springframework/cassandra/core/cql/builder/CreateTableCqlGenerator.java similarity index 62% rename from src/main/java/org/springframework/cassandra/core/cql/builder/CreateTableBuilder.java rename to src/main/java/org/springframework/cassandra/core/cql/builder/CreateTableCqlGenerator.java index 84e828246..06554e891 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/CreateTableBuilder.java +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/CreateTableCqlGenerator.java @@ -3,69 +3,24 @@ package org.springframework.cassandra.core.cql.builder; import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; import static org.springframework.data.cassandra.mapping.KeyType.PARTITION; import static org.springframework.data.cassandra.mapping.KeyType.PRIMARY; -import static org.springframework.data.cassandra.mapping.Ordering.ASCENDING; import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.springframework.data.cassandra.mapping.KeyType; -import org.springframework.data.cassandra.mapping.Ordering; - -import com.datastax.driver.core.DataType; +import org.springframework.cassandra.core.keyspace.ColumnSpecification; +import org.springframework.cassandra.core.keyspace.CreateTableSpecification; +import org.springframework.cassandra.core.keyspace.Option; /** * Builder class to construct CQL for a CREATE TABLE statement. Not threadsafe. * * @author Matthew T. Adams */ -public class CreateTableBuilder extends AbstractTableBuilder { +public class CreateTableCqlGenerator extends AbstractTableOperationCqlGenerator { - private boolean ifNotExists = false; - private List columns = new ArrayList(); - - /** - * Causes the inclusion of an IF NOT EXISTS clause. - * - * @return this - */ - public CreateTableBuilder ifNotExists() { - return ifNotExists(true); - } - - /** - * Toggles the inclusion of an IF NOT EXISTS clause. - * - * @return this - */ - public CreateTableBuilder ifNotExists(boolean ifNotExists) { - this.ifNotExists = ifNotExists; - return this; - } - - public CreateTableBuilder column(String name, DataType type) { - return column(name, type, null, null); - } - - public CreateTableBuilder partitionKeyColumn(String name, DataType type) { - return column(name, type, PARTITION, null); - } - - public CreateTableBuilder primaryKeyColumn(String name, DataType type) { - return primaryKeyColumn(name, type, ASCENDING); - } - - public CreateTableBuilder primaryKeyColumn(String name, DataType type, Ordering order) { - return column(name, type, PRIMARY, order); - } - - protected CreateTableBuilder column(String name, DataType type, KeyType keyType, Ordering ordering) { - columns().add(new ColumnBuilder().name(name).type(type).keyType(keyType).ordering(ordering)); - return this; - } - - protected List columns() { - return columns == null ? columns = new ArrayList() : columns; + public CreateTableCqlGenerator(CreateTableSpecification specification) { + super(specification); } public StringBuilder toCql(StringBuilder cql) { @@ -81,8 +36,8 @@ public class CreateTableBuilder extends AbstractTableBuilder } protected StringBuilder preambleCql(StringBuilder cql) { - return noNull(cql).append("CREATE TABLE ").append(ifNotExists ? "IF NOT EXISTS " : "") - .append(getNameAsIdentifier()); + return noNull(cql).append("CREATE TABLE ").append(spec().getIfNotExists() ? "IF NOT EXISTS " : "") + .append(spec().getNameAsIdentifier()); } @SuppressWarnings("unchecked") @@ -93,9 +48,9 @@ public class CreateTableBuilder extends AbstractTableBuilder // begin columns cql.append(" ("); - List partitionKeys = new ArrayList(); - List primaryKeys = new ArrayList(); - for (ColumnBuilder col : columns) { + List partitionKeys = new ArrayList(); + List primaryKeys = new ArrayList(); + for (ColumnSpecification col : spec().getColumns()) { col.toCql(cql).append(", "); if (col.getKeyType() == PARTITION) { @@ -115,7 +70,7 @@ public class CreateTableBuilder extends AbstractTableBuilder } boolean first = true; - for (ColumnBuilder col : partitionKeys) { + for (ColumnSpecification col : partitionKeys) { if (first) { first = false; } else { @@ -131,7 +86,7 @@ public class CreateTableBuilder extends AbstractTableBuilder StringBuilder clustering = null; boolean clusteringFirst = true; first = true; - for (ColumnBuilder col : primaryKeys) { + for (ColumnSpecification col : primaryKeys) { if (first) { first = false; } else { @@ -167,6 +122,8 @@ public class CreateTableBuilder extends AbstractTableBuilder // begin options // begin option clause + Map options = spec().getOptions(); + if (clustering != null || !options.isEmpty()) { // option preamble diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/DropColumn.java b/src/main/java/org/springframework/cassandra/core/cql/builder/DropColumn.java deleted file mode 100644 index d8db7ab79..000000000 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/DropColumn.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.springframework.cassandra.core.cql.builder; - -import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; - -public class DropColumn extends ColumnChange { - - public DropColumn(String name) { - super(name); - } - - @Override - public StringBuilder toCql(StringBuilder cql) { - return noNull(cql).append("DROP ").append(getNameAsIdentifier()); - } -} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/DropColumnCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/DropColumnCqlGenerator.java new file mode 100644 index 000000000..8fa3a1129 --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/DropColumnCqlGenerator.java @@ -0,0 +1,16 @@ +package org.springframework.cassandra.core.cql.builder; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; + +import org.springframework.cassandra.core.keyspace.DropColumnSpecification; + +public class DropColumnCqlGenerator extends ColumnChangeCqlGenerator { + + public DropColumnCqlGenerator(DropColumnSpecification specification) { + super(specification); + } + + public StringBuilder toCql(StringBuilder cql) { + return noNull(cql).append("DROP ").append(spec().getNameAsIdentifier()); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/DropTableBuilder.java b/src/main/java/org/springframework/cassandra/core/cql/builder/DropTableBuilder.java deleted file mode 100644 index f5546af62..000000000 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/DropTableBuilder.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.springframework.cassandra.core.cql.builder; - -import static org.springframework.cassandra.core.cql.CqlStringUtils.checkIdentifier; -import static org.springframework.cassandra.core.cql.CqlStringUtils.identifize; -import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; - -public class DropTableBuilder { - - private String name; - private boolean ifExists; - - public DropTableBuilder name(String name) { - checkIdentifier(name); - this.name = name; - return this; - } - - public DropTableBuilder ifExists() { - return ifExists(true); - } - - public DropTableBuilder ifExists(boolean ifExists) { - this.ifExists = ifExists; - return this; - } - - public StringBuilder toCql(StringBuilder cql) { - return noNull(cql).append("DROP TABLE ").append(ifExists ? "IF EXISTS " : "").append(identifize(name)); - } - - public String toCql() { - return toCql(null).toString(); - } - - public String toString() { - return toCql(); - } -} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/DropTableCqlGenerator.java b/src/main/java/org/springframework/cassandra/core/cql/builder/DropTableCqlGenerator.java new file mode 100644 index 000000000..0a82d6668 --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/cql/builder/DropTableCqlGenerator.java @@ -0,0 +1,29 @@ +package org.springframework.cassandra.core.cql.builder; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; + +import org.springframework.cassandra.core.keyspace.DropTableSpecification; +import org.springframework.util.Assert; + +public class DropTableCqlGenerator { + + protected DropTableSpecification specification; + + public DropTableCqlGenerator(DropTableSpecification specification) { + setSpecification(specification); + } + + protected void setSpecification(DropTableSpecification specification) { + Assert.notNull(specification); + this.specification = specification; + } + + public StringBuilder toCql(StringBuilder cql) { + return noNull(cql).append("DROP TABLE ").append(specification.getIfExists() ? "IF EXISTS " : "") + .append(specification.getNameAsIdentifier()); + } + + public String toCql() { + return toCql(null).toString(); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AbstractTableBuilder.java b/src/main/java/org/springframework/cassandra/core/keyspace/AbstractTableSpecification.java similarity index 68% rename from src/main/java/org/springframework/cassandra/core/cql/builder/AbstractTableBuilder.java rename to src/main/java/org/springframework/cassandra/core/keyspace/AbstractTableSpecification.java index 6f25a10f1..1e1ff0ad8 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/AbstractTableBuilder.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/AbstractTableSpecification.java @@ -1,10 +1,11 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; +import static org.springframework.cassandra.core.cql.CqlStringUtils.checkIdentifier; import static org.springframework.cassandra.core.cql.CqlStringUtils.escapeSingle; import static org.springframework.cassandra.core.cql.CqlStringUtils.identifize; -import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; import static org.springframework.cassandra.core.cql.CqlStringUtils.singleQuote; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @@ -16,9 +17,7 @@ import org.springframework.cassandra.core.cql.CqlStringUtils; * @author Matthew T. Adams * @param T The subtype of AbstractTableBuilder. */ -public abstract class AbstractTableBuilder> { - - protected abstract StringBuilder toCql(StringBuilder cql); +public abstract class AbstractTableSpecification> { private String name; @@ -31,11 +30,15 @@ public abstract class AbstractTableBuilder> { */ @SuppressWarnings("unchecked") public T name(String name) { - CqlStringUtils.checkIdentifier(name); - this.name = name; + setName(name); return (T) this; } + public void setName(String name) { + checkIdentifier(name); + this.name = name; + } + public String getName() { return name; } @@ -95,55 +98,11 @@ public abstract class AbstractTableBuilder> { value = singleQuote(value); } } - options().put(name, value); + options.put(name, value); return (T) this; } - protected Map options() { - return options == null ? options = new LinkedHashMap() : options; - } - - protected StringBuilder optionValueMap(Map valueMap, StringBuilder cql) { - cql = noNull(cql); - - if (valueMap == null || valueMap.isEmpty()) { - return cql; - } - // else option value is a non-empty map - - // append { 'name' : 'value', ... } - cql.append("{ "); - boolean mapFirst = true; - for (Map.Entry entry : valueMap.entrySet()) { - if (mapFirst) { - mapFirst = false; - } else { - cql.append(", "); - } - - Option option = entry.getKey(); - cql.append(singleQuote(option.getName())); // entries in map keys are always quoted - cql.append(" : "); - Object entryValue = entry.getValue(); - entryValue = entryValue == null ? "" : entryValue.toString(); - if (option.escapesValue()) { - entryValue = escapeSingle(entryValue); - } - if (option.quotesValue()) { - entryValue = singleQuote(entryValue); - } - cql.append(entryValue); - } - cql.append(" }"); - - return cql; - } - - public String toCql() { - return toCql(null).toString(); - } - - public String toString() { - return toCql(null).toString(); + public Map getOptions() { + return Collections.unmodifiableMap(options); } } diff --git a/src/main/java/org/springframework/cassandra/core/keyspace/AddColumnSpecification.java b/src/main/java/org/springframework/cassandra/core/keyspace/AddColumnSpecification.java new file mode 100644 index 000000000..e42adcefd --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/keyspace/AddColumnSpecification.java @@ -0,0 +1,10 @@ +package org.springframework.cassandra.core.keyspace; + +import com.datastax.driver.core.DataType; + +public class AddColumnSpecification extends ColumnTypeChangeSpecification { + + public AddColumnSpecification(String name, DataType type) { + super(name, type); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/AlterColumn.java b/src/main/java/org/springframework/cassandra/core/keyspace/AlterColumnSpecification.java similarity index 62% rename from src/main/java/org/springframework/cassandra/core/cql/builder/AlterColumn.java rename to src/main/java/org/springframework/cassandra/core/keyspace/AlterColumnSpecification.java index d04d3c1a6..62c58d1ac 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/AlterColumn.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/AlterColumnSpecification.java @@ -1,12 +1,12 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import static org.springframework.cassandra.core.cql.CqlStringUtils.noNull; import com.datastax.driver.core.DataType; -public class AlterColumn extends ColumnTypeChange { +public class AlterColumnSpecification extends ColumnTypeChangeSpecification { - public AlterColumn(String name, DataType type) { + public AlterColumnSpecification(String name, DataType type) { super(name, type); } diff --git a/src/main/java/org/springframework/cassandra/core/keyspace/AlterTableSpecification.java b/src/main/java/org/springframework/cassandra/core/keyspace/AlterTableSpecification.java new file mode 100644 index 000000000..6f1d9fd7d --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/keyspace/AlterTableSpecification.java @@ -0,0 +1,31 @@ +package org.springframework.cassandra.core.keyspace; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.datastax.driver.core.DataType; + +public class AlterTableSpecification extends AbstractTableSpecification { + + private List changes = new ArrayList(); + + public AlterTableSpecification drop(String column) { + changes.add(new DropColumnSpecification(column)); + return this; + } + + public AlterTableSpecification add(String column, DataType type) { + changes.add(new AddColumnSpecification(column, type)); + return this; + } + + public AlterTableSpecification alter(String column, DataType type) { + changes.add(new AlterColumnSpecification(column, type)); + return this; + } + + public List getChanges() { + return Collections.unmodifiableList(changes); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnChange.java b/src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java similarity index 62% rename from src/main/java/org/springframework/cassandra/core/cql/builder/ColumnChange.java rename to src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java index 497ddec2a..6344b888f 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnChange.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java @@ -1,22 +1,16 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import static org.springframework.cassandra.core.cql.CqlStringUtils.checkIdentifier; import static org.springframework.cassandra.core.cql.CqlStringUtils.identifize; -public abstract class ColumnChange { - - public abstract StringBuilder toCql(StringBuilder cql); +public abstract class ColumnChangeSpecification { private String name; - public ColumnChange(String name) { + public ColumnChangeSpecification(String name) { setName(name); } - public String toString() { - return toCql(null).toString(); - } - private void setName(String name) { checkIdentifier(name); this.name = name; diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnBuilder.java b/src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java similarity index 88% rename from src/main/java/org/springframework/cassandra/core/cql/builder/ColumnBuilder.java rename to src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java index 49a51ab30..bdbcf0220 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnBuilder.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java @@ -1,4 +1,4 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import static org.springframework.cassandra.core.cql.CqlStringUtils.checkIdentifier; import static org.springframework.cassandra.core.cql.CqlStringUtils.identifize; @@ -22,7 +22,7 @@ import com.datastax.driver.core.DataType; * * @author Matthew T. Adams */ -public class ColumnBuilder { +public class ColumnSpecification { /** * Default ordering of primary key fields; value is {@link Ordering#ASCENDING}. @@ -39,7 +39,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder name(String name) { + public ColumnSpecification name(String name) { checkIdentifier(name); this.name = name; return this; @@ -50,7 +50,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder type(DataType type) { + public ColumnSpecification type(DataType type) { this.type = type; return this; } @@ -61,7 +61,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder partition() { + public ColumnSpecification partition() { return partition(true); } @@ -72,7 +72,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder partition(boolean partition) { + public ColumnSpecification partition(boolean partition) { this.keyType = partition ? PARTITION : null; this.ordering = null; return this; @@ -84,7 +84,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder primary() { + public ColumnSpecification primary() { return primary(DFAULT_ORDERING); } @@ -94,7 +94,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder primary(Ordering order) { + public ColumnSpecification primary(Ordering order) { return primary(order, true); } @@ -105,7 +105,7 @@ public class ColumnBuilder { * * @return this */ - public ColumnBuilder primary(Ordering order, boolean primary) { + public ColumnSpecification primary(Ordering order, boolean primary) { this.keyType = primary ? PRIMARY : null; this.ordering = primary ? order : null; return this; @@ -116,7 +116,7 @@ public class ColumnBuilder { * * @return this */ - /* package */ColumnBuilder keyType(KeyType keyType) { + /* package */ColumnSpecification keyType(KeyType keyType) { this.keyType = keyType; return this; } @@ -126,7 +126,7 @@ public class ColumnBuilder { * * @return this */ - /* package */ColumnBuilder ordering(Ordering ordering) { + /* package */ColumnSpecification ordering(Ordering ordering) { this.ordering = ordering; return this; } diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnTypeChange.java b/src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java similarity index 57% rename from src/main/java/org/springframework/cassandra/core/cql/builder/ColumnTypeChange.java rename to src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java index 9d0238554..3f1a4d4f9 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/ColumnTypeChange.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java @@ -1,14 +1,14 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import org.springframework.util.Assert; import com.datastax.driver.core.DataType; -public abstract class ColumnTypeChange extends ColumnChange { +public abstract class ColumnTypeChangeSpecification extends ColumnChangeSpecification { private DataType type; - public ColumnTypeChange(String name, DataType type) { + public ColumnTypeChangeSpecification(String name, DataType type) { super(name); setType(type); } diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/CqlBuilder.java b/src/main/java/org/springframework/cassandra/core/keyspace/CqlBuilder.java similarity index 53% rename from src/main/java/org/springframework/cassandra/core/cql/builder/CqlBuilder.java rename to src/main/java/org/springframework/cassandra/core/keyspace/CqlBuilder.java index f6d1a8dbb..8180f730e 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/CqlBuilder.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/CqlBuilder.java @@ -1,46 +1,46 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; public class CqlBuilder { /** * Entry point into the {@link CqlBuilder}'s fluent API to create a table. Convenient if imported statically. */ - public static CreateTableBuilder createTable() { - return new CreateTableBuilder(); + public static CreateTableSpecification createTable() { + return new CreateTableSpecification(); } /** * Entry point into the {@link CqlBuilder}'s fluent API to create a table. Convenient if imported statically. */ - public static CreateTableBuilder createTable(String name) { - return new CreateTableBuilder().name(name); + public static CreateTableSpecification createTable(String name) { + return new CreateTableSpecification().name(name); } /** * Entry point into the {@link CqlBuilder}'s fluent API to alter a table. Convenient if imported statically. */ - public static AlterTableBuilder alterTable() { - return new AlterTableBuilder(); + public static AlterTableSpecification alterTable() { + return new AlterTableSpecification(); } /** * Entry point into the {@link CqlBuilder}'s fluent API to alter a table. Convenient if imported statically. */ - public static AlterTableBuilder alterTable(String name) { - return new AlterTableBuilder().name(name); + public static AlterTableSpecification alterTable(String name) { + return new AlterTableSpecification().name(name); } /** * Entry point into the {@link CqlBuilder}'s fluent API to drop a table. Convenient if imported statically. */ - public static DropTableBuilder dropTable() { - return new DropTableBuilder(); + public static DropTableSpecification dropTable() { + return new DropTableSpecification(); } /** * Entry point into the {@link CqlBuilder}'s fluent API to drop a table. Convenient if imported statically. */ - public static DropTableBuilder dropTable(String name) { - return new DropTableBuilder().name(name); + public static DropTableSpecification dropTable(String name) { + return new DropTableSpecification().name(name); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/cassandra/core/keyspace/CreateTableSpecification.java b/src/main/java/org/springframework/cassandra/core/keyspace/CreateTableSpecification.java new file mode 100644 index 000000000..6f14a4021 --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/keyspace/CreateTableSpecification.java @@ -0,0 +1,77 @@ +package org.springframework.cassandra.core.keyspace; + +import static org.springframework.data.cassandra.mapping.KeyType.PARTITION; +import static org.springframework.data.cassandra.mapping.KeyType.PRIMARY; +import static org.springframework.data.cassandra.mapping.Ordering.ASCENDING; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.springframework.data.cassandra.mapping.KeyType; +import org.springframework.data.cassandra.mapping.Ordering; + +import com.datastax.driver.core.DataType; + +/** + * Builder class to construct CQL for a CREATE TABLE statement. Not threadsafe. + * + * @author Matthew T. Adams + */ +public class CreateTableSpecification extends AbstractTableSpecification { + + private boolean ifNotExists = false; + private List columns = new ArrayList(); + + /** + * Causes the inclusion of an IF NOT EXISTS clause. + * + * @return this + */ + public CreateTableSpecification ifNotExists() { + return ifNotExists(true); + } + + /** + * Toggles the inclusion of an IF NOT EXISTS clause. + * + * @return this + */ + public CreateTableSpecification ifNotExists(boolean ifNotExists) { + this.ifNotExists = ifNotExists; + return this; + } + + public CreateTableSpecification column(String name, DataType type) { + return column(name, type, null, null); + } + + public CreateTableSpecification partitionKeyColumn(String name, DataType type) { + return column(name, type, PARTITION, null); + } + + public CreateTableSpecification primaryKeyColumn(String name, DataType type) { + return primaryKeyColumn(name, type, ASCENDING); + } + + public CreateTableSpecification primaryKeyColumn(String name, DataType type, Ordering order) { + return column(name, type, PRIMARY, order); + } + + protected CreateTableSpecification column(String name, DataType type, KeyType keyType, Ordering ordering) { + columns().add(new ColumnSpecification().name(name).type(type).keyType(keyType).ordering(ordering)); + return this; + } + + protected List columns() { + return columns == null ? columns = new ArrayList() : columns; + } + + public boolean getIfNotExists() { + return ifNotExists; + } + + public List getColumns() { + return Collections.unmodifiableList(columns); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/DefaultOption.java b/src/main/java/org/springframework/cassandra/core/keyspace/DefaultOption.java similarity index 98% rename from src/main/java/org/springframework/cassandra/core/cql/builder/DefaultOption.java rename to src/main/java/org/springframework/cassandra/core/keyspace/DefaultOption.java index 290b80756..8fc6c76de 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/DefaultOption.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/DefaultOption.java @@ -1,4 +1,4 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import static org.springframework.cassandra.core.cql.CqlStringUtils.escapeSingle; import static org.springframework.cassandra.core.cql.CqlStringUtils.singleQuote; diff --git a/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java b/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java new file mode 100644 index 000000000..d485b852c --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java @@ -0,0 +1,8 @@ +package org.springframework.cassandra.core.keyspace; + +public class DropColumnSpecification extends ColumnChangeSpecification { + + public DropColumnSpecification(String name) { + super(name); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/keyspace/DropTableSpecification.java b/src/main/java/org/springframework/cassandra/core/keyspace/DropTableSpecification.java new file mode 100644 index 000000000..0b219c53e --- /dev/null +++ b/src/main/java/org/springframework/cassandra/core/keyspace/DropTableSpecification.java @@ -0,0 +1,33 @@ +package org.springframework.cassandra.core.keyspace; + +import static org.springframework.cassandra.core.cql.CqlStringUtils.checkIdentifier; +import static org.springframework.cassandra.core.cql.CqlStringUtils.identifize; + +public class DropTableSpecification { + + private String name; + private boolean ifExists; + + public DropTableSpecification name(String name) { + checkIdentifier(name); + this.name = name; + return this; + } + + public DropTableSpecification ifExists() { + return ifExists(true); + } + + public DropTableSpecification ifExists(boolean ifExists) { + this.ifExists = ifExists; + return this; + } + + public boolean getIfExists() { + return ifExists; + } + + public String getNameAsIdentifier() { + return identifize(name); + } +} diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/MapBuilder.java b/src/main/java/org/springframework/cassandra/core/keyspace/MapBuilder.java similarity index 97% rename from src/main/java/org/springframework/cassandra/core/cql/builder/MapBuilder.java rename to src/main/java/org/springframework/cassandra/core/keyspace/MapBuilder.java index 342c61dda..ea68ca38a 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/MapBuilder.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/MapBuilder.java @@ -1,4 +1,4 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import java.util.Collection; import java.util.LinkedHashMap; diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/Option.java b/src/main/java/org/springframework/cassandra/core/keyspace/Option.java similarity index 96% rename from src/main/java/org/springframework/cassandra/core/cql/builder/Option.java rename to src/main/java/org/springframework/cassandra/core/keyspace/Option.java index 25e9e8163..055512414 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/Option.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/Option.java @@ -1,4 +1,4 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; /** * Interface to represent option types. diff --git a/src/main/java/org/springframework/cassandra/core/cql/builder/TableOption.java b/src/main/java/org/springframework/cassandra/core/keyspace/TableOption.java similarity index 97% rename from src/main/java/org/springframework/cassandra/core/cql/builder/TableOption.java rename to src/main/java/org/springframework/cassandra/core/keyspace/TableOption.java index 97469a3c4..e41978dbf 100644 --- a/src/main/java/org/springframework/cassandra/core/cql/builder/TableOption.java +++ b/src/main/java/org/springframework/cassandra/core/keyspace/TableOption.java @@ -1,10 +1,10 @@ -package org.springframework.cassandra.core.cql.builder; +package org.springframework.cassandra.core.keyspace; import java.util.Map; /** * Enumeration that represents all known table options. If a table option is not listed here, but is supported by - * Cassandra, use the method {@link CreateTableBuilder#with(String, Object, boolean, boolean)} to write the raw value. + * Cassandra, use the method {@link CreateTableSpecification#with(String, Object, boolean, boolean)} to write the raw value. * * Implements {@link Option} via delegation, since {@link Enum}s can't extend anything. * diff --git a/src/test/java/org/springframework/cassandra/cql/builder/AlterTableBuilderTest.java b/src/test/java/org/springframework/cassandra/cql/builder/AlterTableBuilderTest.java index 38f097cce..4a935393a 100644 --- a/src/test/java/org/springframework/cassandra/cql/builder/AlterTableBuilderTest.java +++ b/src/test/java/org/springframework/cassandra/cql/builder/AlterTableBuilderTest.java @@ -1,8 +1,10 @@ package org.springframework.cassandra.cql.builder; -import static org.springframework.cassandra.core.cql.builder.CqlBuilder.alterTable; +import static org.springframework.cassandra.core.keyspace.CqlBuilder.alterTable; import org.junit.Test; +import org.springframework.cassandra.core.cql.builder.AlterTableCqlGenerator; +import org.springframework.cassandra.core.keyspace.AlterTableSpecification; import com.datastax.driver.core.DataType; @@ -17,8 +19,9 @@ public class AlterTableBuilderTest { String alteredName = "altered_column"; String droppedName = "dropped"; - String cql = alterTable().name(name).add(addedName, addedType).alter(alteredName, alteredType).drop(droppedName) - .toCql(); - System.out.println(cql); + AlterTableSpecification alter = alterTable().name(name).add(addedName, addedType).alter(alteredName, alteredType) + .drop(droppedName); + AlterTableCqlGenerator generator = new AlterTableCqlGenerator(alter); + System.out.println(generator.toCql()); } } diff --git a/src/test/java/org/springframework/cassandra/cql/builder/CreateTableBuilderTest.java b/src/test/java/org/springframework/cassandra/cql/builder/CreateTableBuilderTest.java index 7596d0a49..29ddf89b0 100644 --- a/src/test/java/org/springframework/cassandra/cql/builder/CreateTableBuilderTest.java +++ b/src/test/java/org/springframework/cassandra/cql/builder/CreateTableBuilderTest.java @@ -1,17 +1,18 @@ package org.springframework.cassandra.cql.builder; import static junit.framework.Assert.assertEquals; -import static org.springframework.cassandra.core.cql.builder.CqlBuilder.createTable; -import static org.springframework.cassandra.core.cql.builder.MapBuilder.map; -import static org.springframework.cassandra.core.cql.builder.TableOption.BLOOM_FILTER_FP_CHANCE; -import static org.springframework.cassandra.core.cql.builder.TableOption.CACHING; -import static org.springframework.cassandra.core.cql.builder.TableOption.COMMENT; -import static org.springframework.cassandra.core.cql.builder.TableOption.COMPACTION; -import static org.springframework.cassandra.core.cql.builder.TableOption.CompactionOption.TOMBSTONE_THRESHOLD; +import static org.springframework.cassandra.core.keyspace.CqlBuilder.createTable; +import static org.springframework.cassandra.core.keyspace.MapBuilder.map; +import static org.springframework.cassandra.core.keyspace.TableOption.BLOOM_FILTER_FP_CHANCE; +import static org.springframework.cassandra.core.keyspace.TableOption.CACHING; +import static org.springframework.cassandra.core.keyspace.TableOption.COMMENT; +import static org.springframework.cassandra.core.keyspace.TableOption.COMPACTION; +import static org.springframework.cassandra.core.keyspace.TableOption.CompactionOption.TOMBSTONE_THRESHOLD; import org.junit.Test; -import org.springframework.cassandra.core.cql.builder.CreateTableBuilder; -import org.springframework.cassandra.core.cql.builder.TableOption.CachingOption; +import org.springframework.cassandra.core.cql.builder.CreateTableCqlGenerator; +import org.springframework.cassandra.core.keyspace.CreateTableSpecification; +import org.springframework.cassandra.core.keyspace.TableOption.CachingOption; import com.datastax.driver.core.DataType; @@ -32,12 +33,13 @@ public class CreateTableBuilderTest { Object bloom = "0.00075"; Object caching = CachingOption.KEYS_ONLY; - CreateTableBuilder builder = createTable().ifNotExists().name(name).partitionKeyColumn(partKey0, type0) + CreateTableSpecification create = createTable().ifNotExists().name(name).partitionKeyColumn(partKey0, type0) .partitionKeyColumn(partition1, type0).primaryKeyColumn(primary0, type0).column(column1, type1) .column(column2, type2).with(COMMENT, comment).with(BLOOM_FILTER_FP_CHANCE, bloom) .with(COMPACTION, map().entry(TOMBSTONE_THRESHOLD, "0.15")).with(CACHING, caching); - String cql = builder.toCql(); + CreateTableCqlGenerator generator = new CreateTableCqlGenerator(create); + String cql = generator.toCql(); assertEquals( "CREATE TABLE IF NOT EXISTS \"my\"\"table\" (partitionKey0 text, partitionKey1 text, primary0 text, column1 text, column2 bigint, PRIMARY KEY ((partitionKey0, partitionKey1), primary0) WITH CLUSTERING ORDER BY (primary0 ASC) AND comment = 'this is a comment' AND bloom_filter_fp_chance = 0.00075 AND compaction = { 'tombstone_threshold' : 0.15 } AND caching = keys_only;", cql); diff --git a/src/test/java/org/springframework/cassandra/cql/builder/DropTableBuilderTest.java b/src/test/java/org/springframework/cassandra/cql/builder/DropTableBuilderTest.java index 276cf9abf..97719ec9d 100644 --- a/src/test/java/org/springframework/cassandra/cql/builder/DropTableBuilderTest.java +++ b/src/test/java/org/springframework/cassandra/cql/builder/DropTableBuilderTest.java @@ -1,15 +1,18 @@ package org.springframework.cassandra.cql.builder; -import static org.springframework.cassandra.core.cql.builder.CqlBuilder.dropTable; +import static org.springframework.cassandra.core.keyspace.CqlBuilder.dropTable; import org.junit.Test; +import org.springframework.cassandra.core.cql.builder.DropTableCqlGenerator; +import org.springframework.cassandra.core.keyspace.DropTableSpecification; public class DropTableBuilderTest { @Test public void testDropTableBuilder() throws Exception { - String cql = dropTable().name("mytable").ifExists().toCql(); + DropTableSpecification drop = dropTable().name("mytable").ifExists(); - System.out.println(cql); + DropTableCqlGenerator generator = new DropTableCqlGenerator(drop); + System.out.println(generator.toCql()); } } diff --git a/src/test/java/org/springframework/cassandra/cql/builder/OptionTest.java b/src/test/java/org/springframework/cassandra/cql/builder/OptionTest.java index 2f4baed50..dbc652c6e 100644 --- a/src/test/java/org/springframework/cassandra/cql/builder/OptionTest.java +++ b/src/test/java/org/springframework/cassandra/cql/builder/OptionTest.java @@ -7,8 +7,8 @@ import static junit.framework.Assert.assertTrue; import java.lang.annotation.RetentionPolicy; import org.junit.Test; -import org.springframework.cassandra.core.cql.builder.DefaultOption; -import org.springframework.cassandra.core.cql.builder.Option; +import org.springframework.cassandra.core.keyspace.DefaultOption; +import org.springframework.cassandra.core.keyspace.Option; public class OptionTest {