/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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 com.datastax.driver.core.schemabuilder;
import com.datastax.driver.core.DataType;
import org.testng.annotations.Test;
import static com.datastax.driver.core.schemabuilder.SchemaBuilder.*;
import static org.assertj.core.api.Assertions.assertThat;
public class AlterTest {
@Test(groups = "unit")
public void should_alter_column_type() throws Exception {
//When
SchemaStatement statement = alterTable("test").alterColumn("name").type(DataType.ascii());
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test ALTER name TYPE ascii");
}
@Test(groups = "unit")
public void should_alter_column_type_with_keyspace() throws Exception {
//When
SchemaStatement statement = alterTable("ks", "test").alterColumn("name").type(DataType.ascii());
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE ks.test ALTER name TYPE ascii");
}
@Test(groups = "unit")
public void should_alter_column_type_to_UDT() throws Exception {
//When
SchemaStatement statement = alterTable("ks", "test").alterColumn("address").udtType(frozen("address"));
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE ks.test ALTER address TYPE frozen<address>");
}
@Test(groups = "unit")
public void should_add_column() throws Exception {
//When
SchemaStatement statement = alterTable("test").addColumn("location").type(DataType.ascii());
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test ADD location ascii");
}
@Test(groups = "unit")
public void should_add_column_with_UDT_type() throws Exception {
//When
SchemaStatement statement = alterTable("test").addColumn("location").udtType(frozen("address"));
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test ADD location frozen<address>");
}
@Test(groups = "unit")
public void should_rename_column() throws Exception {
//When
SchemaStatement statement = alterTable("test").renameColumn("name").to("description");
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test RENAME name TO description");
}
@Test(groups = "unit")
public void should_drop_column() throws Exception {
//When
SchemaStatement statement = alterTable("test").dropColumn("name");
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test DROP name");
}
@Test(groups = "unit")
public void should_alter_table_options() throws Exception {
//When
// Note that this does not necessarily represent a valid configuration, the goal is just to test all options
// (some of which might be specific to C* 2.0 or 2.1)
SchemaStatement statement = alterTable("test").withOptions()
.bloomFilterFPChance(0.01)
.caching(Caching.ROWS_ONLY)
.comment("This is a comment")
.compactionOptions(leveledStrategy().ssTableSizeInMB(160))
.compressionOptions(lz4())
.dcLocalReadRepairChance(0.21)
.defaultTimeToLive(100)
.gcGraceSeconds(9999)
.indexInterval(256)
.minIndexInterval(64)
.maxIndexInterval(512)
.memtableFlushPeriodInMillis(12)
.populateIOCacheOnFlush(true)
.replicateOnWrite(true)
.readRepairChance(0.42)
.speculativeRetry(always())
.cdc(true);
SchemaStatement statementWith21Caching = alterTable("test").withOptions()
.caching(KeyCaching.NONE, rows(100));
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test\n\t" +
"WITH caching = 'rows_only' " +
"AND bloom_filter_fp_chance = 0.01 " +
"AND comment = 'This is a comment' " +
"AND compression = {'sstable_compression' : 'LZ4Compressor'} " +
"AND compaction = {'class' : 'LeveledCompactionStrategy', 'sstable_size_in_mb' : 160} " +
"AND dclocal_read_repair_chance = 0.21 " +
"AND default_time_to_live = 100 " +
"AND gc_grace_seconds = 9999 " +
"AND index_interval = 256 " +
"AND min_index_interval = 64 " +
"AND max_index_interval = 512 " +
"AND memtable_flush_period_in_ms = 12 " +
"AND populate_io_cache_on_flush = true " +
"AND read_repair_chance = 0.42 " +
"AND replicate_on_write = true " +
"AND speculative_retry = 'ALWAYS' " +
"AND cdc = true");
assertThat(statementWith21Caching.getQueryString()).isEqualTo("\n\tALTER TABLE test\n\t" +
"WITH caching = {'keys' : 'none', 'rows_per_partition' : 100}");
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The keyspace name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_keyspace_name_is_a_reserved_keyword() throws Exception {
alterTable("add", "test")
.addColumn("test").type(DataType.ascii());
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The table name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_table_name_is_a_reserved_keyword() throws Exception {
alterTable("add")
.addColumn("test").type(DataType.ascii());
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The new column name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_added_column_is_a_reserved_keyword() throws Exception {
alterTable("test")
.addColumn("add").type(DataType.ascii()).getQueryString();
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The altered column name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_altered_column_is_a_reserved_keyword() throws Exception {
alterTable("test")
.alterColumn("add").type(DataType.ascii()).getQueryString();
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The renamed column name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_renamed_column_is_a_reserved_keyword() throws Exception {
alterTable("test")
.renameColumn("add");
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The new column name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_new_renamed_column_is_a_reserved_keyword() throws Exception {
alterTable("test")
.renameColumn("col").to("add");
}
@Test(groups = "unit", expectedExceptions = IllegalArgumentException.class,
expectedExceptionsMessageRegExp = "The dropped column name 'add' is not allowed because it is a reserved keyword")
public void should_fail_if_drop_column_is_a_reserved_keyword() throws Exception {
alterTable("test")
.dropColumn("add").getQueryString();
}
@Test(groups = "unit")
public void should_add_static_column() throws Exception {
//When
SchemaStatement statement = alterTable("test").addStaticColumn("stat").type(DataType.text());
//Then
assertThat(statement.getQueryString()).isEqualTo("\n\tALTER TABLE test ADD stat text static");
}
}