You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/06/30 09:48:45 UTC
[shardingsphere] branch master updated: Add ShardingSphereMetaData.dropDatabase (#18735)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 980226a6071 Add ShardingSphereMetaData.dropDatabase (#18735)
980226a6071 is described below
commit 980226a6071ff2b6cfb3aafff99d74594d539aca
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 30 17:48:33 2022 +0800
Add ShardingSphereMetaData.dropDatabase (#18735)
---
.../statement/impl/SelectStatementContextTest.java | 16 ++++++++--------
.../infra/metadata/ShardingSphereMetaData.java | 18 ++++++++++++++++++
.../shardingsphere/mode/manager/ContextManager.java | 4 +---
.../mode/manager/ContextManagerTest.java | 12 +++++++++---
4 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java
index 609dd315ed4..8adea321a76 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java
@@ -488,7 +488,7 @@ public final class SelectStatementContextTest {
assertTrue(new SelectStatementContext(
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME).isContainsSubquery());
}
-
+
@Test
public void assertContainsDollarParameterMarkerForMySQL() {
assertContainsDollarParameterMarker(new MySQLSelectStatement());
@@ -529,32 +529,32 @@ public final class SelectStatementContextTest {
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertTrue(selectStatementContext.isContainsDollarParameterMarker());
}
-
+
@Test
public void assertContainsPartialDistinctAggregationForMySQL() {
assertContainsPartialDistinctAggregation(new MySQLSelectStatement());
}
-
+
@Test
public void assertContainsPartialDistinctAggregationForOracle() {
assertContainsPartialDistinctAggregation(new OracleSelectStatement());
}
-
+
@Test
public void assertContainsPartialDistinctAggregationForPostgreSQL() {
assertContainsPartialDistinctAggregation(new PostgreSQLSelectStatement());
}
-
+
@Test
public void assertContainsPartialDistinctAggregationForSQL92() {
assertContainsPartialDistinctAggregation(new SQL92SelectStatement());
}
-
+
@Test
public void assertContainsPartialDistinctAggregationForSQLServer() {
assertContainsPartialDistinctAggregation(new SQLServerSelectStatement());
}
-
+
private void assertContainsPartialDistinctAggregation(final SelectStatement selectStatement) {
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
projectionsSegment.getProjections().add(new AggregationProjectionSegment(0, 0, AggregationType.COUNT, "(*)"));
@@ -564,7 +564,7 @@ public final class SelectStatementContextTest {
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertTrue(selectStatementContext.isContainsPartialDistinctAggregation());
}
-
+
private OrderByItemSegment createOrderByItemSegment(final String type) {
switch (type) {
case INDEX_ORDER_BY:
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index 3f177ea684e..8b746e6b8c3 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -61,4 +61,22 @@ public final class ShardingSphereMetaData {
databases.put(databaseName, database);
globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each -> each.addResource(database));
}
+
+ /**
+ * Drop database.
+ *
+ * @param databaseName database name
+ */
+ public void dropDatabase(final String databaseName) {
+ closeResources(databases.remove(databaseName));
+ }
+
+ private void closeResources(final ShardingSphereDatabase database) {
+ if (null != database.getResource()) {
+ database.getResource().getDataSources().values().forEach(each -> database.getResource().close(each));
+ }
+ String databaseName = database.getName();
+ globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each -> each.closeStaleResource(databaseName));
+ database.getRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.closeStaleResource(databaseName));
+ }
}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 45c08f5bbf4..4def6fb484b 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -135,9 +135,7 @@ public final class ContextManager implements AutoCloseable {
if (!metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
return;
}
- ShardingSphereDatabase tobeRemovedDatabase = metaDataContexts.getMetaData().getDatabases().remove(databaseName);
- closeDataSources(tobeRemovedDatabase);
- removeAndCloseResource(databaseName, tobeRemovedDatabase);
+ metaDataContexts.getMetaData().dropDatabase(databaseName);
metaDataContexts.getOptimizerContext().dropDatabase(databaseName);
metaDataContexts.getPersistService().ifPresent(optional -> optional.getSchemaMetaDataService().deleteDatabase(databaseName));
}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index a85d0306278..48f5cdfa625 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -48,7 +48,6 @@ import java.util.Optional;
import java.util.Properties;
import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -115,12 +114,19 @@ public final class ContextManagerTest {
@Test
public void assertDropDatabase() {
- when(metaDataContexts.getMetaData().getDatabases()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS))));
+ when(metaDataContexts.getMetaData().getDatabases().containsKey("foo_db")).thenReturn(true);
contextManager.dropDatabase("foo_db");
- assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabases().containsKey("foo_db"));
+ verify(metaDataContexts.getMetaData()).dropDatabase("foo_db");
verify(metaDataContexts.getOptimizerContext()).dropDatabase("foo_db");
}
+ @Test
+ public void assertDropNotExistedDatabase() {
+ contextManager.dropDatabase("foo_db");
+ verify(metaDataContexts.getMetaData(), times(0)).dropDatabase("foo_db");
+ verify(metaDataContexts.getOptimizerContext(), times(0)).dropDatabase("foo_db");
+ }
+
@Test
public void assertAddSchema() {
contextManager.addSchema("foo_db", "bar_schema");