Skip to content

Commit 5ef1a03

Browse files
committed
Fix to handle rename indexed column with Cassandra
1 parent 448b3d4 commit 5ef1a03

File tree

6 files changed

+164
-9
lines changed

6 files changed

+164
-9
lines changed

core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminCaseSensitivityIntegrationTest.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.scalar.db.storage.cassandra;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
35
import com.scalar.db.api.DistributedStorageAdminCaseSensitivityIntegrationTestBase;
6+
import com.scalar.db.api.TableMetadata;
7+
import com.scalar.db.exception.storage.ExecutionException;
8+
import com.scalar.db.io.DataType;
49
import com.scalar.db.util.AdminTestUtils;
510
import java.util.Collections;
611
import java.util.Map;
@@ -34,6 +39,39 @@ protected boolean isTimestampTypeSupported() {
3439
public void renameColumn_ShouldRenameColumnCorrectly() {}
3540

3641
@Override
37-
@Disabled("Renaming non-primary key columns is not supported in Cassandra")
38-
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly() {}
42+
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly()
43+
throws ExecutionException {
44+
try {
45+
// Arrange
46+
Map<String, String> options = getCreationOptions();
47+
TableMetadata currentTableMetadata =
48+
TableMetadata.newBuilder()
49+
.addColumn(getColumnName1(), DataType.INT)
50+
.addColumn(getColumnName2(), DataType.INT)
51+
.addColumn(getColumnName3(), DataType.TEXT)
52+
.addPartitionKey(getColumnName1())
53+
.addSecondaryIndex(getColumnName1())
54+
.build();
55+
admin.createTable(getNamespace1(), getTable4(), currentTableMetadata, options);
56+
57+
// Act
58+
admin.renameColumn(getNamespace1(), getTable4(), getColumnName1(), getColumnName4());
59+
60+
// Assert
61+
TableMetadata expectedTableMetadata =
62+
TableMetadata.newBuilder()
63+
.addColumn(getColumnName4(), DataType.INT)
64+
.addColumn(getColumnName2(), DataType.INT)
65+
.addColumn(getColumnName3(), DataType.TEXT)
66+
.addPartitionKey(getColumnName4())
67+
.addSecondaryIndex(getColumnName4())
68+
.build();
69+
assertThat(admin.getTableMetadata(getNamespace1(), getTable4()))
70+
.isEqualTo(expectedTableMetadata);
71+
assertThat(admin.indexExists(getNamespace1(), getTable4(), getColumnName1())).isFalse();
72+
assertThat(admin.indexExists(getNamespace1(), getTable4(), getColumnName4())).isTrue();
73+
} finally {
74+
admin.dropTable(getNamespace1(), getTable4(), true);
75+
}
76+
}
3977
}

core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminIntegrationTest.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.scalar.db.storage.cassandra;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
35
import com.scalar.db.api.DistributedStorageAdminIntegrationTestBase;
6+
import com.scalar.db.api.TableMetadata;
7+
import com.scalar.db.exception.storage.ExecutionException;
8+
import com.scalar.db.io.DataType;
49
import com.scalar.db.util.AdminTestUtils;
510
import java.util.Collections;
611
import java.util.Map;
@@ -33,6 +38,39 @@ protected boolean isTimestampTypeSupported() {
3338
public void renameColumn_ShouldRenameColumnCorrectly() {}
3439

3540
@Override
36-
@Disabled("Renaming non-primary key columns is not supported in Cassandra")
37-
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly() {}
41+
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly()
42+
throws ExecutionException {
43+
try {
44+
// Arrange
45+
Map<String, String> options = getCreationOptions();
46+
TableMetadata currentTableMetadata =
47+
TableMetadata.newBuilder()
48+
.addColumn(getColumnName1(), DataType.INT)
49+
.addColumn(getColumnName2(), DataType.INT)
50+
.addColumn(getColumnName3(), DataType.TEXT)
51+
.addPartitionKey(getColumnName1())
52+
.addSecondaryIndex(getColumnName1())
53+
.build();
54+
admin.createTable(getNamespace1(), getTable4(), currentTableMetadata, options);
55+
56+
// Act
57+
admin.renameColumn(getNamespace1(), getTable4(), getColumnName1(), getColumnName4());
58+
59+
// Assert
60+
TableMetadata expectedTableMetadata =
61+
TableMetadata.newBuilder()
62+
.addColumn(getColumnName4(), DataType.INT)
63+
.addColumn(getColumnName2(), DataType.INT)
64+
.addColumn(getColumnName3(), DataType.TEXT)
65+
.addPartitionKey(getColumnName4())
66+
.addSecondaryIndex(getColumnName4())
67+
.build();
68+
assertThat(admin.getTableMetadata(getNamespace1(), getTable4()))
69+
.isEqualTo(expectedTableMetadata);
70+
assertThat(admin.indexExists(getNamespace1(), getTable4(), getColumnName1())).isFalse();
71+
assertThat(admin.indexExists(getNamespace1(), getTable4(), getColumnName4())).isTrue();
72+
} finally {
73+
admin.dropTable(getNamespace1(), getTable4(), true);
74+
}
75+
}
3876
}

core/src/integration-test/java/com/scalar/db/storage/cassandra/ConsensusCommitAdminIntegrationTestWithCassandra.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package com.scalar.db.storage.cassandra;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.scalar.db.api.TableMetadata;
6+
import com.scalar.db.exception.storage.ExecutionException;
7+
import com.scalar.db.io.DataType;
38
import com.scalar.db.transaction.consensuscommit.ConsensusCommitAdminIntegrationTestBase;
49
import com.scalar.db.util.AdminTestUtils;
510
import java.util.Collections;
@@ -34,6 +39,38 @@ protected boolean isTimestampTypeSupported() {
3439
public void renameColumn_ShouldRenameColumnCorrectly() {}
3540

3641
@Override
37-
@Disabled("Renaming non-primary key columns is not supported in Cassandra")
38-
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly() {}
42+
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly()
43+
throws ExecutionException {
44+
try {
45+
// Arrange
46+
Map<String, String> options = getCreationOptions();
47+
TableMetadata currentTableMetadata =
48+
TableMetadata.newBuilder()
49+
.addColumn("c1", DataType.INT)
50+
.addColumn("c2", DataType.INT)
51+
.addColumn("c3", DataType.TEXT)
52+
.addPartitionKey("c1")
53+
.addSecondaryIndex("c1")
54+
.build();
55+
admin.createTable(namespace1, TABLE4, currentTableMetadata, options);
56+
57+
// Act
58+
admin.renameColumn(namespace1, TABLE4, "c1", "c4");
59+
60+
// Assert
61+
TableMetadata expectedTableMetadata =
62+
TableMetadata.newBuilder()
63+
.addColumn("c4", DataType.INT)
64+
.addColumn("c2", DataType.INT)
65+
.addColumn("c3", DataType.TEXT)
66+
.addPartitionKey("c4")
67+
.addSecondaryIndex("c4")
68+
.build();
69+
assertThat(admin.getTableMetadata(namespace1, TABLE4)).isEqualTo(expectedTableMetadata);
70+
assertThat(admin.indexExists(namespace1, TABLE4, "c1")).isFalse();
71+
assertThat(admin.indexExists(namespace1, TABLE4, "c4")).isTrue();
72+
} finally {
73+
admin.dropTable(namespace1, TABLE4, true);
74+
}
75+
}
3976
}

core/src/integration-test/java/com/scalar/db/storage/cassandra/SingleCrudOperationTransactionAdminIntegrationTestWithCassandra.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package com.scalar.db.storage.cassandra;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.scalar.db.api.TableMetadata;
6+
import com.scalar.db.exception.storage.ExecutionException;
7+
import com.scalar.db.io.DataType;
38
import com.scalar.db.transaction.singlecrudoperation.SingleCrudOperationTransactionAdminIntegrationTestBase;
49
import java.util.Collections;
510
import java.util.Map;
@@ -29,6 +34,38 @@ protected boolean isTimestampTypeSupported() {
2934
public void renameColumn_ShouldRenameColumnCorrectly() {}
3035

3136
@Override
32-
@Disabled("Renaming non-primary key columns is not supported in Cassandra")
33-
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly() {}
37+
public void renameColumn_ForIndexKeyColumn_ShouldRenameColumnAndIndexCorrectly()
38+
throws ExecutionException {
39+
try {
40+
// Arrange
41+
Map<String, String> options = getCreationOptions();
42+
TableMetadata currentTableMetadata =
43+
TableMetadata.newBuilder()
44+
.addColumn("c1", DataType.INT)
45+
.addColumn("c2", DataType.INT)
46+
.addColumn("c3", DataType.TEXT)
47+
.addPartitionKey("c1")
48+
.addSecondaryIndex("c1")
49+
.build();
50+
admin.createTable(namespace1, TABLE4, currentTableMetadata, options);
51+
52+
// Act
53+
admin.renameColumn(namespace1, TABLE4, "c1", "c4");
54+
55+
// Assert
56+
TableMetadata expectedTableMetadata =
57+
TableMetadata.newBuilder()
58+
.addColumn("c4", DataType.INT)
59+
.addColumn("c2", DataType.INT)
60+
.addColumn("c3", DataType.TEXT)
61+
.addPartitionKey("c4")
62+
.addSecondaryIndex("c4")
63+
.build();
64+
assertThat(admin.getTableMetadata(namespace1, TABLE4)).isEqualTo(expectedTableMetadata);
65+
assertThat(admin.indexExists(namespace1, TABLE4, "c1")).isFalse();
66+
assertThat(admin.indexExists(namespace1, TABLE4, "c4")).isTrue();
67+
} finally {
68+
admin.dropTable(namespace1, TABLE4, true);
69+
}
70+
}
3471
}

core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,11 @@ public void renameColumn(
455455
.getQueryString();
456456

457457
clusterManager.getSession().execute(alterTableQuery);
458+
if (tableMetadata.getSecondaryIndexNames().contains(oldColumnName)) {
459+
// Cassandra does not support renaming indexes
460+
dropIndex(namespace, table, oldColumnName);
461+
createIndex(namespace, table, newColumnName, Collections.emptyMap());
462+
}
458463
} catch (IllegalArgumentException e) {
459464
throw e;
460465
} catch (RuntimeException e) {

integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public abstract class DistributedStorageAdminIntegrationTestBase {
5959
private static final String COL_NAME14 = "c14";
6060
private static final String COL_NAME15 = "c15";
6161
private StorageFactory storageFactory;
62-
private DistributedStorageAdmin admin;
62+
protected DistributedStorageAdmin admin;
6363
private String namespace1;
6464
private String namespace2;
6565
private String namespace3;

0 commit comments

Comments
 (0)