Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Should return true for system namespace in namespaceExists() #2026

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,10 @@ public Set<String> getNamespaceTableNames(String namespace) throws ExecutionExce

@Override
public boolean namespaceExists(String namespace) throws ExecutionException {
if (systemNamespace.equals(namespace)) {
return true;
}

try {
KeyspaceMetadata keyspace =
clusterManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,10 @@ private ThroughputProperties calculateThroughput(Map<String, String> options) {

@Override
public boolean namespaceExists(String namespace) throws ExecutionException {
if (metadataDatabase.equals(namespace)) {
return true;
}

return databaseExists(namespace);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1132,6 +1132,11 @@ public Set<String> getNamespaceTableNames(String nonPrefixedNamespace) throws Ex

@Override
public boolean namespaceExists(String nonPrefixedNamespace) throws ExecutionException {
Namespace namespace = Namespace.of(namespacePrefix, nonPrefixedNamespace);
if (metadataNamespace.equals(namespace.prefixed())) {
return true;
}

try {
boolean namespaceExists = false;
String lastEvaluatedTableName = null;
Expand All @@ -1141,7 +1146,6 @@ public boolean namespaceExists(String nonPrefixedNamespace) throws ExecutionExce
ListTablesResponse listTablesResponse = client.listTables(listTablesRequest);
lastEvaluatedTableName = listTablesResponse.lastEvaluatedTableName();
List<String> tableNames = listTablesResponse.tableNames();
Namespace namespace = Namespace.of(namespacePrefix, nonPrefixedNamespace);
for (String tableName : tableNames) {
if (tableName.startsWith(namespace.prefixed() + ".")) {
namespaceExists = true;
Expand Down
95 changes: 53 additions & 42 deletions core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java
Original file line number Diff line number Diff line change
Expand Up @@ -390,44 +390,45 @@ public TableMetadata getTableMetadata(String namespace, String table) throws Exe
TableMetadata.Builder builder = TableMetadata.newBuilder();
boolean tableExists = false;

if (!namespaceExists(metadataSchema)) {
return null;
}

try (Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(getSelectColumnsStatement())) {
preparedStatement.setString(1, getFullTableName(namespace, table));

try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
tableExists = true;

String columnName = resultSet.getString(METADATA_COL_COLUMN_NAME);
DataType dataType = DataType.valueOf(resultSet.getString(METADATA_COL_DATA_TYPE));
builder.addColumn(columnName, dataType);

boolean indexed = resultSet.getBoolean(METADATA_COL_INDEXED);
if (indexed) {
builder.addSecondaryIndex(columnName);
}

String keyType = resultSet.getString(METADATA_COL_KEY_TYPE);
if (keyType == null) {
continue;
}
try (Connection connection = dataSource.getConnection()) {
if (!namespaceExistsInternal(connection, metadataSchema)) {
return null;
}

switch (KeyType.valueOf(keyType)) {
case PARTITION:
builder.addPartitionKey(columnName);
break;
case CLUSTERING:
Scan.Ordering.Order clusteringOrder =
Scan.Ordering.Order.valueOf(resultSet.getString(METADATA_COL_CLUSTERING_ORDER));
builder.addClusteringKey(columnName, clusteringOrder);
break;
default:
throw new AssertionError("Invalid key type: " + keyType);
try (PreparedStatement preparedStatement =
connection.prepareStatement(getSelectColumnsStatement())) {
preparedStatement.setString(1, getFullTableName(namespace, table));

try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
tableExists = true;

String columnName = resultSet.getString(METADATA_COL_COLUMN_NAME);
DataType dataType = DataType.valueOf(resultSet.getString(METADATA_COL_DATA_TYPE));
builder.addColumn(columnName, dataType);

boolean indexed = resultSet.getBoolean(METADATA_COL_INDEXED);
if (indexed) {
builder.addSecondaryIndex(columnName);
}

String keyType = resultSet.getString(METADATA_COL_KEY_TYPE);
if (keyType == null) {
continue;
}

switch (KeyType.valueOf(keyType)) {
case PARTITION:
builder.addPartitionKey(columnName);
break;
case CLUSTERING:
Scan.Ordering.Order clusteringOrder =
Scan.Ordering.Order.valueOf(resultSet.getString(METADATA_COL_CLUSTERING_ORDER));
builder.addClusteringKey(columnName, clusteringOrder);
break;
default:
throw new AssertionError("Invalid key type: " + keyType);
}
}
}
}
Expand Down Expand Up @@ -560,14 +561,24 @@ public Set<String> getNamespaceTableNames(String namespace) throws ExecutionExce

@Override
public boolean namespaceExists(String namespace) throws ExecutionException {
if (metadataSchema.equals(namespace)) {
return true;
}

try (Connection connection = dataSource.getConnection()) {
return namespaceExistsInternal(connection, namespace);
} catch (SQLException e) {
throw new ExecutionException("Checking if the namespace exists failed", e);
}
}

private boolean namespaceExistsInternal(Connection connection, String namespace)
throws SQLException {
String namespaceExistsStatement = rdbEngine.namespaceExistsStatement();
try (Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(namespaceExistsStatement)) {
try (PreparedStatement preparedStatement =
connection.prepareStatement(namespaceExistsStatement)) {
preparedStatement.setString(1, rdbEngine.namespaceExistsPlaceholder(namespace));
return preparedStatement.executeQuery().next();
} catch (SQLException e) {
throw new ExecutionException("Checking if the namespace exists failed", e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,15 @@ public void namespaceExists_WithExistingNamespace_ShouldReturnTrue() throws Exec
verify(metadata).getKeyspace(namespace);
}

@Test
public void namespaceExists_WithSystemNamespace_ShouldReturnTrue() throws ExecutionException {
// Arrange

// Act Assert
assertThat(cassandraAdmin.namespaceExists(DatabaseConfig.DEFAULT_SYSTEM_NAMESPACE_NAME))
.isTrue();
}

@Test
public void createIndex_ShouldExecuteProperCql() throws ExecutionException {
// Arrange
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -913,4 +913,26 @@ public void getNamespaceNames_WithoutExistingTables_ShouldReturnMetadataDatabase
verify(tableMetadataContainer).read();
assertThat(actual).containsOnly(metadataDatabaseName);
}

@Test
public void namespaceExists_WithExistingNamespace_ShouldReturnTrue() throws ExecutionException {
// Arrange
String namespace = "ns";
CosmosDatabase database = mock(CosmosDatabase.class);
when(client.getDatabase(namespace)).thenReturn(database);

// Act
boolean actual = admin.namespaceExists(namespace);

// Assert
assertThat(actual).isTrue();
}

@Test
public void namespaceExists_WithMetadataDatabase_ShouldReturnTrue() throws ExecutionException {
// Arrange

// Act Assert
assertThat(admin.namespaceExists(metadataDatabaseName)).isTrue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,18 @@ public void namespaceExists_ShouldPerformExactMatch() throws ExecutionException
assertThat(admin.namespaceExists(NAMESPACE.substring(0, NAMESPACE.length() - 1))).isFalse();
}

@Test
public void namespaceExists_WithMetadataNamespace_ShouldReturnTrue() throws ExecutionException {
// Arrange

// Act Assert
assertThat(
admin.namespaceExists(
getTableMetadataNamespaceConfig()
.orElse(DatabaseConfig.DEFAULT_SYSTEM_NAMESPACE_NAME)))
.isTrue();
}

@Test
public void createTable_WhenMetadataTableNotExist_ShouldCreateTableAndMetadataTable()
throws ExecutionException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1359,6 +1359,25 @@ private void namespaceExists_forXWithExistingNamespace_ShouldReturnTrue(
verify(selectStatement).setString(1, namespace + namespacePlaceholderSuffix);
}

@Test
public void namespaceExists_WithMetadataSchema_ShouldReturnTrue() throws ExecutionException {
// Arrange
JdbcAdmin adminForMySql = createJdbcAdminFor(RdbEngine.MYSQL);
JdbcAdmin adminForPostgresql = createJdbcAdminFor(RdbEngine.POSTGRESQL);
JdbcAdmin adminForOracle = createJdbcAdminFor(RdbEngine.ORACLE);
JdbcAdmin adminForSqlServer = createJdbcAdminFor(RdbEngine.SQL_SERVER);
JdbcAdmin adminForSqlite = createJdbcAdminFor(RdbEngine.SQLITE);
JdbcAdmin adminForYugabyte = createJdbcAdminFor(RdbEngine.YUGABYTE);

// Act Assert
assertThat(adminForMySql.namespaceExists(tableMetadataSchemaName)).isTrue();
assertThat(adminForPostgresql.namespaceExists(tableMetadataSchemaName)).isTrue();
assertThat(adminForOracle.namespaceExists(tableMetadataSchemaName)).isTrue();
assertThat(adminForSqlServer.namespaceExists(tableMetadataSchemaName)).isTrue();
assertThat(adminForSqlite.namespaceExists(tableMetadataSchemaName)).isTrue();
assertThat(adminForYugabyte.namespaceExists(tableMetadataSchemaName)).isTrue();
}

@Test
public void createIndex_ForColumnTypeWithoutRequiredAlterationForMysql_ShouldCreateIndexProperly()
throws Exception {
Expand Down
Loading