You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/01/08 11:04:59 UTC
[shardingsphere] branch master updated: Fixes #8912 (#8956)
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 <te...@163.com>
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"));
}