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 22179b36751 Refactor reload SingleTableRule logic when curd single 
table (#20053)
22179b36751 is described below

commit 22179b367512460cae4a08096cd2b774ebdd6a77
Author: zhaojinchao <[email protected]>
AuthorDate: Thu Aug 11 12:00:39 2022 +0800

    Refactor reload SingleTableRule logic when curd single table (#20053)
    
    * Refactor refresh SingleTableRule when curd single table
    
    * Add drop table to sync SingleTableRule
    
    * Fix checkstyle
    
    * Fix unit test
    
    * Fix unit test
    
    * revise
    
    * update
    
    * Revise
    
    * remove unless code
    
    * toLower
    
    * update
    
    * update
---
 .../metadata/database/ShardingSphereDatabase.java  | 34 ++++++++++------------
 .../rule/identifier/type/MutableDataNodeRule.java  | 14 +++++++++
 .../database/ShardingSphereDatabaseTest.java       | 24 +++++++--------
 .../type/CreateTableStatementSchemaRefresher.java  |  3 +-
 .../singletable/rule/SingleTableRule.java          |  7 +++++
 .../mode/manager/ContextManager.java               | 16 ++++++----
 6 files changed, 60 insertions(+), 38 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
index 6f96eb0b7a0..5e18922d5ff 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
@@ -33,6 +33,8 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSc
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -172,30 +174,24 @@ public final class ShardingSphereDatabase {
         return !resource.getDataSources().isEmpty();
     }
     
-    /**
-     * Reload rules.
-     * 
-     * @param instanceContext instance context
-     */
-    public synchronized void reloadRules(final InstanceContext 
instanceContext) {
-        Collection<ShardingSphereRule> databaseRules = 
DatabaseRulesBuilder.build(
-                name, new 
DataSourceProvidedDatabaseConfiguration(resource.getDataSources(), 
ruleMetaData.getConfigurations()), instanceContext);
-        ruleMetaData.getRules().clear();
-        ruleMetaData.getRules().addAll(databaseRules);
-    }
-    
     /**
      * Reload rules.
      *
      * @param ruleClass to be reloaded rule class
-     * @param instanceContext instance context
      */
-    public synchronized void reloadRules(final Class<? extends 
ShardingSphereRule> ruleClass, final InstanceContext instanceContext) {
+    public synchronized void reloadRules(final Class<? extends 
ShardingSphereRule> ruleClass) {
         Collection<? extends ShardingSphereRule> toBeReloadedRules = 
ruleMetaData.findRules(ruleClass);
-        Collection<RuleConfiguration> toBeReloadedRuleConfigs = 
toBeReloadedRules.stream().map(ShardingSphereRule::getConfiguration).collect(Collectors.toList());
-        Collection<ShardingSphereRule> reloadedDatabaseRules = 
DatabaseRulesBuilder.build(
-                name, new 
DataSourceProvidedDatabaseConfiguration(resource.getDataSources(), 
toBeReloadedRuleConfigs), instanceContext);
-        ruleMetaData.getRules().removeAll(toBeReloadedRules);
-        ruleMetaData.getRules().addAll(reloadedDatabaseRules);
+        RuleConfiguration config = 
toBeReloadedRules.stream().map(ShardingSphereRule::getConfiguration).findFirst().orElse(null);
+        toBeReloadedRules.stream().findFirst().ifPresent(optional -> {
+            ruleMetaData.getRules().removeAll(toBeReloadedRules);
+            ruleMetaData.getRules().addAll(reloadRules(config, 
(MutableDataNodeRule) optional));
+        });
+    }
+    
+    private Collection<ShardingSphereRule> reloadRules(final RuleConfiguration 
config, final MutableDataNodeRule mutableDataNodeRule) {
+        Collection<ShardingSphereRule> result = new LinkedList<>();
+        Collection<ShardingSphereRule> dataSourceContainedRules = 
ruleMetaData.getRules().stream().filter(each -> each instanceof 
DataSourceContainedRule).collect(Collectors.toList());
+        result.add(mutableDataNodeRule.reloadRule(config, name, 
resource.getDataSources(), dataSourceContainedRules));
+        return result;
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
index d05741c60d0..71c9831c768 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
@@ -17,10 +17,13 @@
 
 package org.apache.shardingsphere.infra.rule.identifier.type;
 
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
+import javax.sql.DataSource;
 import java.util.Collection;
+import java.util.Map;
 import java.util.Optional;
 
 /**
@@ -61,4 +64,15 @@ public interface MutableDataNodeRule extends 
ShardingSphereRule {
      * @return single table data node
      */
     Optional<DataNode> findSingleTableDataNode(String schemaName, String 
tableName);
+    
+    /**
+     * Reload single table rule.
+     *
+     * @param config rule configuration
+     * @param databaseName database name
+     * @param dataSourceMap data source map
+     * @param builtRules built rules
+     * @return single table rule
+     */
+    ShardingSphereRule reloadRule(RuleConfiguration config, String 
databaseName, Map<String, DataSource> dataSourceMap, 
Collection<ShardingSphereRule> builtRules);
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
index a311d70da31..33b8b4f679c 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
@@ -19,12 +19,8 @@ package org.apache.shardingsphere.infra.metadata.database;
 
 import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
-import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
-import org.apache.shardingsphere.infra.instance.InstanceContext;
-import 
org.apache.shardingsphere.infra.instance.fixture.WorkerIdGeneratorFixture;
-import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
-import org.apache.shardingsphere.infra.lock.LockContext;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
@@ -33,9 +29,13 @@ import org.junit.Test;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 
 public final class ShardingSphereDatabaseTest {
@@ -66,12 +66,12 @@ public final class ShardingSphereDatabaseTest {
     @Test
     public void assertReloadRules() {
         ShardingSphereResource resource = new 
ShardingSphereResource(Collections.singletonMap("ds", new MockedDataSource()));
-        ShardingSphereRuleMetaData ruleMetaData = new 
ShardingSphereRuleMetaData(Collections.emptyList());
+        Collection<ShardingSphereRule> rules = new LinkedList<>();
+        rules.add(mock(MutableDataNodeRule.class, RETURNS_DEEP_STUBS));
+        rules.add(mock(DataSourceContainedRule.class, RETURNS_DEEP_STUBS));
+        ShardingSphereRuleMetaData ruleMetaData = new 
ShardingSphereRuleMetaData(rules);
         ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
mock(DatabaseType.class), resource, ruleMetaData, Collections.emptyMap());
-        Collection<ShardingSphereRule> rules = 
database.getRuleMetaData().getRules();
-        assertTrue(rules.isEmpty());
-        database.reloadRules(new InstanceContext(new 
ComputeNodeInstance(mock(InstanceMetaData.class)), new 
WorkerIdGeneratorFixture(Long.MIN_VALUE), modeConfig, mock(LockContext.class),
-                new EventBusContext()));
-        assertFalse(rules.isEmpty());
+        database.reloadRules(MutableDataNodeRule.class);
+        assertThat(database.getRuleMetaData().getRules().size(), is(2));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
index 81ed7a29ce4..b582595e1a2 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
@@ -44,7 +44,8 @@ public final class CreateTableStatementSchemaRefresher 
implements MetaDataRefres
     @Override
     public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final Collection<String> logicDataSourceNames,
                                                     final String schemaName, 
final CreateTableStatement sqlStatement, final ConfigurationProperties props) 
throws SQLException {
-        String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
+        // TODO Fixme Remove table conversion to lowercase
+        String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue().toLowerCase();
         if (!containsInImmutableDataNodeContainedRule(tableName, database)) {
             
database.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
         }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
index 36d36444c80..347e8a4e79c 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.singletable.rule;
 
 import lombok.Getter;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
@@ -225,6 +226,12 @@ public final class SingleTableRule implements 
DatabaseRule, DataNodeContainedRul
         return Optional.empty();
     }
     
+    @Override
+    public ShardingSphereRule reloadRule(final RuleConfiguration config, final 
String databaseName, final Map<String, DataSource> dataSourceMap,
+                                         final Collection<ShardingSphereRule> 
builtRules) {
+        return new SingleTableRule((SingleTableRuleConfiguration) config, 
databaseName, dataSourceMap, builtRules);
+    }
+    
     @Override
     public Map<String, Collection<DataNode>> getAllDataNodes() {
         return singleTableDataNodes;
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 8b6e2269dd9..bc758589d6c 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
@@ -39,6 +39,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
 import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
@@ -168,20 +169,23 @@ public final class ContextManager implements 
AutoCloseable {
     }
     
     private synchronized void alterTable(final ShardingSphereDatabase 
database, final String schemaName, final ShardingSphereTable beBoChangedTable) {
-        if (containsMutableDataNodeRule(database, schemaName, 
beBoChangedTable.getName())) {
-            database.reloadRules(instanceContext);
+        if (!containsMutableDataNodeRule(database, 
beBoChangedTable.getName())) {
+            database.reloadRules(MutableDataNodeRule.class);
         }
         database.getSchema(schemaName).put(beBoChangedTable.getName(), 
beBoChangedTable);
     }
     
-    private boolean containsMutableDataNodeRule(final ShardingSphereDatabase 
database, final String schemaName, final String tableName) {
-        return 
database.getRuleMetaData().findRules(MutableDataNodeRule.class).stream().anyMatch(each
 -> each.findSingleTableDataNode(schemaName, tableName).isPresent());
+    private boolean containsMutableDataNodeRule(final ShardingSphereDatabase 
database, final String tableName) {
+        // TODO Fixme Remove table conversion to lowercase
+        return 
database.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+                .filter(each -> !(each instanceof 
MutableDataNodeRule)).anyMatch(each -> 
each.getAllTables().contains(tableName.toLowerCase()));
     }
     
     private void dropTable(final String databaseName, final String schemaName, 
final String toBeDeletedTableName) {
         if 
(metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName))
 {
             
metaDataContexts.getMetaData().getDatabase(databaseName).getSchema(schemaName).remove(toBeDeletedTableName);
-            // TODO check whether need to reloadRules(single table rule) if 
table dropped?
+            
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules().stream().filter(each
 -> each instanceof MutableDataNodeRule)
+                    .findFirst().ifPresent(optional -> ((MutableDataNodeRule) 
optional).remove(schemaName, toBeDeletedTableName));
         }
     }
     
@@ -408,7 +412,7 @@ public final class ContextManager implements AutoCloseable {
     
     private ShardingSphereSchema loadSchema(final String databaseName, final 
String schemaName, final String dataSourceName) throws SQLException {
         ShardingSphereDatabase database = 
metaDataContexts.getMetaData().getDatabase(databaseName);
-        database.reloadRules(MutableDataNodeRule.class, instanceContext);
+        database.reloadRules(MutableDataNodeRule.class);
         GenericSchemaBuilderMaterials materials = new 
GenericSchemaBuilderMaterials(database.getProtocolType(), 
database.getResource().getDatabaseType(),
                 Collections.singletonMap(dataSourceName, 
database.getResource().getDataSources().get(dataSourceName)),
                 database.getRuleMetaData().getRules(), 
metaDataContexts.getMetaData().getProps(), schemaName);

Reply via email to