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();
     }

Reply via email to