This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 909c064dfbd Governance center support view changed (#20856)
909c064dfbd is described below
commit 909c064dfbdbd3e1daae8791dda4066a5dd7fd4d
Author: zhaojinchao <[email protected]>
AuthorDate: Thu Sep 8 10:00:59 2022 +0800
Governance center support view changed (#20856)
* Extract SchemaManager for schema meta data changed
* Refactor CREATE/DROP view refresh
* Add view meta data logic for governance center
* Finish view governance logic
* Fix checkstyle
* Fix unit test
---
.../decorator/model/ShardingSphereSchema.java | 9 ++++
.../database/schema/event/SchemaAlteredEvent.java | 5 ++
.../type/CreateViewStatementSchemaRefresher.java | 13 +++--
.../type/DropViewStatementSchemaRefresher.java | 10 ++--
.../mode/manager/ContextManager.java | 52 +++++++++++++-------
.../persist/node/DatabaseMetaDataNode.java | 12 +++++
.../schema/TableMetaDataPersistService.java | 1 -
.../mode/manager/ContextManagerTest.java | 29 +++++++++--
.../persist/node/DatabaseMetaDataNodeTest.java | 7 +++
.../ClusterContextManagerCoordinator.java | 24 +++++++---
...edEvent.java => TableMetaDataChangedEvent.java} | 4 +-
...gedEvent.java => ViewMetaDataChangedEvent.java} | 10 ++--
.../SchemaMetaDataRegistrySubscriber.java | 10 +++-
.../metadata/watcher/MetaDataChangedWatcher.java | 56 +++++++++++++---------
.../ClusterContextManagerCoordinatorTest.java | 19 ++++++--
.../watcher/GlobalRuleChangedWatcherTest.java | 6 +--
.../SchemaMetaDataRegistrySubscriberTest.java | 9 ++--
.../watcher/MetaDataChangedWatcherTest.java | 20 ++++++--
18 files changed, 213 insertions(+), 83 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/model/ShardingSphereSchema.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/model/ShardingSphereSchema.java
index 5ea2b254d47..ca3a83fd7ea 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/model/ShardingSphereSchema.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/model/ShardingSphereSchema.java
@@ -127,6 +127,15 @@ public final class ShardingSphereSchema {
tables.remove(tableName.toLowerCase());
}
+ /**
+ * Remove view meta data.
+ *
+ * @param viewName view name
+ */
+ public void removeView(final String viewName) {
+ views.remove(viewName.toLowerCase());
+ }
+
/**
* Judge contains table from table meta data or not.
*
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
index 5c6fee35f6c..4957395d697 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.infra.metadata.database.schema.event;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereView;
import java.util.ArrayList;
import java.util.Collection;
@@ -37,5 +38,9 @@ public final class SchemaAlteredEvent implements
MetaDataRefreshedEvent {
private final Collection<ShardingSphereTable> alteredTables = new
ArrayList<>();
+ private final Collection<ShardingSphereView> alteredViews = new
ArrayList<>();
+
private final Collection<String> droppedTables = new ArrayList<>();
+
+ private final Collection<String> droppedViews = new ArrayList<>();
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
index 47c955a75f7..8360071ef11 100644
---
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
+++
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
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.metadata.database.schema.decorator.model.ShardingSphereView;
import
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
import
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
@@ -51,12 +52,14 @@ public final class CreateViewStatementSchemaRefresher
implements MetaDataRefresh
GenericSchemaBuilderMaterials materials = new
GenericSchemaBuilderMaterials(database.getProtocolType(),
database.getResource().getDatabaseType(),
database.getResource().getDataSources(), database.getRuleMetaData().getRules(),
props, schemaName);
Map<String, ShardingSphereSchema> schemaMap =
GenericSchemaBuilder.build(Collections.singletonList(viewName), materials);
- Optional<ShardingSphereTable> actualViewMetaData =
Optional.ofNullable(schemaMap.get(schemaName)).map(optional ->
optional.getTable(viewName));
- // TODO Put view meta data to ShardingSphereSchema 's views
- if (actualViewMetaData.isPresent()) {
- database.getSchema(schemaName).putTable(viewName,
actualViewMetaData.get());
+ Optional<ShardingSphereTable> actualTableMetaData =
Optional.ofNullable(schemaMap.get(schemaName)).map(optional ->
optional.getTable(viewName));
+ Optional<ShardingSphereView> actualViewMetaData =
Optional.ofNullable(schemaMap.get(schemaName)).map(optional ->
optional.getView(viewName));
+ if (actualTableMetaData.isPresent() && actualViewMetaData.isPresent())
{
+ database.getSchema(schemaName).putTable(viewName,
actualTableMetaData.get());
+ database.getSchema(schemaName).putView(viewName,
actualViewMetaData.get());
SchemaAlteredEvent event = new
SchemaAlteredEvent(database.getName(), schemaName);
- event.getAlteredTables().add(actualViewMetaData.get());
+ event.getAlteredTables().add(actualTableMetaData.get());
+ event.getAlteredViews().add(actualViewMetaData.get());
return Optional.of(event);
}
return Optional.empty();
diff --git
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
index 25bcb23596c..f421c6fdd61 100644
---
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
+++
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.infra.context.refresher.type;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
import
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -39,10 +40,13 @@ public final class DropViewStatementSchemaRefresher
implements MetaDataRefresher
public Optional<MetaDataRefreshedEvent> refresh(final
ShardingSphereDatabase database, final Collection<String> logicDataSourceNames,
final String schemaName,
final DropViewStatement sqlStatement, final ConfigurationProperties props)
throws SQLException {
SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(),
schemaName);
- // TODO Drop view meta data from views
sqlStatement.getViews().forEach(each -> {
-
database.getSchema(schemaName).removeTable(each.getTableName().getIdentifier().getValue());
-
event.getDroppedTables().add(each.getTableName().getIdentifier().getValue());
+ ShardingSphereSchema schema = database.getSchema(schemaName);
+ String viewName = each.getTableName().getIdentifier().getValue();
+ schema.removeTable(viewName);
+ event.getDroppedTables().add(viewName);
+ schema.removeView(viewName);
+ event.getDroppedViews().add(viewName);
});
Collection<MutableDataNodeRule> rules =
database.getRuleMetaData().findRules(MutableDataNodeRule.class);
for (SimpleTableSegment each : sqlStatement.getViews()) {
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 2c47ab3d551..d6eb16dc0fc 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.builder.GenericSchemaBuilderMaterials;
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.metadata.database.schema.decorator.model.ShardingSphereView;
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;
@@ -145,11 +146,15 @@ public final class ContextManager implements
AutoCloseable {
* @param databaseName database name
* @param schemaName schema name
* @param toBeDeletedTableName to be deleted table name
+ * @param toBeDeletedViewName to be deleted view name
*/
- public synchronized void alterSchema(final String databaseName, final
String schemaName, final String toBeDeletedTableName) {
- if (metaDataContexts.getMetaData().containsDatabase(databaseName)) {
- Optional.ofNullable(toBeDeletedTableName).ifPresent(optional ->
dropTable(databaseName, schemaName, optional));
+ public synchronized void alterSchema(final String databaseName, final
String schemaName, final String toBeDeletedTableName,
+ final String toBeDeletedViewName) {
+ if (!metaDataContexts.getMetaData().containsDatabase(databaseName) ||
!metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName))
{
+ return;
}
+ Optional.ofNullable(toBeDeletedTableName).ifPresent(optional ->
dropTable(databaseName, schemaName, optional));
+ Optional.ofNullable(toBeDeletedViewName).ifPresent(optional ->
dropView(databaseName, schemaName, optional));
}
/**
@@ -158,37 +163,50 @@ public final class ContextManager implements
AutoCloseable {
* @param databaseName database name
* @param schemaName schema name
* @param toBeChangedTable to be changed table
+ * @param toBeChangedView to be changed view
*/
- public synchronized void alterSchema(final String databaseName, final
String schemaName, final ShardingSphereTable toBeChangedTable) {
- if (metaDataContexts.getMetaData().containsDatabase(databaseName)) {
- Optional.ofNullable(toBeChangedTable).ifPresent(optional ->
alterTable(databaseName, schemaName, optional));
+ public synchronized void alterSchema(final String databaseName, final
String schemaName, final ShardingSphereTable toBeChangedTable,
+ final ShardingSphereView
toBeChangedView) {
+ if (!metaDataContexts.getMetaData().containsDatabase(databaseName) ||
!metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName))
{
+ return;
}
+ Optional.ofNullable(toBeChangedTable).ifPresent(optional ->
alterTable(databaseName, schemaName, optional));
+ Optional.ofNullable(toBeChangedView).ifPresent(optional ->
alterView(databaseName, schemaName, optional));
}
- private synchronized void alterTable(final String databaseName, final
String schemaName, final ShardingSphereTable beBoChangedTable) {
- alterTable(metaDataContexts.getMetaData().getDatabase(databaseName),
schemaName, beBoChangedTable);
+ private synchronized void dropTable(final String databaseName, final
String schemaName, final String toBeDeletedTableName) {
+
metaDataContexts.getMetaData().getDatabase(databaseName).getSchema(schemaName).removeTable(toBeDeletedTableName);
+
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules().stream().filter(each
-> each instanceof MutableDataNodeRule).findFirst()
+ .ifPresent(optional -> ((MutableDataNodeRule)
optional).remove(schemaName, toBeDeletedTableName));
}
- private synchronized void alterTable(final ShardingSphereDatabase
database, final String schemaName, final ShardingSphereTable beBoChangedTable) {
+ private synchronized void dropView(final String databaseName, final String
schemaName, final String toBeDeletedViewName) {
+
metaDataContexts.getMetaData().getDatabase(databaseName).getSchema(schemaName).removeView(toBeDeletedViewName);
+
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules().stream().filter(each
-> each instanceof MutableDataNodeRule).findFirst()
+ .ifPresent(optional -> ((MutableDataNodeRule)
optional).remove(schemaName, toBeDeletedViewName));
+ }
+
+ private synchronized void alterTable(final String databaseName, final
String schemaName, final ShardingSphereTable beBoChangedTable) {
+ ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
if (!containsMutableDataNodeRule(database,
beBoChangedTable.getName())) {
database.reloadRules(MutableDataNodeRule.class);
}
database.getSchema(schemaName).putTable(beBoChangedTable.getName(),
beBoChangedTable);
}
+ private synchronized void alterView(final String databaseName, final
String schemaName, final ShardingSphereView beBoChangedView) {
+ ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
+ if (!containsMutableDataNodeRule(database, beBoChangedView.getName()))
{
+ database.reloadRules(MutableDataNodeRule.class);
+ }
+ database.getSchema(schemaName).putView(beBoChangedView.getName(),
beBoChangedView);
+ }
+
private boolean containsMutableDataNodeRule(final ShardingSphereDatabase
database, final String tableName) {
return
database.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
.filter(each -> !(each instanceof
MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
- 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).removeTable(toBeDeletedTableName);
-
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules().stream().filter(each
-> each instanceof MutableDataNodeRule)
- .findFirst().ifPresent(optional -> ((MutableDataNodeRule)
optional).remove(schemaName, toBeDeletedTableName));
- }
- }
-
/**
* Drop schema.
*
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNode.java
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNode.java
index ebd622163b4..d78278066b4 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNode.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNode.java
@@ -218,6 +218,18 @@ public final class DatabaseMetaDataNode {
return matcher.find() ? Optional.of(matcher.group(4)) :
Optional.empty();
}
+ /**
+ * Get view meta data path.
+ *
+ * @param viewMetaDataPath view meta data path
+ * @return view name
+ */
+ public static Optional<String> getViewName(final String viewMetaDataPath) {
+ Pattern pattern = Pattern.compile(getMetaDataNodePath() +
"/([\\w\\-]+)/([\\w\\-]+)/([\\w\\-]+)/views" + "/([\\w\\-]+)$",
Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(viewMetaDataPath);
+ return matcher.find() ? Optional.of(matcher.group(4)) :
Optional.empty();
+ }
+
/**
* Get active version path.
*
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/schema/TableMetaDataPersistService.java
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/schema/TableMetaDataPersistService.java
index f4335fa3544..53a154d591a 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/schema/TableMetaDataPersistService.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/schema/TableMetaDataPersistService.java
@@ -51,7 +51,6 @@ public final class TableMetaDataPersistService implements
SchemaMetaDataPersistS
public void persist(final String databaseName, final String schemaName,
final Map<String, ShardingSphereTable> tables) {
tables.forEach((key, value) ->
repository.persist(DatabaseMetaDataNode.getTableMetaDataPath(databaseName,
schemaName, key.toLowerCase()),
YamlEngine.marshal(new
YamlTableSwapper().swapToYamlConfiguration(value))));
-
}
@Override
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 872f1aa4c43..c29c74326a6 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -32,6 +32,7 @@ import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereColumn;
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.metadata.database.schema.decorator.model.ShardingSphereView;
import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -81,6 +82,7 @@ public final class ContextManagerTest {
ShardingSphereDatabase database = mockDatabase();
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
+
when(metaDataContexts.getMetaData().getDatabase("foo_db").containsSchema("foo_schema")).thenReturn(true);
contextManager = new ContextManager(metaDataContexts,
mock(InstanceContext.class));
}
@@ -157,25 +159,44 @@ public final class ContextManagerTest {
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
ShardingSphereColumn toBeChangedColumn = new
ShardingSphereColumn("foo_col", Types.VARCHAR, false, false, false, true);
ShardingSphereTable toBeChangedTable = new
ShardingSphereTable("foo_tbl", Collections.singleton(toBeChangedColumn),
Collections.emptyList(), Collections.emptyList());
- contextManager.alterSchema("foo_db", "foo_schema", toBeChangedTable);
+ contextManager.alterSchema("foo_db", "foo_schema", toBeChangedTable,
null);
ShardingSphereTable table =
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().get("foo_tbl");
assertThat(table.getColumns().size(), is(1));
assertTrue(table.getColumns().containsKey("foo_col"));
}
+ @Test
+ public void assertAlterSchemaForViewAltered() {
+ ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
toBeAlteredSchema));
+
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+ ShardingSphereView toBeChangedView = new
ShardingSphereView("foo_view", "select `foo_view`.`foo_view`.`id` AS `id` from
`foo_view`.`foo_view`");
+ contextManager.alterSchema("foo_db", "foo_schema", null,
toBeChangedView);
+ ShardingSphereView view =
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getView("foo_view");
+ assertThat(view.getName(), is("foo_view"));
+ assertThat(view.getViewDefinition(), is("select
`foo_view`.`foo_view`.`id` AS `id` from `foo_view`.`foo_view`"));
+ }
+
@Test
public void assertAlterSchemaForTableDropped() {
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
createToBeAlteredSchema()));
- contextManager.alterSchema("foo_db", "foo_schema", "foo_tbl");
+ contextManager.alterSchema("foo_db", "foo_schema", "foo_tbl", null);
assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().containsKey("foo_tbl"));
}
+ @Test
+ public void assertAlterSchemaForViewDropped() {
+
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
createToBeAlteredSchema()));
+ contextManager.alterSchema("foo_db", "foo_schema", "foo_view", null);
+
assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getViews().containsKey("foo_view"));
+ }
+
private ShardingSphereSchema createToBeAlteredSchema() {
ShardingSphereTable beforeChangedTable = new
ShardingSphereTable("foo_tbl", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
- return new ShardingSphereSchema(Collections.singletonMap("foo_tbl",
beforeChangedTable), Collections.emptyMap());
+ ShardingSphereView beforeChangedView = new
ShardingSphereView("foo_tbl", "");
+ return new ShardingSphereSchema(Collections.singletonMap("foo_tbl",
beforeChangedTable), Collections.singletonMap("foo_view", beforeChangedView));
}
- // TODO fix me
@Ignore
@Test
public void assertUpdateResources() throws SQLException {
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNodeTest.java
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNodeTest.java
index 9c12bb332cd..5d7c3f57b15 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNodeTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/node/DatabaseMetaDataNodeTest.java
@@ -76,6 +76,13 @@ public class DatabaseMetaDataNodeTest {
assertThat(actualTableName.get(), is("t_order"));
}
+ @Test
+ public void assertGetViewName() {
+ Optional<String> actualViewName =
DatabaseMetaDataNode.getViewName("/metadata/logic_db/schemas/logic_schema/views/foo_view");
+ assertTrue(actualViewName.isPresent());
+ assertThat(actualViewName.get(), is("foo_view"));
+ }
+
@Test
public void assertGetSchemaName() {
Optional<String> actualSchemaName =
DatabaseMetaDataNode.getSchemaName("/metadata/logic_db/schemas/logic_schema");
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
index 39b53befad5..647fde5cce2 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
@@ -33,7 +33,8 @@ import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.confi
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.props.PropertiesChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.GlobalRuleConfigurationsChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.RuleConfigurationsChangedEvent;
-import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.SchemaChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.TableMetaDataChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.ViewMetaDataChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.version.DatabaseVersionChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseAddedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseDeletedEvent;
@@ -128,14 +129,25 @@ public final class ClusterContextManagerCoordinator {
}
/**
- * Renew meta data of the schema.
+ * Renew meta data of the table.
*
- * @param event meta data changed event
+ * @param event table meta data changed event
*/
@Subscribe
- public synchronized void renew(final SchemaChangedEvent event) {
- contextManager.alterSchema(event.getDatabaseName(),
event.getSchemaName(), event.getChangedTableMetaData());
- contextManager.alterSchema(event.getDatabaseName(),
event.getSchemaName(), event.getDeletedTable());
+ public synchronized void renew(final TableMetaDataChangedEvent event) {
+ contextManager.alterSchema(event.getDatabaseName(),
event.getSchemaName(), event.getChangedTableMetaData(), null);
+ contextManager.alterSchema(event.getDatabaseName(),
event.getSchemaName(), event.getDeletedTable(), null);
+ }
+
+ /**
+ * Renew meta data of the view.
+ *
+ * @param event view meta data changed event
+ */
+ @Subscribe
+ public synchronized void renew(final ViewMetaDataChangedEvent event) {
+ contextManager.alterSchema(event.getDatabaseName(),
event.getSchemaName(), null, event.getChangedViewMetaData());
+ contextManager.alterSchema(event.getDatabaseName(),
event.getSchemaName(), null, event.getDeletedView());
}
/**
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/SchemaChangedEvent.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/TableMetaDataChangedEvent.java
similarity index 92%
copy from
shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/SchemaChangedEvent.java
copy to
shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/TableMetaDataChangedEvent.java
index b99f7f56589..2bf92118ab4 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/SchemaChangedEvent.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/TableMetaDataChangedEvent.java
@@ -23,11 +23,11 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.GovernanceEvent;
/**
- * Schema changed event.
+ * Table meta data changed event.
*/
@RequiredArgsConstructor
@Getter
-public final class SchemaChangedEvent implements GovernanceEvent {
+public final class TableMetaDataChangedEvent implements GovernanceEvent {
private final String databaseName;
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/SchemaChangedEvent.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/ViewMetaDataChangedEvent.java
similarity index 84%
rename from
shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/SchemaChangedEvent.java
rename to
shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/ViewMetaDataChangedEvent.java
index b99f7f56589..11e3d10f6c0 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/SchemaChangedEvent.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/event/schema/ViewMetaDataChangedEvent.java
@@ -19,21 +19,21 @@ package
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.conf
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereView;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.GovernanceEvent;
/**
- * Schema changed event.
+ * View meta data changed event.
*/
@RequiredArgsConstructor
@Getter
-public final class SchemaChangedEvent implements GovernanceEvent {
+public final class ViewMetaDataChangedEvent implements GovernanceEvent {
private final String databaseName;
private final String schemaName;
- private final ShardingSphereTable changedTableMetaData;
+ private final ShardingSphereView changedViewMetaData;
- private final String deletedTable;
+ private final String deletedView;
}
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySu
[...]
index 130d0eec7f0..1cdaff8b41e 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
@@ -18,7 +18,9 @@
package
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber;
import com.google.common.eventbus.Subscribe;
+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.metadata.database.schema.decorator.model.ShardingSphereView;
import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import
org.apache.shardingsphere.infra.metadata.database.schema.event.AddSchemaEvent;
import
org.apache.shardingsphere.infra.metadata.database.schema.event.AlterSchemaEvent;
@@ -51,9 +53,13 @@ public final class SchemaMetaDataRegistrySubscriber {
*/
@Subscribe
public void update(final SchemaAlteredEvent event) {
+ String databaseName = event.getDatabaseName();
+ String schemaName = event.getSchemaName();
Map<String, ShardingSphereTable> tables =
event.getAlteredTables().stream().collect(Collectors.toMap(ShardingSphereTable::getName,
table -> table));
-
persistService.getTableMetaDataPersistService().persist(event.getDatabaseName(),
event.getSchemaName(), tables);
- event.getDroppedTables().forEach(each ->
persistService.getTableMetaDataPersistService().delete(event.getDatabaseName(),
event.getSchemaName(), each));
+ Map<String, ShardingSphereView> views =
event.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName,
table -> table));
+ persistService.persist(databaseName, schemaName, new
ShardingSphereSchema(tables, views));
+ event.getDroppedTables().forEach(each ->
persistService.getTableMetaDataPersistService().delete(databaseName,
schemaName, each));
+ event.getDroppedViews().forEach(each ->
persistService.getViewMetaDataPersistService().delete(databaseName, schemaName,
each));
}
/**
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
index 82e02b7f8cd..a1ddc6fba74 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
@@ -27,12 +27,15 @@ import
org.apache.shardingsphere.infra.yaml.config.swapper.resource.YamlDataSour
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
import
org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable;
+import org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereView;
import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlTableSwapper;
+import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlViewSwapper;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.GovernanceEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.GovernanceWatcher;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.datasource.DataSourceChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.RuleConfigurationsChangedEvent;
-import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.SchemaChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.TableMetaDataChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.ViewMetaDataChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.version.DatabaseVersionChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseAddedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseDeletedEvent;
@@ -71,36 +74,36 @@ public final class MetaDataChangedWatcher implements
GovernanceWatcher<Governanc
@Override
public Optional<GovernanceEvent> createGovernanceEvent(final
DataChangedEvent event) {
- // TODO Maybe can reduce once regular
- if (isLogicDatabaseChanged(event)) {
- return createLogicDatabaseChangedEvent(event);
+ if (databaseChanged(event)) {
+ return createDatabaseChangedEvent(event);
}
- if (isLogicSchemaChanged(event)) {
- return createLogicSchemaChangedEvent(event);
- }
- if (isTableMetaDataChanged(event)) {
+ if (schemaChanged(event)) {
return createSchemaChangedEvent(event);
}
+ if (schemaMetaDataChanged(event)) {
+ return createSchemaMetaDataChangedEvent(event);
+ }
return createRuleAndDataSourceChangedEvent(event);
}
- private boolean isLogicDatabaseChanged(final DataChangedEvent event) {
+ private boolean databaseChanged(final DataChangedEvent event) {
return
DatabaseMetaDataNode.getDatabaseName(event.getKey()).isPresent();
}
- private boolean isLogicSchemaChanged(final DataChangedEvent event) {
+ private boolean schemaChanged(final DataChangedEvent event) {
return
DatabaseMetaDataNode.getDatabaseNameByDatabasePath(event.getKey()).isPresent()
&& DatabaseMetaDataNode.getSchemaName(event.getKey()).isPresent();
}
- private boolean isTableMetaDataChanged(final DataChangedEvent event) {
+ private boolean schemaMetaDataChanged(final DataChangedEvent event) {
Optional<String> databaseName =
DatabaseMetaDataNode.getDatabaseNameByDatabasePath(event.getKey());
Optional<String> schemaName =
DatabaseMetaDataNode.getSchemaNameBySchemaPath(event.getKey());
Optional<String> tableName =
DatabaseMetaDataNode.getTableName(event.getKey());
- return databaseName.isPresent() && tableName.isPresent() &&
schemaName.isPresent()
- && !SystemSchemaBuilderRule.isSystemTable(databaseName.get(),
tableName.get()) && !Strings.isNullOrEmpty(event.getValue());
+ Optional<String> viewName =
DatabaseMetaDataNode.getViewName(event.getKey());
+ return databaseName.isPresent() && schemaName.isPresent() &&
!Strings.isNullOrEmpty(event.getValue())
+ && ((tableName.isPresent() &&
!SystemSchemaBuilderRule.isSystemTable(databaseName.get(), tableName.get()) ||
viewName.isPresent()));
}
- private Optional<GovernanceEvent> createLogicDatabaseChangedEvent(final
DataChangedEvent event) {
+ private Optional<GovernanceEvent> createDatabaseChangedEvent(final
DataChangedEvent event) {
Optional<String> databaseName =
DatabaseMetaDataNode.getDatabaseName(event.getKey());
Preconditions.checkState(databaseName.isPresent());
if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
@@ -112,7 +115,7 @@ public final class MetaDataChangedWatcher implements
GovernanceWatcher<Governanc
return Optional.empty();
}
- private Optional<GovernanceEvent> createLogicSchemaChangedEvent(final
DataChangedEvent event) {
+ private Optional<GovernanceEvent> createSchemaChangedEvent(final
DataChangedEvent event) {
Optional<String> databaseName =
DatabaseMetaDataNode.getDatabaseNameByDatabasePath(event.getKey());
Preconditions.checkState(databaseName.isPresent());
Optional<String> schemaName =
DatabaseMetaDataNode.getSchemaName(event.getKey());
@@ -161,19 +164,26 @@ public final class MetaDataChangedWatcher implements
GovernanceWatcher<Governanc
return new
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(rules);
}
- private Optional<GovernanceEvent> createSchemaChangedEvent(final
DataChangedEvent event) {
+ private Optional<GovernanceEvent> createSchemaMetaDataChangedEvent(final
DataChangedEvent event) {
Optional<String> databaseName =
DatabaseMetaDataNode.getDatabaseNameByDatabasePath(event.getKey());
Preconditions.checkState(databaseName.isPresent());
Optional<String> schemaName =
DatabaseMetaDataNode.getSchemaNameBySchemaPath(event.getKey());
Preconditions.checkState(schemaName.isPresent());
- Optional<String> tableName =
DatabaseMetaDataNode.getTableName(event.getKey());
- Preconditions.checkState(tableName.isPresent());
- return Optional.of(createSchemaChangedEvent(event, databaseName.get(),
schemaName.get(), tableName.get()));
+ return Optional.of(createSchemaMetaDataChangedEvent(event,
databaseName.get(), schemaName.get()));
}
- private SchemaChangedEvent createSchemaChangedEvent(final DataChangedEvent
event, final String databaseName, final String schemaName, final String
tableName) {
- return Type.DELETED == event.getType()
- ? new SchemaChangedEvent(databaseName, schemaName, null,
tableName)
- : new SchemaChangedEvent(databaseName, schemaName, new
YamlTableSwapper().swapToObject(YamlEngine.unmarshal(event.getValue(),
YamlShardingSphereTable.class)), null);
+ private GovernanceEvent createSchemaMetaDataChangedEvent(final
DataChangedEvent event, final String databaseName, final String schemaName) {
+ Optional<String> tableName =
DatabaseMetaDataNode.getTableName(event.getKey());
+ Optional<String> viewName =
DatabaseMetaDataNode.getViewName(event.getKey());
+ Preconditions.checkState(tableName.isPresent() ||
viewName.isPresent());
+ if (tableName.isPresent()) {
+ return Type.DELETED == event.getType()
+ ? new TableMetaDataChangedEvent(databaseName, schemaName,
null, tableName.get())
+ : new TableMetaDataChangedEvent(databaseName, schemaName,
new YamlTableSwapper().swapToObject(YamlEngine.unmarshal(event.getValue(),
YamlShardingSphereTable.class)), null);
+ } else {
+ return Type.DELETED == event.getType()
+ ? new ViewMetaDataChangedEvent(databaseName, schemaName,
null, viewName.get())
+ : new ViewMetaDataChangedEvent(databaseName, schemaName,
new YamlViewSwapper().swapToObject(YamlEngine.unmarshal(event.getValue(),
YamlShardingSphereView.class)), null);
+ }
}
}
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
index df01975c962..e0e242ddd16 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
@@ -38,6 +38,7 @@ import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
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.metadata.database.schema.decorator.model.ShardingSphereView;
import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
@@ -52,7 +53,8 @@ import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.confi
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.props.PropertiesChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.GlobalRuleConfigurationsChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.RuleConfigurationsChangedEvent;
-import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.SchemaChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.TableMetaDataChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.ViewMetaDataChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.version.DatabaseVersionChangedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseAddedEvent;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseDeletedEvent;
@@ -193,14 +195,23 @@ public final class ClusterContextManagerCoordinatorTest {
}
@Test
- public void assertRenewForSchemaChanged() {
+ public void assertRenewForTableMetaDataChangedChanged() {
+
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("db").containsSchema("db")).thenReturn(true);
ShardingSphereTable changedTableMetaData = new
ShardingSphereTable("t_order", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
- SchemaChangedEvent event = new SchemaChangedEvent("db", "db",
changedTableMetaData, null);
+ TableMetaDataChangedEvent event = new TableMetaDataChangedEvent("db",
"db", changedTableMetaData, null);
coordinator.renew(event);
- //
assertTrue(contextManager.getMetaDataContexts().getMetaData().containsKey("db"));
verify(contextManager.getMetaDataContexts().getMetaData().getDatabase("db").getSchema("db")).putTable("t_order",
event.getChangedTableMetaData());
}
+ @Test
+ public void assertRenewForViewMetaDataChanged() {
+
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("db").containsSchema("db")).thenReturn(true);
+ ShardingSphereView changedViewMetaData = new
ShardingSphereView("t_order_view", "");
+ ViewMetaDataChangedEvent event = new ViewMetaDataChangedEvent("db",
"db", changedViewMetaData, null);
+ coordinator.renew(event);
+
verify(contextManager.getMetaDataContexts().getMetaData().getDatabase("db").getSchema("db")).putView("t_order_view",
event.getChangedViewMetaData());
+ }
+
@Test
public void assertRenewForRuleConfigurationsChanged() {
when(persistService.getMetaDataVersionPersistService().isActiveVersion("db",
"0")).thenReturn(true);
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/watcher/GlobalRuleChangedWatcherTest.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/watcher/GlobalRuleChangedWatcherTest.java
index 0a5bc18b998..d8269b3ddd5 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/watcher/GlobalRuleChangedWatcherTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/config/watcher/GlobalRuleChangedWatcherTest.java
@@ -38,13 +38,13 @@ public final class GlobalRuleChangedWatcherTest {
@Test
public void assertCreateEvent() {
- Optional<GlobalRuleConfigurationsChangedEvent> event = new
GlobalRuleChangedWatcher().createGovernanceEvent(new DataChangedEvent("/rules",
readYAML("yaml/authority-rule.yaml"), Type.UPDATED));
+ Optional<GlobalRuleConfigurationsChangedEvent> event = new
GlobalRuleChangedWatcher().createGovernanceEvent(new DataChangedEvent("/rules",
readYAML(), Type.UPDATED));
assertTrue(event.isPresent());
assertThat(event.get(),
instanceOf(GlobalRuleConfigurationsChangedEvent.class));
}
@SneakyThrows({IOException.class, URISyntaxException.class})
- protected String readYAML(final String yamlFile) {
- return
Files.readAllLines(Paths.get(ClassLoader.getSystemResource(yamlFile).toURI())).stream().map(each
-> each + System.lineSeparator()).collect(Collectors.joining());
+ protected String readYAML() {
+ return
Files.readAllLines(Paths.get(ClassLoader.getSystemResource("yaml/authority-rule.yaml").toURI())).stream().map(each
-> each + System.lineSeparator()).collect(Collectors.joining());
}
}
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegist
[...]
index dd1bb0569d4..b4b529a971d 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java
@@ -37,10 +37,10 @@ import java.lang.reflect.Field;
import java.util.Collections;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.anyMap;
@RunWith(MockitoJUnitRunner.class)
public final class SchemaMetaDataRegistrySubscriberTest {
@@ -66,9 +66,8 @@ public final class SchemaMetaDataRegistrySubscriberTest {
event.getDroppedTables().add("foo_table");
when(persistService.getTableMetaDataPersistService()).thenReturn(mock(TableMetaDataPersistService.class));
schemaMetaDataRegistrySubscriber.update(event);
- TableMetaDataPersistService tableMetaDataPersistService =
persistService.getTableMetaDataPersistService();
- verify(tableMetaDataPersistService).persist(anyString(), anyString(),
anyMap());
- verify(tableMetaDataPersistService).delete("foo_db", "foo_schema",
"foo_table");
+ verify(persistService).persist(anyString(), anyString(), any());
+
verify(persistService.getTableMetaDataPersistService()).delete("foo_db",
"foo_schema", "foo_table");
}
@Test
diff --git
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcherTest.java
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcherTest.java
index 3fda06df10f..fe6cd003dfa 100644
---
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcherTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcherTest.java
@@ -18,7 +18,7 @@
package
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.watcher;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.GovernanceEvent;
-import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.SchemaChangedEvent;
+import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.schema.TableMetaDataChangedEvent;
import
org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEvent;
import
org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEvent.Type;
import org.junit.Test;
@@ -66,7 +66,7 @@ public final class MetaDataChangedWatcherTest {
}
@Test
- public void assertCreateDeletedEvent() {
+ public void assertCreateDatabaseDeletedEvent() {
String key = "/metadata/sharding_db";
String value = "encrypt_db";
Optional<GovernanceEvent> actual = createEvent(key, value,
Type.DELETED);
@@ -115,7 +115,21 @@ public final class MetaDataChangedWatcherTest {
String key =
"/metadata/sharding_db/schemas/sharding_schema/tables/t_order";
Optional<GovernanceEvent> actual = createEvent(key, "{}",
Type.DELETED);
assertTrue(actual.isPresent());
- assertThat(((SchemaChangedEvent) actual.get()).getDeletedTable(),
is("t_order"));
+ assertThat(((TableMetaDataChangedEvent)
actual.get()).getDeletedTable(), is("t_order"));
+ }
+
+ @Test
+ public void assertCreateViewMetaDataChangedEvent() {
+ String key =
"/metadata/sharding_db/schemas/sharding_schema/views/foo_view";
+ Optional<GovernanceEvent> actual = createEvent(key, "{}",
Type.UPDATED);
+ assertTrue(actual.isPresent());
+ }
+
+ @Test
+ public void assertCreateViewMetaDataDeletedEvent() {
+ String key =
"/metadata/sharding_db/schemas/sharding_schema/views/foo_view";
+ Optional<GovernanceEvent> actual = createEvent(key, "{}",
Type.DELETED);
+ assertTrue(actual.isPresent());
}
private Optional<GovernanceEvent> createEvent(final String key, final
String value, final Type type) {