This is an automated email from the ASF dual-hosted git repository.

panjuan 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 7953008  Fixes #8912 (#8956)
7953008 is described below

commit 7953008971324bcf62e22eaf5183434d714b06c9
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jan 8 19:04:37 2021 +0800

    Fixes #8912 (#8956)
    
    * For code format
    
    * Fixes #8912
    
    * Fix test case
---
 .../shardingsphere/sharding/rule/ShardingRule.java | 33 +++++++++++++++++++++-
 .../CreateTableEvent.java}                         | 27 ++++++++----------
 .../DropTableEvent.java}                           | 22 ++++++---------
 .../type/CreateTableStatementSchemaRefresher.java  |  3 ++
 .../type/CreateViewStatementSchemaRefresher.java   |  6 +++-
 .../type/DropTableStatementSchemaRefresher.java    |  6 ++++
 .../type/DropViewStatementSchemaRefresher.java     |  6 ++++
 .../CreateTableStatementSchemaRefresherTest.java   |  2 +-
 8 files changed, 73 insertions(+), 32 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index a01bf40..bacc9e6 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-common/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -20,12 +20,16 @@ package org.apache.shardingsphere.sharding.rule;
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
+import com.google.common.eventbus.Subscribe;
 import lombok.AccessLevel;
 import lombok.Getter;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
 import 
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
+import 
org.apache.shardingsphere.infra.metadata.schema.refresher.event.CreateTableEvent;
+import 
org.apache.shardingsphere.infra.metadata.schema.refresher.event.DropTableEvent;
 import org.apache.shardingsphere.infra.rule.type.DataNodeContainedRule;
 import org.apache.shardingsphere.infra.rule.type.TableContainedRule;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
@@ -80,7 +84,7 @@ public final class ShardingRule implements 
DataNodeContainedRule, TableContained
     private final Collection<BindingTableRule> bindingTableRules;
     
     private final Collection<String> broadcastTables;
-
+    
     private final Map<String, SingleTableRule> singleTableRules;
     
     @Getter(AccessLevel.NONE)
@@ -106,6 +110,7 @@ public final class ShardingRule implements 
DataNodeContainedRule, TableContained
         defaultTableShardingStrategyConfig = null == 
config.getDefaultTableShardingStrategy() ? new 
NoneShardingStrategyConfiguration() : config.getDefaultTableShardingStrategy();
         defaultKeyGenerateAlgorithm = null == 
config.getDefaultKeyGenerateStrategy()
                 ? 
TypedSPIRegistry.getRegisteredService(KeyGenerateAlgorithm.class) : 
keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
+        ShardingSphereEventBus.getInstance().register(this);
     }
     
     public ShardingRule(final AlgorithmProvidedShardingRuleConfiguration 
config, final DatabaseType databaseType, final Map<String, DataSource> 
dataSourceMap) {
@@ -414,6 +419,32 @@ public final class ShardingRule implements 
DataNodeContainedRule, TableContained
         return result;
     }
     
+    /**
+     * Add single table.
+     * 
+     * @param event create table event
+     */
+    @Subscribe
+    public void createSingleTable(final CreateTableEvent event) {
+        if (!isConfiguredTable(event.getTableName())) {
+            singleTableRules.put(event.getTableName(), new 
SingleTableRule(event.getTableName(), event.getDataSourceName()));
+        }
+    }
+    
+    private boolean isConfiguredTable(final String tableName) {
+        return findTableRule(tableName).isPresent() || 
findBindingTableRule(tableName).isPresent() || 
broadcastTables.contains(tableName) || singleTableRules.containsKey(tableName);
+    }
+    
+    /**
+     * Drop single table.
+     *
+     * @param event drop table event
+     */
+    @Subscribe
+    public void dropSingleTable(final DropTableEvent event) {
+        singleTableRules.remove(event.getTableName());
+    }
+    
     @Override
     public Map<String, Collection<DataNode>> getAllDataNodes() {
         return 
tableRules.stream().collect(Collectors.toMap(TableRule::getLogicTable, 
TableRule::getActualDataNodes, (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new));
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/event/CreateTableEvent.java
similarity index 51%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/event/CreateTableEvent.java
index 2230401..46d06f5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/event/CreateTableEvent.java
@@ -15,25 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.schema.refresher.type;
+package org.apache.shardingsphere.infra.metadata.schema.refresher.event;
 
-import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
-
-import java.util.Collection;
 
 /**
- * ShardingSphere schema refresher for create view statement.
+ * Create table event.
  */
-public final class CreateViewStatementSchemaRefresher implements 
SchemaRefresher<CreateViewStatement> {
+@RequiredArgsConstructor
+@Getter
+public final class CreateTableEvent {
+    
+    private final String dataSourceName;
+    
+    private final String tableName;
     
-    @Override
-    public void refresh(final ShardingSphereSchema schema, 
-                        final Collection<String> routeDataSourceNames, final 
CreateViewStatement sqlStatement, final SchemaBuilderMaterials materials) {
-        String viewName = 
sqlStatement.getView().getTableName().getIdentifier().getValue();
-        schema.put(viewName, new TableMetaData());
-    }
+    private final TableMetaData tableMetaData;
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/event/DropTableEvent.java
similarity index 50%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/event/DropTableEvent.java
index 8aeda2b..b10eb80 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/event/DropTableEvent.java
@@ -15,23 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.schema.refresher.type;
+package org.apache.shardingsphere.infra.metadata.schema.refresher.event;
 
-import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropViewStatement;
-
-import java.util.Collection;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 
 /**
- * ShardingSphere schema refresher for drop view statement.
+ * Drop table event.
  */
-public final class DropViewStatementSchemaRefresher implements 
SchemaRefresher<DropViewStatement> {
+@RequiredArgsConstructor
+@Getter
+public final class DropTableEvent {
     
-    @Override
-    public void refresh(final ShardingSphereSchema schema, 
-                        final Collection<String> routeDataSourceNames, final 
DropViewStatement sqlStatement, final SchemaBuilderMaterials materials) {
-        sqlStatement.getViews().forEach(each -> 
schema.remove(each.getTableName().getIdentifier().getValue()));
-    }
+    private final String tableName;
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
index 423a0cc..f2a7a02 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
@@ -17,11 +17,13 @@
 
 package org.apache.shardingsphere.infra.metadata.schema.refresher.type;
 
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
+import 
org.apache.shardingsphere.infra.metadata.schema.refresher.event.CreateTableEvent;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.type.TableContainedRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
@@ -45,6 +47,7 @@ public final class CreateTableStatementSchemaRefresher 
implements SchemaRefreshe
             tableMetaData = new TableMetaData();
         }
         schema.put(tableName, tableMetaData);
+        ShardingSphereEventBus.getInstance().post(new 
CreateTableEvent(routeDataSourceNames.iterator().next(), tableName, 
tableMetaData));
     }
     
     private boolean containsInTableContainedRule(final String tableName, final 
SchemaBuilderMaterials materials) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
index 2230401..a4cc92f 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.infra.metadata.schema.refresher.type;
 
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
+import 
org.apache.shardingsphere.infra.metadata.schema.refresher.event.CreateTableEvent;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
 
 import java.util.Collection;
@@ -34,6 +36,8 @@ public final class CreateViewStatementSchemaRefresher 
implements SchemaRefresher
     public void refresh(final ShardingSphereSchema schema, 
                         final Collection<String> routeDataSourceNames, final 
CreateViewStatement sqlStatement, final SchemaBuilderMaterials materials) {
         String viewName = 
sqlStatement.getView().getTableName().getIdentifier().getValue();
-        schema.put(viewName, new TableMetaData());
+        TableMetaData tableMetaData = new TableMetaData();
+        schema.put(viewName, tableMetaData);
+        ShardingSphereEventBus.getInstance().post(new 
CreateTableEvent(routeDataSourceNames.iterator().next(), viewName, 
tableMetaData));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
index 7eeac07..4f90bc1 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
@@ -17,9 +17,12 @@
 
 package org.apache.shardingsphere.infra.metadata.schema.refresher.type;
 
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
+import 
org.apache.shardingsphere.infra.metadata.schema.refresher.event.DropTableEvent;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropTableStatement;
 
 import java.util.Collection;
@@ -33,5 +36,8 @@ public final class DropTableStatementSchemaRefresher 
implements SchemaRefresher<
     public void refresh(final ShardingSphereSchema schema, 
                         final Collection<String> routeDataSourceNames, final 
DropTableStatement sqlStatement, final SchemaBuilderMaterials materials) {
         sqlStatement.getTables().forEach(each -> 
schema.remove(each.getTableName().getIdentifier().getValue()));
+        for (SimpleTableSegment each : sqlStatement.getTables()) {
+            ShardingSphereEventBus.getInstance().post(new 
DropTableEvent(each.getTableName().getIdentifier().getValue()));
+        }
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
index 8aeda2b..6cd593b 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
@@ -17,9 +17,12 @@
 
 package org.apache.shardingsphere.infra.metadata.schema.refresher.type;
 
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.schema.refresher.SchemaRefresher;
+import 
org.apache.shardingsphere.infra.metadata.schema.refresher.event.DropTableEvent;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropViewStatement;
 
 import java.util.Collection;
@@ -33,5 +36,8 @@ public final class DropViewStatementSchemaRefresher 
implements SchemaRefresher<D
     public void refresh(final ShardingSphereSchema schema, 
                         final Collection<String> routeDataSourceNames, final 
DropViewStatement sqlStatement, final SchemaBuilderMaterials materials) {
         sqlStatement.getViews().forEach(each -> 
schema.remove(each.getTableName().getIdentifier().getValue()));
+        for (SimpleTableSegment each : sqlStatement.getViews()) {
+            ShardingSphereEventBus.getInstance().post(new 
DropTableEvent(each.getTableName().getIdentifier().getValue()));
+        }
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresherTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresherTest.java
index 24645dd..7ebc63c 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresherTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresherTest.java
@@ -76,7 +76,7 @@ public final class CreateTableStatementSchemaRefresherTest {
         createTableStatement.setTable(new SimpleTableSegment(new 
TableNameSegment(1, 3, new IdentifierValue("t_order_0"))));
         SchemaRefresher<CreateTableStatement> schemaRefresher = new 
CreateTableStatementSchemaRefresher();
         SchemaBuilderMaterials materials = mock(SchemaBuilderMaterials.class);
-        schemaRefresher.refresh(schema, Collections.emptyList(), 
createTableStatement, materials);
+        schemaRefresher.refresh(schema, Collections.singleton("ds"), 
createTableStatement, materials);
         assertTrue(schema.containsTable("t_order_0"));
     }
     

Reply via email to