Skip to content

Commit a2f64c1

Browse files
committed
Fix based on review
1 parent c90108b commit a2f64c1

File tree

6 files changed

+103
-10
lines changed

6 files changed

+103
-10
lines changed

core/integration.sqlite3

-200 KB
Binary file not shown.

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminImportTableIntegrationTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,4 @@ public void alterColumnType_Oracle_WideningConversion_ForImportedTable_ShouldAlt
326326
}
327327
}
328328
}
329-
330-
@Test
331-
@Override
332-
@DisabledIf("isSqlite")
333-
public void dropNamespace_ShouldNotDropNonScalarDBTables() {}
334329
}

core/src/main/java/com/scalar/db/storage/cosmos/CosmosAdmin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ public class CosmosAdmin implements DistributedStorageAdmin {
5757

5858
public static final String TABLE_METADATA_CONTAINER = "metadata";
5959
public static final String NAMESPACES_CONTAINER = "namespaces";
60+
@VisibleForTesting public static final String STORED_PROCEDURE_FILE_NAME = "mutate.js";
6061
private static final String ID = "id";
6162
private static final String CONCATENATED_PARTITION_KEY = "concatenatedPartitionKey";
6263
private static final String PARTITION_KEY_PATH = "/" + CONCATENATED_PARTITION_KEY;
6364
private static final String CLUSTERING_KEY_PATH_PREFIX = "/clusteringKey/";
6465
private static final String SECONDARY_INDEX_KEY_PATH_PREFIX = "/values/";
6566
private static final String EXCLUDED_PATH = "/*";
66-
@VisibleForTesting public static final String STORED_PROCEDURE_FILE_NAME = "mutate.js";
6767
private static final String STORED_PROCEDURE_PATH =
6868
"cosmosdb_stored_procedure/" + STORED_PROCEDURE_FILE_NAME;
6969
private static final StorageInfo STORAGE_INFO =
@@ -344,7 +344,7 @@ private void deleteTableMetadata(String namespace, String table) throws Executio
344344
@Override
345345
public void dropNamespace(String namespace) throws ExecutionException {
346346
try {
347-
Set<String> remainingTables = getNamespaceTableNamesInternal(namespace);
347+
Set<String> remainingTables = getRawTableNames(namespace);
348348
if (!remainingTables.isEmpty()) {
349349
throw new IllegalArgumentException(
350350
CoreError.NAMESPACE_WITH_NON_SCALARDB_TABLES_CANNOT_BE_DROPPED.buildMessage(
@@ -794,7 +794,7 @@ public StorageInfo getStorageInfo(String namespace) {
794794
return STORAGE_INFO;
795795
}
796796

797-
private Set<String> getNamespaceTableNamesInternal(String namespace) {
797+
private Set<String> getRawTableNames(String namespace) {
798798
return client.getDatabase(namespace).readAllContainers().stream()
799799
.map(CosmosContainerProperties::getId)
800800
.collect(Collectors.toSet());

core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ private void deleteMetadataSchema(Connection connection) throws SQLException {
481481
@Override
482482
public void dropNamespace(String namespace) throws ExecutionException {
483483
try (Connection connection = dataSource.getConnection()) {
484-
Set<String> remainingTables = getNamespaceTableNamesInternal(connection, namespace);
484+
Set<String> remainingTables = getInternalTableNames(connection, namespace);
485485
if (!remainingTables.isEmpty()) {
486486
throw new IllegalArgumentException(
487487
CoreError.NAMESPACE_WITH_NON_SCALARDB_TABLES_CANNOT_BE_DROPPED.buildMessage(
@@ -709,7 +709,7 @@ public Set<String> getNamespaceTableNames(String namespace) throws ExecutionExce
709709
}
710710
}
711711

712-
private Set<String> getNamespaceTableNamesInternal(Connection connection, String namespace)
712+
private Set<String> getInternalTableNames(Connection connection, String namespace)
713713
throws SQLException {
714714
String sql = rdbEngine.getTableNamesInNamespaceSql();
715715
if (Strings.isNullOrEmpty(sql)) {

core/src/test/java/com/scalar/db/storage/cosmos/CosmosAdminTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.scalar.db.util.ScalarDbUtils.getFullTableName;
44
import static org.assertj.core.api.Assertions.assertThat;
5+
import static org.assertj.core.api.Assertions.assertThatCode;
56
import static org.assertj.core.api.Assertions.assertThatThrownBy;
67
import static org.assertj.core.api.Assertions.catchThrowable;
78
import static org.mockito.ArgumentMatchers.any;
@@ -665,6 +666,33 @@ public void dropNamespace_WithExistingDatabaseAndSomeNamespacesLeft_ShouldDropDa
665666
verify(metadataDatabase, never()).delete();
666667
}
667668

669+
@Test
670+
public void dropNamespace_WithNonScalarDBTableLeft_ShouldThrowIllegalArgumentException() {
671+
// Arrange
672+
String namespace = "ns";
673+
CosmosDatabase metadataDatabase = mock(CosmosDatabase.class);
674+
when(client.getDatabase(namespace)).thenReturn(database);
675+
when(client.getDatabase(METADATA_DATABASE)).thenReturn(metadataDatabase);
676+
CosmosContainer namespacesContainer = mock(CosmosContainer.class);
677+
when(metadataDatabase.getContainer(anyString())).thenReturn(namespacesContainer);
678+
679+
@SuppressWarnings("unchecked")
680+
CosmosPagedIterable<CosmosContainerProperties> containerPagedIterable =
681+
mock(CosmosPagedIterable.class);
682+
when(containerPagedIterable.stream())
683+
.thenReturn(Stream.of(mock(CosmosContainerProperties.class)));
684+
when(database.readAllContainers()).thenReturn(containerPagedIterable);
685+
686+
@SuppressWarnings("unchecked")
687+
CosmosPagedIterable<Object> pagedIterable = mock(CosmosPagedIterable.class);
688+
when(namespacesContainer.queryItems(anyString(), any(), any())).thenReturn(pagedIterable);
689+
when(pagedIterable.stream()).thenReturn(Stream.empty());
690+
691+
// Act Assert
692+
assertThatCode(() -> admin.dropNamespace(namespace))
693+
.isInstanceOf(IllegalArgumentException.class);
694+
}
695+
668696
@Test
669697
public void truncateTable_WithExistingRecords_ShouldDeleteAllRecords() throws ExecutionException {
670698
// Arrange

core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static com.scalar.db.storage.jdbc.JdbcAdmin.hasDifferentClusteringOrders;
99
import static com.scalar.db.util.ScalarDbUtils.getFullTableName;
1010
import static org.assertj.core.api.Assertions.assertThat;
11+
import static org.assertj.core.api.Assertions.assertThatCode;
1112
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1213
import static org.assertj.core.api.Assertions.catchThrowable;
1314
import static org.mockito.ArgumentMatchers.any;
@@ -2157,6 +2158,75 @@ private void dropNamespace_WithOtherNamespaceLeftForX_shouldOnlyDropNamespace(
21572158
verify(selectNamespaceStatementMock).executeQuery(selectNamespaceStatement);
21582159
}
21592160

2161+
@Test
2162+
public void dropNamespace_WithNonScalarDBTableLeftForMysql_ShouldThrowIllegalArgumentException()
2163+
throws Exception {
2164+
dropNamespace_WithNonScalarDBTableLeftForX_ShouldThrowIllegalArgumentException(RdbEngine.MYSQL);
2165+
}
2166+
2167+
@Test
2168+
public void
2169+
dropNamespace_WithNonScalarDBTableLeftForPostgresql_ShouldThrowIllegalArgumentException()
2170+
throws Exception {
2171+
dropNamespace_WithNonScalarDBTableLeftForX_ShouldThrowIllegalArgumentException(
2172+
RdbEngine.POSTGRESQL);
2173+
}
2174+
2175+
@Test
2176+
public void
2177+
dropNamespace_WithNonScalarDBTableLeftForSqlServer_ShouldThrowIllegalArgumentException()
2178+
throws Exception {
2179+
dropNamespace_WithNonScalarDBTableLeftForX_ShouldThrowIllegalArgumentException(
2180+
RdbEngine.SQL_SERVER);
2181+
}
2182+
2183+
@Test
2184+
public void dropNamespace_WithNonScalarDBTableLeftForOracle_ShouldThrowIllegalArgumentException()
2185+
throws Exception {
2186+
dropNamespace_WithNonScalarDBTableLeftForX_ShouldThrowIllegalArgumentException(
2187+
RdbEngine.ORACLE);
2188+
}
2189+
2190+
@Test
2191+
public void dropNamespace_WithNonScalarDBTableLeftForDb2_ShouldThrowIllegalArgumentException()
2192+
throws Exception {
2193+
dropNamespace_WithNonScalarDBTableLeftForX_ShouldThrowIllegalArgumentException(RdbEngine.DB2);
2194+
}
2195+
2196+
private void dropNamespace_WithNonScalarDBTableLeftForX_ShouldThrowIllegalArgumentException(
2197+
RdbEngine rdbEngine) throws Exception {
2198+
// Arrange
2199+
String namespace = "my_ns";
2200+
JdbcAdmin admin = createJdbcAdminFor(rdbEngine);
2201+
2202+
Connection connection = mock(Connection.class);
2203+
Statement dropNamespaceStatementMock = mock(Statement.class);
2204+
PreparedStatement deleteFromNamespaceTableMock = mock(PreparedStatement.class);
2205+
Statement selectNamespaceStatementMock = mock(Statement.class);
2206+
if (rdbEngine != RdbEngine.SQLITE) {
2207+
PreparedStatement getTableNamesPrepStmt = mock(PreparedStatement.class);
2208+
when(connection.createStatement())
2209+
.thenReturn(dropNamespaceStatementMock, selectNamespaceStatementMock);
2210+
ResultSet emptyResultSet = mock(ResultSet.class);
2211+
when(emptyResultSet.next()).thenReturn(true).thenReturn(false);
2212+
when(getTableNamesPrepStmt.executeQuery()).thenReturn(emptyResultSet);
2213+
when(connection.prepareStatement(anyString()))
2214+
.thenReturn(getTableNamesPrepStmt, deleteFromNamespaceTableMock);
2215+
} else {
2216+
when(connection.createStatement()).thenReturn(selectNamespaceStatementMock);
2217+
when(connection.prepareStatement(anyString())).thenReturn(deleteFromNamespaceTableMock);
2218+
}
2219+
when(dataSource.getConnection()).thenReturn(connection);
2220+
// Namespaces table does not contain other namespaces
2221+
ResultSet resultSet = mock(ResultSet.class);
2222+
when(resultSet.next()).thenReturn(false);
2223+
when(selectNamespaceStatementMock.executeQuery(anyString())).thenReturn(resultSet);
2224+
2225+
// Act Assert
2226+
assertThatCode(() -> admin.dropNamespace(namespace))
2227+
.isInstanceOf(IllegalArgumentException.class);
2228+
}
2229+
21602230
@Test
21612231
public void getNamespaceTables_forMysql_ShouldReturnTableNames() throws Exception {
21622232
getNamespaceTables_forX_ShouldReturnTableNames(

0 commit comments

Comments
 (0)