This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 1bfc00f0100 Add NewViewMetaDataPersistService and
NewTableMetaDataPersistService (#26376)
1bfc00f0100 is described below
commit 1bfc00f01005e59f66268165def72cf08080c2e9
Author: zhaojinchao <[email protected]>
AuthorDate: Thu Jun 15 23:39:01 2023 +0800
Add NewViewMetaDataPersistService and NewTableMetaDataPersistService
(#26376)
* Add NewViewMetaDataPersistService and NewTableMetaDataPersistService
* Add unit test
* Fix ci
---
.../update/AlterMaskRuleStatementUpdater.java | 2 +-
.../update/DropMaskRuleStatementUpdater.java | 2 +-
.../persist/node/NewDatabaseMetaDataNode.java | 178 ++++++++++++++++-----
.../metadata/persist/node/NewGlobalNode.java | 14 +-
.../config/global/NewGlobalRulePersistService.java | 7 +-
.../schema/NewTableMetaDataPersistService.java | 84 ++++++++++
.../schema/NewViewMetaDataPersistService.java | 84 ++++++++++
.../persist/node/NewDatabaseMetaDataNodeTest.java | 53 +++++-
.../metadata/persist/node/NewGlobalNodeTest.java | 6 +-
.../watcher/NewMetaDataChangedWatcher.java | 4 +-
10 files changed, 383 insertions(+), 51 deletions(-)
diff --git
a/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleStatementUpdater.java
b/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleStatementUpdater.java
index 5022fdd6da2..de63d2ceae5 100644
---
a/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleStatementUpdater.java
+++
b/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleStatementUpdater.java
@@ -65,7 +65,7 @@ public final class AlterMaskRuleStatementUpdater implements
RuleDefinitionAlterU
public MaskRuleConfiguration buildToBeAlteredRuleConfiguration(final
AlterMaskRuleStatement sqlStatement) {
return MaskRuleStatementConverter.convert(sqlStatement.getRules());
}
-
+
@Override
public MaskRuleConfiguration buildToBeDroppedRuleConfiguration(final
MaskRuleConfiguration currentRuleConfig, final MaskRuleConfiguration
toBeAlteredRuleConfig) {
Collection<String> toBeAlteredTableNames =
toBeAlteredRuleConfig.getTables().stream().map(MaskTableRuleConfiguration::getName).collect(Collectors.toList());
diff --git
a/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleStatementUpdater.java
b/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleStatementUpdater.java
index 851a581d495..bf51369c941 100644
---
a/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleStatementUpdater.java
+++
b/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleStatementUpdater.java
@@ -60,7 +60,7 @@ public final class DropMaskRuleStatementUpdater implements
RuleDefinitionDropUpd
return null != currentRuleConfig
&&
!getIdenticalData(currentRuleConfig.getTables().stream().map(MaskTableRuleConfiguration::getName).collect(Collectors.toSet()),
sqlStatement.getTables()).isEmpty();
}
-
+
@Override
public MaskRuleConfiguration buildToBeDroppedRuleConfiguration(final
MaskRuleConfiguration currentRuleConfig, final DropMaskRuleStatement
sqlStatement) {
Collection<MaskTableRuleConfiguration> toBeDroppedTables = new
LinkedList<>();
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
index 9d52699a780..0bc06538d89 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
@@ -37,45 +37,15 @@ public final class NewDatabaseMetaDataNode {
private static final String RULE_NODE = "rules";
- private static final String ACTIVE_VERSION = "active_version";
+ private static final String SCHEMAS_NODE = "schemas";
- private static final String VERSIONS = "versions";
+ private static final String TABLES_NODE = "tables";
- /**
- * Is data sources node.
- *
- * @param path path
- * @return true or false
- */
- public static boolean isDataSourcesNode(final String path) {
- Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/" + DATA_SOURCES_NODE + "/?", Pattern.CASE_INSENSITIVE);
- Matcher matcher = pattern.matcher(path);
- return matcher.find();
- }
+ private static final String VIEWS_NODE = "views";
- /**
- * Get data source name by data source node.
- *
- * @param path path
- * @return data source name
- */
- public static Optional<String> getDataSourceNameByDataSourceNode(final
String path) {
- Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/" + DATA_SOURCES_NODE + "/([\\w\\-]+)?",
Pattern.CASE_INSENSITIVE);
- Matcher matcher = pattern.matcher(path);
- return matcher.find() ? Optional.of(matcher.group(2)) :
Optional.empty();
- }
+ private static final String ACTIVE_VERSION = "active_version";
- /**
- * Get version by data source node.
- *
- * @param path path
- * @return data source version
- */
- public static Optional<String> getVersionByDataSourceNode(final String
path) {
- Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/" + DATA_SOURCES_NODE + "/([\\w\\-]+)/versions/([\\w\\-]+)$",
Pattern.CASE_INSENSITIVE);
- Matcher matcher = pattern.matcher(path);
- return matcher.find() ? Optional.of(matcher.group(3)) :
Optional.empty();
- }
+ private static final String VERSIONS = "versions";
/**
* Get data Sources node.
@@ -184,6 +154,140 @@ public final class NewDatabaseMetaDataNode {
return String.join("/", getMetaDataNodeNode(), databaseName,
RULE_NODE);
}
+ /**
+ * Get table active version node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @return tables active version node
+ */
+ public static String getTableActiveVersionNode(final String databaseName,
final String schemaName, final String tableName) {
+ return String.join("/", getTableNode(databaseName, schemaName,
tableName), ACTIVE_VERSION);
+ }
+
+ /**
+ * Get table versions node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @return tables versions node
+ */
+ public static String getTableVersionsNode(final String databaseName, final
String schemaName, final String tableName) {
+ return String.join("/", getTableNode(databaseName, schemaName,
tableName), VERSIONS);
+ }
+
+ /**
+ * Get table version node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @param version version
+ * @return table version node
+ */
+ public static String getTableVersionNode(final String databaseName, final
String schemaName, final String tableName, final String version) {
+ return String.join("/", getTableVersionsNode(databaseName, schemaName,
tableName), version);
+ }
+
+ /**
+ * Get table node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @return table node
+ */
+ public static String getTableNode(final String databaseName, final String
schemaName, final String tableName) {
+ return String.join("/", getMetaDataNodeNode(), databaseName,
SCHEMAS_NODE, schemaName, TABLES_NODE, tableName);
+ }
+
+ /**
+ * Get view name active version node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param viewName view name
+ * @return view active version node
+ */
+ public static String getViewActiveVersionNode(final String databaseName,
final String schemaName, final String viewName) {
+ return String.join("/", getViewNode(databaseName, schemaName,
viewName), ACTIVE_VERSION);
+ }
+
+ /**
+ * Get view versions node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param viewName view name
+ * @return view versions node
+ */
+ public static String getViewVersionsNode(final String databaseName, final
String schemaName, final String viewName) {
+ return String.join("/", getViewNode(databaseName, schemaName,
viewName), VERSIONS);
+ }
+
+ /**
+ * Get view version node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param viewName view name
+ * @param version version
+ * @return view version node
+ */
+ public static String getViewVersionNode(final String databaseName, final
String schemaName, final String viewName, final String version) {
+ return String.join("/", getViewVersionsNode(databaseName, schemaName,
viewName), version);
+ }
+
+ /**
+ * Get view node.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param viewName view name
+ * @return tables path
+ */
+ public static String getViewNode(final String databaseName, final String
schemaName, final String viewName) {
+ return String.join("/", getMetaDataNodeNode(), databaseName,
SCHEMAS_NODE, schemaName, VIEWS_NODE, viewName);
+ }
+
+ /**
+ * Is data sources node.
+ *
+ * @param path path
+ * @return true or false
+ */
+ public static boolean isDataSourcesNode(final String path) {
+ Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/" + DATA_SOURCES_NODE + "/?", Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(path);
+ return matcher.find();
+ }
+
+ /**
+ * Get data source name by data source node.
+ *
+ * @param path path
+ * @return data source name
+ */
+ public static Optional<String> getDataSourceNameByDataSourceNode(final
String path) {
+ Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/" + DATA_SOURCES_NODE + "/([\\w\\-]+)?",
Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(path);
+ return matcher.find() ? Optional.of(matcher.group(2)) :
Optional.empty();
+ }
+
+ /**
+ * Get version by data source node.
+ *
+ * @param path path
+ * @return data source version
+ */
+ public static Optional<String> getVersionByDataSourceNode(final String
path) {
+ Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/" + DATA_SOURCES_NODE + "/([\\w\\-]+)/versions/([\\w\\-]+)$",
Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(path);
+ return matcher.find() ? Optional.of(matcher.group(3)) :
Optional.empty();
+ }
+
/**
* Get database name.
*
@@ -202,7 +306,7 @@ public final class NewDatabaseMetaDataNode {
* @param schemaPath database path
* @return database name
*/
- public static Optional<String> getDatabaseNameBySchemaPath(final String
schemaPath) {
+ public static Optional<String> getDatabaseNameBySchemaNode(final String
schemaPath) {
Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)?", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(schemaPath);
return matcher.find() ? Optional.of(matcher.group(1)) :
Optional.empty();
@@ -226,7 +330,7 @@ public final class NewDatabaseMetaDataNode {
* @param tablePath table path
* @return schema name
*/
- public static Optional<String> getSchemaNameByTablePath(final String
tablePath) {
+ public static Optional<String> getSchemaNameByTableNode(final String
tablePath) {
Pattern pattern = Pattern.compile(getMetaDataNodeNode() +
"/([\\w\\-]+)/schemas/([\\w\\-]+)?", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(tablePath);
return matcher.find() ? Optional.of(matcher.group(2)) :
Optional.empty();
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java
index 321e07d7b66..7cd837e29f9 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java
@@ -42,7 +42,17 @@ public final class NewGlobalNode {
* @return global rule active version node
*/
public static String getGlobalRuleActiveVersionNode(final String rulePath)
{
- return String.join("/", rulePath, ACTIVE_VERSION);
+ return String.join("/", getGlobalRuleRootNode(), rulePath,
ACTIVE_VERSION);
+ }
+
+ /**
+ * Get global rule versions node.
+ *
+ * @param ruleName rule name
+ * @return global rule versions node
+ */
+ public static String getGlobalRuleVersionsNode(final String ruleName) {
+ return String.join("/", getGlobalRuleRootNode(), ruleName, VERSIONS);
}
/**
@@ -53,7 +63,7 @@ public final class NewGlobalNode {
* @return global rule version node
*/
public static String getGlobalRuleVersionNode(final String ruleName, final
String version) {
- return String.join("/", getGlobalRuleRootNode(), ruleName, VERSIONS,
version);
+ return String.join("/", getGlobalRuleVersionsNode(ruleName), version);
}
/**
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
index 074fd9b040c..7ab55c8afa3 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
@@ -32,6 +32,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
import java.util.Map;
+import java.util.List;
import java.util.Map.Entry;
/**
@@ -67,7 +68,10 @@ public final class NewGlobalRulePersistService extends
AbstractPersistService im
if
(Strings.isNullOrEmpty(NewGlobalNode.getGlobalRuleActiveVersionNode(each.getKey())))
{
repository.persist(NewGlobalNode.getGlobalRuleActiveVersionNode(each.getKey()),
DEFAULT_VERSION);
}
-
repository.persist(NewGlobalNode.getGlobalRuleVersionNode(each.getKey(),
DEFAULT_VERSION), each.getValue());
+ List<String> versions =
repository.getChildrenKeys(NewGlobalNode.getGlobalRuleVersionsNode(each.getKey()));
+
repository.persist(NewGlobalNode.getGlobalRuleVersionNode(each.getKey(),
versions.isEmpty()
+ ? DEFAULT_VERSION
+ : String.valueOf(Integer.parseInt(versions.get(0)) + 1)),
each.getValue());
}
}
@@ -79,6 +83,7 @@ public final class NewGlobalRulePersistService extends
AbstractPersistService im
}
/**
+ * TODO Avoid load all keys.
* Load all users.
*
* @return collection of user
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
new file mode 100644
index 00000000000..5d0ed10ee40
--- /dev/null
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist.service.schema;
+
+import com.google.common.base.Strings;
+import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import
org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable;
+import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlTableSwapper;
+import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
+import org.apache.shardingsphere.metadata.persist.node.NewDatabaseMetaDataNode;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.Map.Entry;
+
+/**
+ * TODO Rename TableMetaDataPersistService when metadata structure adjustment
completed. #25485
+ * Table meta data persist service.
+ */
+@RequiredArgsConstructor
+public final class NewTableMetaDataPersistService implements
SchemaMetaDataPersistService<Map<String, ShardingSphereTable>> {
+
+ private static final String DEFAULT_VERSION = "0";
+
+ private final PersistRepository repository;
+
+ @Override
+ public void persist(final String databaseName, final String schemaName,
final Map<String, ShardingSphereTable> tables) {
+ for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
+ String tableName = entry.getKey().toLowerCase();
+ if
(Strings.isNullOrEmpty(repository.getDirectly(NewDatabaseMetaDataNode.getTableActiveVersionNode(databaseName,
schemaName, tableName)))) {
+
repository.persist(NewDatabaseMetaDataNode.getTableActiveVersionNode(databaseName,
schemaName, tableName), DEFAULT_VERSION);
+ }
+ List<String> versions =
repository.getChildrenKeys(NewDatabaseMetaDataNode.getTableVersionsNode(databaseName,
schemaName, tableName));
+
repository.persist(NewDatabaseMetaDataNode.getTableVersionNode(databaseName,
schemaName, tableName, versions.isEmpty()
+ ? DEFAULT_VERSION
+ : String.valueOf(Integer.parseInt(versions.get(0)) + 1)),
YamlEngine.marshal(new
YamlTableSwapper().swapToYamlConfiguration(entry.getValue())));
+ }
+ }
+
+ @Override
+ public Map<String, ShardingSphereTable> load(final String databaseName,
final String schemaName) {
+ Collection<String> tableNames =
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataTablesPath(databaseName,
schemaName));
+ return tableNames.isEmpty() ? Collections.emptyMap() :
getTableMetaDataByTableNames(databaseName, schemaName, tableNames);
+ }
+
+ private Map<String, ShardingSphereTable>
getTableMetaDataByTableNames(final String databaseName, final String
schemaName, final Collection<String> tableNames) {
+ Map<String, ShardingSphereTable> result = new
LinkedHashMap<>(tableNames.size(), 1F);
+ tableNames.forEach(each -> {
+ String table =
repository.getDirectly(NewDatabaseMetaDataNode.getTableVersionNode(databaseName,
schemaName, each,
+
repository.getDirectly(NewDatabaseMetaDataNode.getTableActiveVersionNode(databaseName,
schemaName, each))));
+ if (!Strings.isNullOrEmpty(table)) {
+ result.put(each.toLowerCase(), new
YamlTableSwapper().swapToObject(YamlEngine.unmarshal(table,
YamlShardingSphereTable.class)));
+ }
+ });
+ return result;
+ }
+
+ @Override
+ public void delete(final String databaseName, final String schemaName,
final String tableName) {
+ repository.delete(NewDatabaseMetaDataNode.getTableNode(databaseName,
schemaName, tableName.toLowerCase()));
+ }
+}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
new file mode 100644
index 00000000000..b8e5536e3a2
--- /dev/null
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist.service.schema;
+
+import com.google.common.base.Strings;
+import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereView;
+import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlViewSwapper;
+import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
+import org.apache.shardingsphere.metadata.persist.node.NewDatabaseMetaDataNode;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.Map.Entry;
+
+/**
+ * TODO Rename ViewMetaDataPersistService when metadata structure adjustment
completed. #25485
+ * View meta data persist service.
+ */
+@RequiredArgsConstructor
+public final class NewViewMetaDataPersistService implements
SchemaMetaDataPersistService<Map<String, ShardingSphereView>> {
+
+ private static final String DEFAULT_VERSION = "0";
+
+ private final PersistRepository repository;
+
+ @Override
+ public void persist(final String databaseName, final String schemaName,
final Map<String, ShardingSphereView> views) {
+ for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
+ String viewName = entry.getKey().toLowerCase();
+ if
(Strings.isNullOrEmpty(repository.getDirectly(NewDatabaseMetaDataNode.getViewActiveVersionNode(databaseName,
schemaName, viewName)))) {
+
repository.persist(NewDatabaseMetaDataNode.getViewActiveVersionNode(databaseName,
schemaName, viewName), DEFAULT_VERSION);
+ }
+ List<String> versions =
repository.getChildrenKeys(NewDatabaseMetaDataNode.getViewVersionsNode(databaseName,
schemaName, viewName));
+
repository.persist(NewDatabaseMetaDataNode.getViewVersionNode(databaseName,
schemaName, viewName, versions.isEmpty()
+ ? DEFAULT_VERSION
+ : String.valueOf(Integer.parseInt(versions.get(0)) + 1)),
YamlEngine.marshal(new
YamlViewSwapper().swapToYamlConfiguration(entry.getValue())));
+ }
+ }
+
+ @Override
+ public Map<String, ShardingSphereView> load(final String databaseName,
final String schemaName) {
+ Collection<String> viewNames =
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataViewsPath(databaseName,
schemaName));
+ return viewNames.isEmpty() ? Collections.emptyMap() :
getViewMetaDataByViewNames(databaseName, schemaName, viewNames);
+ }
+
+ private Map<String, ShardingSphereView> getViewMetaDataByViewNames(final
String databaseName, final String schemaName, final Collection<String>
viewNames) {
+ Map<String, ShardingSphereView> result = new
LinkedHashMap<>(viewNames.size(), 1F);
+ viewNames.forEach(each -> {
+ String view =
repository.getDirectly(NewDatabaseMetaDataNode.getViewVersionNode(databaseName,
schemaName, each,
+
repository.getDirectly(NewDatabaseMetaDataNode.getViewActiveVersionNode(databaseName,
schemaName, each))));
+ if (!Strings.isNullOrEmpty(view)) {
+ result.put(each.toLowerCase(), new
YamlViewSwapper().swapToObject(YamlEngine.unmarshal(view,
YamlShardingSphereView.class)));
+ }
+ });
+ return result;
+ }
+
+ @Override
+ public void delete(final String databaseName, final String schemaName,
final String viewName) {
+ repository.delete(NewDatabaseMetaDataNode.getViewNode(databaseName,
schemaName, viewName.toLowerCase()));
+ }
+}
diff --git
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
index 3083a532809..33a0352c6ba 100644
---
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
+++
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
@@ -47,6 +47,11 @@ class NewDatabaseMetaDataNodeTest {
assertThat(actual.get(), is("0"));
}
+ @Test
+ void asserGetTableNode() {
+ assertThat(NewDatabaseMetaDataNode.getTableNode("foo_db",
"foo_schema", "foo_table"),
is("/metadata/foo_db/schemas/foo_schema/tables/foo_table"));
+ }
+
@Test
void assertGetDatabaseName() {
Optional<String> actual =
NewDatabaseMetaDataNode.getDatabaseName("/metadata/foo_db");
@@ -55,8 +60,8 @@ class NewDatabaseMetaDataNodeTest {
}
@Test
- void assertGetDatabaseNameBySchemaPath() {
- Optional<String> actual =
NewDatabaseMetaDataNode.getDatabaseNameBySchemaPath("/metadata/foo_db/schemas/foo_schema");
+ void assertGetDatabaseNameBySchemaNode() {
+ Optional<String> actual =
NewDatabaseMetaDataNode.getDatabaseNameBySchemaNode("/metadata/foo_db/schemas/foo_schema");
assertTrue(actual.isPresent());
assertThat(actual.get(), is("foo_db"));
}
@@ -69,8 +74,8 @@ class NewDatabaseMetaDataNodeTest {
}
@Test
- void assertGetSchemaNameByTablePath() {
- Optional<String> actual =
NewDatabaseMetaDataNode.getSchemaNameByTablePath("/metadata/foo_db/schemas/foo_schema/tables");
+ void assertGetSchemaNameByTableNode() {
+ Optional<String> actual =
NewDatabaseMetaDataNode.getSchemaNameByTableNode("/metadata/foo_db/schemas/foo_schema/tables");
assertTrue(actual.isPresent());
assertThat(actual.get(), is("foo_schema"));
}
@@ -123,4 +128,44 @@ class NewDatabaseMetaDataNodeTest {
void assertGetDatabaseRuleVersionNode() {
assertThat(NewDatabaseMetaDataNode.getDatabaseRuleVersionNode("foo_db",
"foo_rule", "foo_tables", "1"),
is("/metadata/foo_db/rules/foo_rule/foo_tables/versions/1"));
}
+
+ @Test
+ void assertGetTableActiveVersionNode() {
+ assertThat(NewDatabaseMetaDataNode.getTableActiveVersionNode("foo_db",
"foo_schema", "foo_table"),
is("/metadata/foo_db/schemas/foo_schema/tables/foo_table/active_version"));
+ }
+
+ @Test
+ void assertGetTableVersionsNode() {
+ assertThat(NewDatabaseMetaDataNode.getTableVersionsNode("foo_db",
"foo_schema", "foo_table"),
is("/metadata/foo_db/schemas/foo_schema/tables/foo_table/versions"));
+ }
+
+ @Test
+ void assertGetTableVersionNode() {
+ assertThat(NewDatabaseMetaDataNode.getTableVersionNode("foo_db",
"foo_schema", "foo_table", "0"),
is("/metadata/foo_db/schemas/foo_schema/tables/foo_table/versions/0"));
+ }
+
+ @Test
+ void assertGetTableNode() {
+ assertThat(NewDatabaseMetaDataNode.getTableNode("foo_db",
"foo_schema", "foo_table"),
is("/metadata/foo_db/schemas/foo_schema/tables/foo_table"));
+ }
+
+ @Test
+ void assertGetViewActiveVersionNode() {
+ assertThat(NewDatabaseMetaDataNode.getViewActiveVersionNode("foo_db",
"foo_schema", "foo_view"),
is("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version"));
+ }
+
+ @Test
+ void assertGetViewVersionsNode() {
+ assertThat(NewDatabaseMetaDataNode.getViewVersionsNode("foo_db",
"foo_schema", "foo_view"),
is("/metadata/foo_db/schemas/foo_schema/views/foo_view/versions"));
+ }
+
+ @Test
+ void assertGetViewVersionNode() {
+ assertThat(NewDatabaseMetaDataNode.getViewVersionNode("foo_db",
"foo_schema", "foo_view", "0"),
is("/metadata/foo_db/schemas/foo_schema/views/foo_view/versions/0"));
+ }
+
+ @Test
+ void assertGetViewNode() {
+ assertThat(NewDatabaseMetaDataNode.getViewNode("foo_db", "foo_schema",
"foo_view"), is("/metadata/foo_db/schemas/foo_schema/views/foo_view"));
+ }
}
diff --git
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java
index 107c4ff36e5..c34837d5b70 100644
---
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java
+++
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java
@@ -42,11 +42,11 @@ class NewGlobalNodeTest {
@Test
void assertGetGlobalRuleActiveVersionNode() {
-
assertThat(NewGlobalNode.getGlobalRuleActiveVersionNode("transaction"),
is("transaction/active_version"));
+
assertThat(NewGlobalNode.getGlobalRuleActiveVersionNode("transaction"),
is("/rules/transaction/active_version"));
}
@Test
- void assertGetGlobalRuleVersionNode() {
- assertThat(NewGlobalNode.getGlobalRuleVersionNode("transaction", "0"),
is("/rules/transaction/versions/0"));
+ void assertGetGlobalRuleVersionsNode() {
+ assertThat(NewGlobalNode.getGlobalRuleVersionsNode("transaction"),
is("/rules/transaction/versions"));
}
}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
index 2c75e0c09f2..b8f363939ff 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
@@ -75,12 +75,12 @@ public final class NewMetaDataChangedWatcher implements
NewGovernanceWatcher<Gov
if (databaseName.isPresent()) {
return createDatabaseChangedEvent(databaseName.get(), event);
}
- databaseName =
NewDatabaseMetaDataNode.getDatabaseNameBySchemaPath(key);
+ databaseName =
NewDatabaseMetaDataNode.getDatabaseNameBySchemaNode(key);
Optional<String> schemaName =
NewDatabaseMetaDataNode.getSchemaName(key);
if (databaseName.isPresent() && schemaName.isPresent()) {
return createSchemaChangedEvent(databaseName.get(),
schemaName.get(), event);
}
- schemaName = NewDatabaseMetaDataNode.getSchemaNameByTablePath(key);
+ schemaName = NewDatabaseMetaDataNode.getSchemaNameByTableNode(key);
Optional<String> tableName = NewDatabaseMetaDataNode.getTableName(key);
if (databaseName.isPresent() && schemaName.isPresent() &&
tableName.isPresent()) {
return createTableChangedEvent(databaseName.get(),
schemaName.get(), tableName.get(), event);