You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2023/05/30 09:09:12 UTC
[shardingsphere] branch master updated: Complete the conversion logic between rule configuration and yaml data nodes of NewDatabaseRulePersistService (#25944)
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 e3174a425e0 Complete the conversion logic between rule configuration and yaml data nodes of NewDatabaseRulePersistService (#25944)
e3174a425e0 is described below
commit e3174a425e059ea65d707f411e9c1a57d5346255
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Tue May 30 17:08:56 2023 +0800
Complete the conversion logic between rule configuration and yaml data nodes of NewDatabaseRulePersistService (#25944)
---
.../NewYamlRuleConfigurationSwapperEngine.java | 26 ++++-----
.../persist/node/NewDatabaseMetaDataNode.java | 64 ++++++++++++++++++++--
...Processor.java => DataSourceNodeConverter.java} | 4 +-
.../database/NewDatabaseRulePersistService.java | 47 ++++++++++------
.../persist/node/NewDatabaseMetaDataNodeTest.java | 47 ++++++++++++++++
5 files changed, 148 insertions(+), 40 deletions(-)
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
index ce3cfbe45ed..188740d7953 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
@@ -19,13 +19,11 @@ package org.apache.shardingsphere.infra.yaml.config.swapper.rule;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
+import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
/**
* TODO Rename YamlRuleConfigurationSwapper when metadata structure adjustment completed. #25485
@@ -47,23 +45,19 @@ public final class NewYamlRuleConfigurationSwapperEngine {
/**
* Swap from YAML rule configurations to rule configurations.
*
- * @param yamlRuleConfigs YAML rule configurations
+ * @param ruleName rule name
+ * @param dataNodes YAML data nodes
* @return rule configurations
*/
- @SuppressWarnings("rawtypes")
- public Collection<RuleConfiguration> swapToRuleConfigurations(final Collection<YamlRuleConfiguration> yamlRuleConfigs) {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public Collection<RuleConfiguration> swapToRuleConfigurations(final String ruleName, final Collection<YamlDataNode> dataNodes) {
Collection<RuleConfiguration> result = new LinkedList<>();
- Collection<Class<?>> ruleConfigTypes = yamlRuleConfigs.stream().map(YamlRuleConfiguration::getRuleConfigurationType).collect(Collectors.toList());
- for (Entry<Class<?>, YamlRuleConfigurationSwapper> entry : OrderedSPILoader.getServicesByClass(YamlRuleConfigurationSwapper.class, ruleConfigTypes).entrySet()) {
- result.addAll(swapToRuleConfigurations(yamlRuleConfigs, entry.getKey(), entry.getValue()));
+ for (NewYamlRuleConfigurationSwapper each : OrderedSPILoader.getServices(NewYamlRuleConfigurationSwapper.class)) {
+ if (!each.getRuleTagName().toLowerCase().equals(ruleName)) {
+ continue;
+ }
+ result.add((RuleConfiguration) each.swapToObject(dataNodes));
}
return result;
}
-
- @SuppressWarnings({"unchecked", "rawtypes"})
- private Collection<RuleConfiguration> swapToRuleConfigurations(final Collection<YamlRuleConfiguration> yamlRuleConfigs,
- final Class<?> ruleConfigType, final YamlRuleConfigurationSwapper swapper) {
- return yamlRuleConfigs.stream()
- .filter(each -> each.getRuleConfigurationType().equals(ruleConfigType)).map(each -> (RuleConfiguration) swapper.swapToObject(each)).collect(Collectors.toList());
- }
}
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 32d2b9ae2f7..c0b3247b3b2 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
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.metadata.persist.node;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.metadata.persist.node.metadata.datasource.DataSourcePathProcessor;
+import org.apache.shardingsphere.metadata.persist.node.metadata.datasource.DataSourceNodeConverter;
// TODO Rename DatabaseMetaDataNode when metadata structure adjustment completed. #25485
/**
@@ -30,6 +30,12 @@ public final class NewDatabaseMetaDataNode {
private static final String ROOT_NODE = "metadata";
+ private static final String RULE_NODE = "rules";
+
+ private static final String ACTIVE_VERSION = "active_version";
+
+ private static final String VERSIONS = "versions";
+
/**
* Get data Sources path.
*
@@ -37,7 +43,7 @@ public final class NewDatabaseMetaDataNode {
* @return data sources path
*/
public static String getDataSourcesPath(final String databaseName) {
- return String.join("/", getMetaDataNodePath(), DataSourcePathProcessor.getDataSourcesPath(databaseName));
+ return String.join("/", getMetaDataNodePath(), DataSourceNodeConverter.getDataSourcesPath(databaseName));
}
/**
@@ -49,7 +55,7 @@ public final class NewDatabaseMetaDataNode {
* @return data source path
*/
public static String getDataSourcePath(final String databaseName, final String dataSourceName, final String version) {
- return String.join("/", getMetaDataNodePath(), DataSourcePathProcessor.getDataSourcePath(databaseName, dataSourceName, version));
+ return String.join("/", getMetaDataNodePath(), DataSourceNodeConverter.getDataSourcePath(databaseName, dataSourceName, version));
}
/**
@@ -60,7 +66,55 @@ public final class NewDatabaseMetaDataNode {
* @return data source active version path
*/
public static String getDataSourceActiveVersionPath(final String databaseName, final String dataSourceName) {
- return String.join("/", getMetaDataNodePath(), DataSourcePathProcessor.getActiveVersionPath(databaseName, dataSourceName));
+ return String.join("/", getMetaDataNodePath(), DataSourceNodeConverter.getActiveVersionPath(databaseName, dataSourceName));
+ }
+
+ /**
+ * Get database rule path.
+ *
+ * @param databaseName database name
+ * @param ruleName rule name
+ * @return database rule path
+ */
+ public static String getDatabaseRulePath(final String databaseName, final String ruleName) {
+ return String.join("/", getMetaDataNodePath(), databaseName, RULE_NODE, ruleName);
+ }
+
+ /**
+ * Get database rule active version path.
+ *
+ * @param databaseName database name
+ * @param ruleName rule name
+ * @param key key
+ * @return database rule active version path
+ */
+ public static String getDatabaseRuleActiveVersionPath(final String databaseName, final String ruleName, final String key) {
+ return String.join("/", getMetaDataNodePath(), databaseName, ruleName, key, ACTIVE_VERSION);
+ }
+
+ /**
+ * Get database rule versions path.
+ *
+ * @param databaseName database name
+ * @param ruleName rule name
+ * @param key key
+ * @return database rule versions path
+ */
+ public static String getDatabaseRuleVersionsPath(final String databaseName, final String ruleName, final String key) {
+ return String.join("/", getMetaDataNodePath(), databaseName, ruleName, key, VERSIONS);
+ }
+
+ /**
+ * Get database rule version path.
+ *
+ * @param databaseName database name
+ * @param ruleName rule name
+ * @param key key
+ * @param nextVersion next version
+ * @return database rule next version
+ */
+ public static String getDatabaseRuleVersionPath(final String databaseName, final String ruleName, final String key, final String nextVersion) {
+ return String.join("/", getMetaDataNodePath(), databaseName, ruleName, key, VERSIONS, nextVersion);
}
/**
@@ -68,7 +122,7 @@ public final class NewDatabaseMetaDataNode {
*
* @return meta data node path
*/
- public static String getMetaDataNodePath() {
+ private static String getMetaDataNodePath() {
return String.join("/", "", ROOT_NODE);
}
}
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourcePathProcessor.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourceNodeConverter.java
similarity index 96%
rename from kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourcePathProcessor.java
rename to kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourceNodeConverter.java
index 5195f62eadb..a921f917a30 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourcePathProcessor.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourceNodeConverter.java
@@ -21,10 +21,10 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
/**
- * Data source path processor.
+ * Data source node converter.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataSourcePathProcessor {
+public final class DataSourceNodeConverter {
private static final String ROOT_NODE = "data_sources";
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
index 8877227a25c..16c259deee6 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
@@ -24,12 +24,14 @@ import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
import org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapper;
import org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapperEngine;
+import org.apache.shardingsphere.metadata.persist.node.NewDatabaseMetaDataNode;
import org.apache.shardingsphere.mode.spi.PersistRepository;
import javax.sql.DataSource;
import java.util.Collections;
import java.util.List;
import java.util.Collection;
+import java.util.LinkedHashSet;
import java.util.Map;
/**
@@ -41,10 +43,6 @@ public final class NewDatabaseRulePersistService implements NewDatabaseRuleBased
private static final String DEFAULT_VERSION = "0";
- private static final String ACTIVE_VERSION = "active_version";
-
- private static final String VERSIONS = "versions";
-
private final PersistRepository repository;
@Override
@@ -62,33 +60,48 @@ public final class NewDatabaseRulePersistService implements NewDatabaseRuleBased
if (dataNodes.isEmpty()) {
continue;
}
- persistDataNodes(entry.getValue().getRuleTagName().toLowerCase(), dataNodes);
+ persistDataNodes(databaseName, entry.getValue().getRuleTagName().toLowerCase(), dataNodes);
}
}
- private void persistDataNodes(final String ruleName, final Collection<YamlDataNode> dataNodes) {
+ private void persistDataNodes(final String databaseName, final String ruleName, final Collection<YamlDataNode> dataNodes) {
for (YamlDataNode each : dataNodes) {
if (Strings.isNullOrEmpty(repository.getDirectly(each.getKey()))) {
- repository.persist(appendActiveVersion(ruleName, each.getKey()), DEFAULT_VERSION);
+ repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionPath(databaseName, ruleName, each.getKey()), DEFAULT_VERSION);
}
- List<String> versions = repository.getChildrenKeys(String.join("/", "", ruleName, each.getKey(), VERSIONS));
- repository.persist(appendVersion(ruleName, each.getKey(), versions.isEmpty()
+ List<String> versions = repository.getChildrenKeys(NewDatabaseMetaDataNode.getDatabaseRuleVersionsPath(databaseName, ruleName, each.getKey()));
+ repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleVersionPath(databaseName, ruleName, each.getKey(), versions.isEmpty()
? DEFAULT_VERSION
: String.valueOf(Integer.parseInt(versions.get(0)) + 1)), each.getValue());
}
}
- private String appendActiveVersion(final String ruleName, final String key) {
- return String.join("/", "", ruleName, key, ACTIVE_VERSION);
+ @Override
+ public Collection<RuleConfiguration> load(final String databaseName, final String ruleName) {
+ Collection<String> result = new LinkedHashSet<>();
+ getAllKeys(result, NewDatabaseMetaDataNode.getDatabaseRulePath(databaseName, ruleName));
+ if (1 == result.size()) {
+ return Collections.emptyList();
+ }
+ return new NewYamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(ruleName, getDataNodes(result));
}
- private String appendVersion(final String ruleName, final String key, final String nextVersion) {
- return String.join("/", "", ruleName, key, VERSIONS, nextVersion);
+ private void getAllKeys(final Collection<String> keys, final String path) {
+ keys.add(path);
+ List<String> childrenKeys = repository.getChildrenKeys(path);
+ if (childrenKeys.isEmpty()) {
+ return;
+ }
+ for (String each : childrenKeys) {
+ getAllKeys(keys, String.join("/", "", path, each));
+ }
}
- @Override
- public Collection<RuleConfiguration> load(final String databaseName, final String ruleName) {
- // TODO
- return Collections.emptyList();
+ private Collection<YamlDataNode> getDataNodes(final Collection<String> keys) {
+ Collection<YamlDataNode> result = new LinkedHashSet<>();
+ for (String each : keys) {
+ result.add(new YamlDataNode(each, repository.getDirectly(each)));
+ }
+ return result;
}
}
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
new file mode 100644
index 00000000000..ac3aa5cb350
--- /dev/null
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.node;
+
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+// TODO Rename DatabaseMetaDataNodeTest when metadata structure adjustment completed. #25485
+class NewDatabaseMetaDataNodeTest {
+
+ @Test
+ void assertGetMetaDataDataSourcesPath() {
+ assertThat(NewDatabaseMetaDataNode.getDataSourcesPath("foo_db"), is("/metadata/foo_db/data_sources"));
+ }
+
+ @Test
+ void assertGetMetaDataDataSourcePath() {
+ assertThat(NewDatabaseMetaDataNode.getDataSourcePath("foo_db", "foo_ds", "0"), is("/metadata/foo_db/data_sources/foo_ds/versions/0"));
+ }
+
+ @Test
+ void assertGetDatabaseRuleActiveVersionPath() {
+ assertThat(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionPath("foo_db", "foo_rule", "foo_tables"), is("/metadata/foo_db/foo_rule/foo_tables/active_version"));
+ }
+
+ @Test
+ void assertGetDatabaseRuleVersionPath() {
+ assertThat(NewDatabaseMetaDataNode.getDatabaseRuleVersionPath("foo_db", "foo_rule", "foo_tables", "1"), is("/metadata/foo_db/foo_rule/foo_tables/versions/1"));
+ }
+}