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"));
+    }
+}