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 c7020bdc9ab Add create table and drop table for
MetaDataManagerPersistService (#32421)
c7020bdc9ab is described below
commit c7020bdc9ab61ae974aeea0b9fa323250e0a8a3a
Author: Haoran Meng <[email protected]>
AuthorDate: Wed Aug 7 22:16:43 2024 +0800
Add create table and drop table for MetaDataManagerPersistService (#32421)
---
.../table/CreateTableStatementSchemaRefresher.java | 5 +----
.../table/DropTableStatementSchemaRefresher.java | 7 +++---
.../service/MetaDataManagerPersistService.java | 20 +++++++++++++++++
.../ClusterMetaDataManagerPersistService.java | 12 ++++++++++
.../StandaloneMetaDataManagerPersistService.java | 26 ++++++++++++++++++++++
5 files changed, 62 insertions(+), 8 deletions(-)
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java
index 387dd2bec84..2ecaac3481b 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java
@@ -25,7 +25,6 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
-import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher;
import
org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils;
@@ -58,9 +57,7 @@ public final class CreateTableStatementSchemaRefresher
implements MetaDataRefres
Map<String, ShardingSphereSchema> schemaMap =
GenericSchemaBuilder.build(Collections.singletonList(tableName), material);
Optional<ShardingSphereTable> actualTableMetaData =
Optional.ofNullable(schemaMap.get(schemaName)).map(optional ->
optional.getTable(tableName));
if (actualTableMetaData.isPresent()) {
- AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new
AlterSchemaMetaDataPOJO(database.getName(), schemaName, logicDataSourceNames);
-
alterSchemaMetaDataPOJO.getAlteredTables().add(actualTableMetaData.get());
-
metaDataManagerPersistService.alterSchemaMetaData(alterSchemaMetaDataPOJO);
+ metaDataManagerPersistService.createTable(database.getName(),
schemaName, actualTableMetaData.get(), logicDataSourceNames.isEmpty() ? null :
logicDataSourceNames.iterator().next());
if (isSingleTable &&
TableRefreshUtils.isRuleRefreshRequired(ruleMetaData, schemaName, tableName)) {
metaDataManagerPersistService.alterSingleRuleConfiguration(database.getName(),
ruleMetaData.getConfigurations());
}
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java
index 6fdd2b29d7c..bc387e68fb7 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java
@@ -20,7 +20,6 @@ package
org.apache.shardingsphere.mode.metadata.refresher.type.table;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher;
import
org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils;
import
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
@@ -29,6 +28,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTab
import java.sql.SQLException;
import java.util.Collection;
+import java.util.stream.Collectors;
/**
* Schema refresher for drop table statement.
@@ -38,10 +38,9 @@ public final class DropTableStatementSchemaRefresher
implements MetaDataRefreshe
@Override
public void refresh(final MetaDataManagerPersistService
metaDataManagerPersistService, final ShardingSphereDatabase database, final
Collection<String> logicDataSourceNames,
final String schemaName, final DatabaseType
databaseType, final DropTableStatement sqlStatement, final
ConfigurationProperties props) throws SQLException {
- AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new
AlterSchemaMetaDataPOJO(database.getName(), schemaName);
- sqlStatement.getTables().forEach(each ->
alterSchemaMetaDataPOJO.getDroppedTables().add(each.getTableName().getIdentifier().getValue()));
+ Collection<String> tableNames =
sqlStatement.getTables().stream().map(each ->
each.getTableName().getIdentifier().getValue()).collect(Collectors.toList());
boolean isRuleRefreshRequired =
TableRefreshUtils.isRuleRefreshRequired(database.getRuleMetaData(), schemaName,
sqlStatement.getTables());
-
metaDataManagerPersistService.alterSchemaMetaData(alterSchemaMetaDataPOJO);
+ metaDataManagerPersistService.dropTables(database.getName(),
schemaName, tableNames);
for (SimpleTableSegment each : sqlStatement.getTables()) {
if (isRuleRefreshRequired &&
TableRefreshUtils.isSingleTable(each.getTableName().getIdentifier().getValue(),
database)) {
metaDataManagerPersistService.alterSingleRuleConfiguration(database.getName(),
database.getRuleMetaData().getConfigurations());
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
index c6b153192b4..eb1cbe35954 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.mode.persist.service;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
@@ -150,4 +151,23 @@ public interface MetaDataManagerPersistService {
* @param props pros
*/
void alterProperties(Properties props);
+
+ /**
+ * Create table.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param table table
+ * @param logicDataSourceName logic data source name
+ */
+ void createTable(String databaseName, String schemaName,
ShardingSphereTable table, String logicDataSourceName);
+
+ /**
+ * Drop tables.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableNames table names
+ */
+ void dropTables(String databaseName, String schemaName, Collection<String>
tableNames);
}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
index fa3943d11d1..535ae03a9af 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.mode.manager.cluster.persist;
+import org.apache.groovy.util.Maps;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -202,6 +203,17 @@ public final class ClusterMetaDataManagerPersistService
implements MetaDataManag
metaDataPersistService.getPropsService().persist(props);
}
+ @Override
+ public void createTable(final String databaseName, final String
schemaName, final ShardingSphereTable table, final String logicDataSourceName) {
+ DatabaseMetaDataPersistService databaseMetaDataService =
metaDataPersistService.getDatabaseMetaDataService();
+
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName,
schemaName, Maps.of(table.getName(), table));
+ }
+
+ @Override
+ public void dropTables(final String databaseName, final String schemaName,
final Collection<String> tableNames) {
+ tableNames.forEach(each ->
metaDataPersistService.getDatabaseMetaDataService().getTableMetaDataPersistService().delete(databaseName,
schemaName, each));
+ }
+
private void afterStorageUnitsAltered(final String databaseName, final
MetaDataContexts originalMetaDataContexts, final MetaDataContexts
reloadMetaDataContexts) {
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
diff --git
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/StandaloneMetaDataManagerPersistService.java
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/StandaloneMetaDataManagerPersistService.java
index 7d6c1ff4205..f6adfb2370e 100644
---
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/StandaloneMetaDataManagerPersistService.java
+++
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/StandaloneMetaDataManagerPersistService.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.mode.manager.standalone.persist;
import com.google.common.base.Strings;
+import org.apache.groovy.util.Maps;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -343,6 +344,31 @@ public final class StandaloneMetaDataManagerPersistService
implements MetaDataMa
clearServiceCache();
}
+ @Override
+ public void createTable(final String databaseName, final String
schemaName, final ShardingSphereTable table, final String logicDataSourceName) {
+ ShardingSphereMetaData metaData =
metaDataContextManager.getMetaDataContexts().get().getMetaData();
+ ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+ addTableToDataNode(database, schemaName, logicDataSourceName, table);
+ metaData.getGlobalRuleMetaData().getRules().forEach(each ->
((GlobalRule) each).refresh(metaData.getDatabases(),
GlobalRuleChangedType.SCHEMA_CHANGED));
+
metaDataPersistService.getDatabaseMetaDataService().getTableMetaDataPersistService().persist(databaseName,
schemaName, Maps.of(table.getName(), table));
+ }
+
+ @Override
+ public void dropTables(final String databaseName, final String schemaName,
final Collection<String> tableNames) {
+ ShardingSphereMetaData metaData =
metaDataContextManager.getMetaDataContexts().get().getMetaData();
+ ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+ removeTablesToDataNode(database, schemaName, tableNames);
+ metaData.getGlobalRuleMetaData().getRules().forEach(each ->
((GlobalRule) each).refresh(metaData.getDatabases(),
GlobalRuleChangedType.SCHEMA_CHANGED));
+ tableNames.forEach(each ->
metaDataPersistService.getDatabaseMetaDataService().getTableMetaDataPersistService().delete(databaseName,
schemaName, each));
+ }
+
+ private void addTableToDataNode(final ShardingSphereDatabase database,
final String schemaName, final String logicDataSourceName, final
ShardingSphereTable table) {
+ if (!Strings.isNullOrEmpty(logicDataSourceName) &&
TableRefreshUtils.isSingleTable(table.getName(), database)) {
+
database.getRuleMetaData().getAttributes(MutableDataNodeRuleAttribute.class).forEach(rule
-> rule.put(logicDataSourceName, schemaName, table.getName()));
+ }
+ database.getSchema(schemaName).putTable(table.getName(), table);
+ }
+
private void clearServiceCache() {
OrderedServicesCache.clearCache();
}