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) {

Reply via email to