You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/06/26 09:40:51 UTC

[shardingsphere] branch master updated: Add RuleDefaultItemNodeConverter (#26579)

This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 77d6908e5f4 Add RuleDefaultItemNodeConverter (#26579)
77d6908e5f4 is described below

commit 77d6908e5f46742b407fecaf4ca0c60fe1f6a097
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon Jun 26 17:40:45 2023 +0800

    Add RuleDefaultItemNodeConverter (#26579)
    
    * Add RuleDefaultItemNodeConverter
    
    * Refactor ShadowNodeConverter
    
    * Refactor SingleNodeConverter
    
    * Refactor ShardingNodeConverter
---
 .../event/ShadowRuleConfigurationEventBuilder.java |   2 +-
 .../metadata/converter/ShadowNodeConverter.java    |  44 +---
 .../NewYamlShadowRuleConfigurationSwapper.java     |   4 +-
 .../ShardingRuleConfigurationEventBuilder.java     |  12 +-
 .../metadata/converter/ShardingNodeConverter.java  | 228 ++++-----------------
 .../NewYamlShardingRuleConfigurationSwapper.java   |  25 +--
 .../converter/RuleDefaultItemNodeConverter.java    |  83 ++++++++
 .../event/SingleRuleConfigurationEventBuilder.java |   4 +-
 .../metadata/converter/SingleNodeConverter.java    |  38 ++--
 .../NewYamlSingleRuleConfigurationSwapper.java     |   2 +-
 10 files changed, 168 insertions(+), 274 deletions(-)

diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java
index 544fb0a19b0..87abf9f15f1 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java
@@ -58,7 +58,7 @@ public final class ShadowRuleConfigurationEventBuilder implements RuleConfigurat
         if (algorithmName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShadowAlgorithmEvent(databaseName, algorithmName.get(), event);
         }
-        if (ShadowNodeConverter.isDefaultAlgorithmNameWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShadowNodeConverter.getDefaultAlgorithmNameNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultShadowAlgorithmNameEvent(databaseName, event);
         }
         return Optional.empty();
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java
index 57edaf75740..b2104f2a57a 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java
@@ -19,24 +19,16 @@ package org.apache.shardingsphere.shadow.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.converter.RuleDefaultItemNodeConverter;
 import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
 import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /**
  * Shadow node converter.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ShadowNodeConverter {
     
-    private static final String DEFAULT_ALGORITHM_NAME = "default_algorithm_name";
-    
-    private static final String VERSIONS = "/versions/\\d+$";
-    
-    private static final String ACTIVE_VERSION = "/active_version$";
-    
     private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("shadow");
     
     private static final RuleItemNodeConverter DATA_SOURCE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "data_sources");
@@ -45,6 +37,8 @@ public final class ShadowNodeConverter {
     
     private static final RuleItemNodeConverter ALGORITHM_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "algorithms");
     
+    private static final RuleDefaultItemNodeConverter DEFAULT_ALGORITHM_NAME_NODE_CONVERTER = new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, "default_algorithm_name");
+    
     /**
      * Get rule root node converter.
      *
@@ -82,35 +76,11 @@ public final class ShadowNodeConverter {
     }
     
     /**
-     * Get default shadow algorithm path.
-     *
-     * @return default shadow algorithm path
-     */
-    public static String getDefaultShadowAlgorithmPath() {
-        return String.join("/", DEFAULT_ALGORITHM_NAME);
-    }
-    
-    /**
-     * Is default algorithm name path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDefaultAlgorithmNamePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_ALGORITHM_NAME + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is default algorithm name with active version path.
+     * Get default algorithm name node converter.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return default algorithm name node converter
      */
-    public static boolean isDefaultAlgorithmNameWithActiveVersionPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_ALGORITHM_NAME + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getDefaultAlgorithmNameNodeConverter() {
+        return DEFAULT_ALGORITHM_NAME_NODE_CONVERTER;
     }
 }
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java
index d9a37509ee2..92bb9537459 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java
@@ -54,7 +54,7 @@ public final class NewYamlShadowRuleConfigurationSwapper implements NewYamlRuleC
             result.add(new YamlDataNode(ShadowNodeConverter.getAlgorithmNodeConverter().getNamePath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
         }
         if (!Strings.isNullOrEmpty(data.getDefaultShadowAlgorithmName())) {
-            result.add(new YamlDataNode(ShadowNodeConverter.getDefaultShadowAlgorithmPath(), data.getDefaultShadowAlgorithmName()));
+            result.add(new YamlDataNode(ShadowNodeConverter.getDefaultAlgorithmNameNodeConverter().getPath(), data.getDefaultShadowAlgorithmName()));
         }
         for (ShadowDataSourceConfiguration each : data.getDataSources()) {
             result.add(new YamlDataNode(ShadowNodeConverter.getDataSourceNodeConvertor().getNamePath(each.getName()), YamlEngine.marshal(swapToDataSourceYamlConfiguration(each))));
@@ -86,7 +86,7 @@ public final class NewYamlShadowRuleConfigurationSwapper implements NewYamlRuleC
                 ShadowNodeConverter.getAlgorithmNodeConverter().getName(each.getKey())
                         .ifPresent(algorithmName -> result.getShadowAlgorithms().put(algorithmName,
                                 algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
-            } else if (ShadowNodeConverter.isDefaultAlgorithmNamePath(each.getKey())) {
+            } else if (ShadowNodeConverter.getDefaultAlgorithmNameNodeConverter().isPath(each.getKey())) {
                 result.setDefaultShadowAlgorithmName(each.getValue());
             }
         }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java
index 81f645949aa..16c74cf2d88 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java
@@ -78,19 +78,19 @@ public final class ShardingRuleConfigurationEventBuilder implements RuleConfigur
         if (bindingTableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShardingTableReferenceConfigEvent(databaseName, bindingTableName.get(), event);
         }
-        if (ShardingNodeConverter.isDefaultDatabaseStrategyWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShardingNodeConverter.getDefaultDatabaseStrategyNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultDatabaseStrategyConfigEvent(databaseName, event);
         }
-        if (ShardingNodeConverter.isDefaultTableStrategyWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShardingNodeConverter.getDefaultTableStrategyNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultTableStrategyConfigEvent(databaseName, event);
         }
-        if (ShardingNodeConverter.isDefaultKeyGenerateStrategyWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShardingNodeConverter.getDefaultKeyGenerateStrategyNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultKeyGenerateStrategyConfigEvent(databaseName, event);
         }
-        if (ShardingNodeConverter.isDefaultAuditStrategyWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShardingNodeConverter.getDefaultAuditStrategyNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultShardingAuditorStrategyConfigEvent(databaseName, event);
         }
-        if (ShardingNodeConverter.isDefaultShardingColumnWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShardingNodeConverter.getDefaultShardingColumnNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultShardingColumnEvent(databaseName, event);
         }
         Optional<String> algorithmName = ShardingNodeConverter.getAlgorithmNodeConverter().getNameByActiveVersionPath(event.getKey());
@@ -105,7 +105,7 @@ public final class ShardingRuleConfigurationEventBuilder implements RuleConfigur
         if (auditorName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createAuditorEvent(databaseName, auditorName.get(), event);
         }
-        if (ShardingNodeConverter.isShardingCacheWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (ShardingNodeConverter.getShardingCacheNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createShardingCacheEvent(databaseName, event);
         }
         return Optional.empty();
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java
index f4a6acbabaa..4fff77b8c61 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java
@@ -19,12 +19,10 @@ package org.apache.shardingsphere.sharding.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.converter.RuleDefaultItemNodeConverter;
 import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
 import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /**
  * Sharding node converter.
  */
@@ -33,22 +31,6 @@ public final class ShardingNodeConverter {
     
     private static final String DEFAULT_STRATEGIES_NODE = "default_strategies";
     
-    private static final String DEFAULT_DATABASE_STRATEGY_NODE = "default_database_strategy";
-    
-    private static final String DEFAULT_TABLE_STRATEGY_NODE = "default_table_strategy";
-    
-    private static final String DEFAULT_KEY_GENERATE_STRATEGY_NODE = "default_key_generate_strategy";
-    
-    private static final String DEFAULT_AUDIT_STRATEGY_NODE = "default_audit_strategy";
-    
-    private static final String DEFAULT_SHARDING_COLUMN_NODE = "default_sharding_column";
-    
-    private static final String SHARDING_CACHE_NODE = "sharding_cache";
-    
-    private static final String VERSIONS = "/versions/\\d+$";
-    
-    private static final String ACTIVE_VERSION = "/active_version$";
-    
     private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("sharding");
     
     private static final RuleItemNodeConverter TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "tables");
@@ -63,6 +45,21 @@ public final class ShardingNodeConverter {
     
     private static final RuleItemNodeConverter AUDITOR_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "auditors");
     
+    private static final RuleDefaultItemNodeConverter DEFAULT_DATABASE_STRATEGY_NODE_CONVERTER =
+            new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, DEFAULT_STRATEGIES_NODE, "default_database_strategy");
+    
+    private static final RuleDefaultItemNodeConverter DEFAULT_TABLE_STRATEGY_NODE_CONVERTER = new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, DEFAULT_STRATEGIES_NODE, "default_table_strategy");
+    
+    private static final RuleDefaultItemNodeConverter DEFAULT_KEY_GENERATE_STRATEGY_NODE_CONVERTER =
+            new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, DEFAULT_STRATEGIES_NODE, "default_key_generate_strategy");
+    
+    private static final RuleDefaultItemNodeConverter DEFAULT_AUDIT_STRATEGY_NODE_CONVERTER = new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, DEFAULT_STRATEGIES_NODE, "default_audit_strategy");
+    
+    private static final RuleDefaultItemNodeConverter DEFAULT_SHARDING_COLUMN_NODE_CONVERTER =
+            new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, DEFAULT_STRATEGIES_NODE, "default_sharding_column");
+    
+    private static final RuleDefaultItemNodeConverter SHARDING_CACHE_NODE_CONVERTER = new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, "sharding_cache");
+    
     /**
      * Get rule root node converter.
      *
@@ -127,201 +124,56 @@ public final class ShardingNodeConverter {
     }
     
     /**
-     * Get default database strategy path.
-     *
-     * @return default database strategy path
-     */
-    public static String getDefaultDatabaseStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_DATABASE_STRATEGY_NODE);
-    }
-    
-    /**
-     * Get default table strategy path.
-     *
-     * @return default table strategy path
-     */
-    public static String getDefaultTableStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_TABLE_STRATEGY_NODE);
-    }
-    
-    /**
-     * Get default key generate strategy path.
-     *
-     * @return default key generate path
-     */
-    public static String getDefaultKeyGenerateStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_KEY_GENERATE_STRATEGY_NODE);
-    }
-    
-    /**
-     * Get default audit strategy path.
-     *
-     * @return default audit strategy path
-     */
-    public static String getDefaultAuditStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_AUDIT_STRATEGY_NODE);
-    }
-    
-    /**
-     * Get default sharding column path.
-     *
-     * @return default sharding column path
-     */
-    public static String getDefaultShardingColumnPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_SHARDING_COLUMN_NODE);
-    }
-    
-    /**
-     * Get sharding cache path.
-     *
-     * @return sharding cache path
-     */
-    public static String getShardingCachePath() {
-        return String.join("/", SHARDING_CACHE_NODE);
-    }
-    
-    /**
-     * Is default database strategy path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDefaultDatabaseStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_DATABASE_STRATEGY_NODE + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is default table strategy path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDefaultTableStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_TABLE_STRATEGY_NODE + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is default key generate strategy path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDefaultKeyGenerateStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_KEY_GENERATE_STRATEGY_NODE + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is default audit strategy path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDefaultAuditStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_AUDIT_STRATEGY_NODE + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is default sharding column path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDefaultShardingColumnPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_SHARDING_COLUMN_NODE + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is sharding cache path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isShardingCachePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + SHARDING_CACHE_NODE + VERSIONS, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is sharding algorithm with active version path.
+     * Get default database strategy node converter.
      *
-     * @param activeVersionPath active version path
-     * @return true or false
+     * @return default database strategy node converter
      */
-    public static boolean isDefaultDatabaseStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_DATABASE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getDefaultDatabaseStrategyNodeConverter() {
+        return DEFAULT_DATABASE_STRATEGY_NODE_CONVERTER;
     }
     
     /**
-     * Is default table strategy with active version path.
+     * Get default table strategy node converter.
      *
-     * @param activeVersionPath active version path
-     * @return true or false
+     * @return default table strategy node converter
      */
-    public static boolean isDefaultTableStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_TABLE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getDefaultTableStrategyNodeConverter() {
+        return DEFAULT_TABLE_STRATEGY_NODE_CONVERTER;
     }
     
     /**
-     * Is default key generate strategy with active version path.
+     * Get default key generate strategy node converter.
      *
-     * @param activeVersionPath active version path
-     * @return true or false
+     * @return default key generate strategy node converter
      */
-    public static boolean isDefaultKeyGenerateStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(
-                ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_KEY_GENERATE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getDefaultKeyGenerateStrategyNodeConverter() {
+        return DEFAULT_KEY_GENERATE_STRATEGY_NODE_CONVERTER;
     }
     
     /**
-     * Is default audit strategy with active version path.
+     * Get default audit strategy node converter.
      *
-     * @param activeVersionPath active version path
-     * @return true or false
+     * @return default table strategy node converter
      */
-    public static boolean isDefaultAuditStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_AUDIT_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getDefaultAuditStrategyNodeConverter() {
+        return DEFAULT_AUDIT_STRATEGY_NODE_CONVERTER;
     }
     
     /**
-     * Is default sharding column with active version path.
+     * Get default sharding column node converter.
      *
-     * @param activeVersionPath active version path
-     * @return true or false
+     * @return default sharding column node converter
      */
-    public static boolean isDefaultShardingColumnWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_SHARDING_COLUMN_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getDefaultShardingColumnNodeConverter() {
+        return DEFAULT_SHARDING_COLUMN_NODE_CONVERTER;
     }
     
     /**
-     * Is sharding cache with active version path.
+     * Get sharding cache node converter.
      *
-     * @param activeVersionPath active version path
-     * @return true or false
+     * @return sharding cache node converter
      */
-    public static boolean isShardingCacheWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + SHARDING_CACHE_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getShardingCacheNodeConverter() {
+        return SHARDING_CACHE_NODE_CONVERTER;
     }
 }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java
index 96158416a5c..9e5e36f4e67 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java
@@ -74,10 +74,11 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
         swapStrategies(data, result);
         swapTableRules(data, result);
         if (null != data.getDefaultShardingColumn()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultShardingColumnPath(), data.getDefaultShardingColumn()));
+            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultShardingColumnNodeConverter().getPath(), data.getDefaultShardingColumn()));
         }
         if (null != data.getShardingCache()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getShardingCachePath(), YamlEngine.marshal(shardingCacheYamlSwapper.swapToYamlConfiguration(data.getShardingCache()))));
+            result.add(new YamlDataNode(ShardingNodeConverter.getShardingCacheNodeConverter().getPath(),
+                    YamlEngine.marshal(shardingCacheYamlSwapper.swapToYamlConfiguration(data.getShardingCache()))));
         }
         return result;
     }
@@ -97,19 +98,19 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
     
     private void swapStrategies(final ShardingRuleConfiguration data, final Collection<YamlDataNode> result) {
         if (null != data.getDefaultDatabaseShardingStrategy()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultDatabaseStrategyPath(),
+            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultDatabaseStrategyNodeConverter().getPath(),
                     YamlEngine.marshal(shardingStrategySwapper.swapToYamlConfiguration(data.getDefaultDatabaseShardingStrategy()))));
         }
         if (null != data.getDefaultTableShardingStrategy()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultTableStrategyPath(),
+            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultTableStrategyNodeConverter().getPath(),
                     YamlEngine.marshal(shardingStrategySwapper.swapToYamlConfiguration(data.getDefaultTableShardingStrategy()))));
         }
         if (null != data.getDefaultKeyGenerateStrategy()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultKeyGenerateStrategyPath(),
+            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultKeyGenerateStrategyNodeConverter().getPath(),
                     YamlEngine.marshal(keyGenerateStrategySwapper.swapToYamlConfiguration(data.getDefaultKeyGenerateStrategy()))));
         }
         if (null != data.getDefaultAuditStrategy()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultAuditStrategyPath(),
+            result.add(new YamlDataNode(ShardingNodeConverter.getDefaultAuditStrategyNodeConverter().getPath(),
                     YamlEngine.marshal(auditStrategySwapper.swapToYamlConfiguration(data.getDefaultAuditStrategy()))));
         }
     }
@@ -140,15 +141,15 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
             } else if (ShardingNodeConverter.getBindingTableNodeConverter().isPath(each.getKey())) {
                 ShardingNodeConverter.getBindingTableNodeConverter().getName(each.getKey())
                         .ifPresent(bindingTableName -> result.getBindingTableGroups().add(YamlShardingTableReferenceRuleConfigurationConverter.convertToObject(each.getValue())));
-            } else if (ShardingNodeConverter.isDefaultDatabaseStrategyPath(each.getKey())) {
+            } else if (ShardingNodeConverter.getDefaultDatabaseStrategyNodeConverter().isPath(each.getKey())) {
                 result.setDefaultDatabaseShardingStrategy(shardingStrategySwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingStrategyConfiguration.class)));
-            } else if (ShardingNodeConverter.isDefaultTableStrategyPath(each.getKey())) {
+            } else if (ShardingNodeConverter.getDefaultTableStrategyNodeConverter().isPath(each.getKey())) {
                 result.setDefaultTableShardingStrategy(shardingStrategySwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingStrategyConfiguration.class)));
-            } else if (ShardingNodeConverter.isDefaultKeyGenerateStrategyPath(each.getKey())) {
+            } else if (ShardingNodeConverter.getDefaultKeyGenerateStrategyNodeConverter().isPath(each.getKey())) {
                 result.setDefaultKeyGenerateStrategy(keyGenerateStrategySwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlKeyGenerateStrategyConfiguration.class)));
-            } else if (ShardingNodeConverter.isDefaultAuditStrategyPath(each.getKey())) {
+            } else if (ShardingNodeConverter.getDefaultAuditStrategyNodeConverter().isPath(each.getKey())) {
                 result.setDefaultAuditStrategy(auditStrategySwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingAuditStrategyConfiguration.class)));
-            } else if (ShardingNodeConverter.isDefaultShardingColumnPath(each.getKey())) {
+            } else if (ShardingNodeConverter.getDefaultShardingColumnNodeConverter().isPath(each.getKey())) {
                 result.setDefaultShardingColumn(each.getValue());
             } else if (ShardingNodeConverter.getAlgorithmNodeConverter().isPath(each.getKey())) {
                 ShardingNodeConverter.getAlgorithmNodeConverter().getName(each.getKey())
@@ -161,7 +162,7 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
             } else if (ShardingNodeConverter.getAuditorNodeConverter().isPath(each.getKey())) {
                 ShardingNodeConverter.getAuditorNodeConverter().getName(each.getKey())
                         .ifPresent(auditorName -> result.getAuditors().put(auditorName, algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
-            } else if (ShardingNodeConverter.isShardingCachePath(each.getKey())) {
+            } else if (ShardingNodeConverter.getShardingCacheNodeConverter().isPath(each.getKey())) {
                 result.setShardingCache(shardingCacheYamlSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingCacheConfiguration.class)));
             }
         }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/converter/RuleDefaultItemNodeConverter.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/converter/RuleDefaultItemNodeConverter.java
new file mode 100644
index 00000000000..d7319bbac8a
--- /dev/null
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/converter/RuleDefaultItemNodeConverter.java
@@ -0,0 +1,83 @@
+/*
+ * 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.infra.metadata.converter;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Rule default item node converter.
+ */
+public final class RuleDefaultItemNodeConverter {
+    
+    private static final String VERSIONS = "/versions/\\d+$";
+    
+    private static final String ACTIVE_VERSION = "/active_version$";
+    
+    private final String parentNode;
+    
+    private final String itemsNode;
+    
+    private final Pattern itemsPathPattern;
+    
+    private final Pattern activeVersionPathPattern;
+    
+    public RuleDefaultItemNodeConverter(final RuleRootNodeConverter ruleRootNodeConverter, final String itemsNode) {
+        parentNode = null;
+        this.itemsNode = itemsNode;
+        itemsPathPattern = Pattern.compile(ruleRootNodeConverter.getRuleNodePrefix() + "/" + itemsNode + VERSIONS, Pattern.CASE_INSENSITIVE);
+        activeVersionPathPattern = Pattern.compile(ruleRootNodeConverter.getRuleNodePrefix() + "/" + itemsNode + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+    }
+    
+    public RuleDefaultItemNodeConverter(final RuleRootNodeConverter ruleRootNodeConverter, final String parentNode, final String itemsNode) {
+        this.parentNode = parentNode;
+        this.itemsNode = itemsNode;
+        itemsPathPattern = Pattern.compile(ruleRootNodeConverter.getRuleNodePrefix() + "/" + parentNode + "/" + itemsNode + VERSIONS, Pattern.CASE_INSENSITIVE);
+        activeVersionPathPattern = Pattern.compile(ruleRootNodeConverter.getRuleNodePrefix() + "/" + parentNode + "/" + itemsNode + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+    }
+    
+    /**
+     * Get path.
+     *
+     * @return path
+     */
+    public String getPath() {
+        return null == parentNode ? String.join("/", itemsNode) : String.join("/", parentNode, itemsNode);
+    }
+    
+    /**
+     * Is item path.
+     *
+     * @param rulePath rule path
+     * @return true or false
+     */
+    public boolean isPath(final String rulePath) {
+        return itemsPathPattern.matcher(rulePath).find();
+    }
+    
+    /**
+     * Judge whether active version path.
+     * 
+     * @param path path to be judged
+     * @return is active version path or not
+     */
+    public boolean isActiveVersionPath(final String path) {
+        Matcher matcher = activeVersionPathPattern.matcher(path);
+        return matcher.find();
+    }
+}
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java
index 69d9da5c3ea..4574e8b25f5 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java
@@ -36,10 +36,10 @@ public final class SingleRuleConfigurationEventBuilder implements RuleConfigurat
     
     @Override
     public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
-        if (!SingleNodeConverter.isSinglePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
+        if (!SingleNodeConverter.getTableNodeConverter().isPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        if (SingleNodeConverter.isTablesActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (SingleNodeConverter.getTableNodeConverter().isActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createSingleConfigEvent(databaseName, event);
         }
         return Optional.empty();
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java
index 14de346003d..d05e4b8a577 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java
@@ -19,9 +19,8 @@ package org.apache.shardingsphere.single.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.apache.shardingsphere.infra.metadata.converter.RuleDefaultItemNodeConverter;
+import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
 /**
  * Single node converter.
@@ -37,36 +36,25 @@ public final class SingleNodeConverter {
     
     private static final String RULE_ACTIVE_VERSION = "/active_version$";
     
-    /**
-     * Get tables path.
-     *
-     * @return tables path
-     */
-    public static String getTablesPath() {
-        return TABLES_NODE;
-    }
+    private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("single");
+    
+    private static final RuleDefaultItemNodeConverter TABLE_NODE_CONVERTER = new RuleDefaultItemNodeConverter(ROOT_NODE_CONVERTER, "tables");
     
     /**
-     * Is single path.
+     * Get table node converter.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return table node converter
      */
-    public static boolean isSinglePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static RuleDefaultItemNodeConverter getTableNodeConverter() {
+        return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Is tables active version path.
+     * Get tables path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return tables path
      */
-    public static boolean isTablesActiveVersionPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getTablesPath() {
+        return TABLES_NODE;
     }
 }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/NewYamlSingleRuleConfigurationSwapper.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/NewYamlSingleRuleConfigurationSwapper.java
index 99a7867cfc8..6da3b76e0af 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/NewYamlSingleRuleConfigurationSwapper.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/NewYamlSingleRuleConfigurationSwapper.java
@@ -49,7 +49,7 @@ public final class NewYamlSingleRuleConfigurationSwapper implements NewYamlRuleC
     @Override
     public SingleRuleConfiguration swapToObject(final Collection<YamlDataNode> dataNodes) {
         for (YamlDataNode each : dataNodes) {
-            if (SingleNodeConverter.isSinglePath(each.getKey())) {
+            if (SingleNodeConverter.getTableNodeConverter().isPath(each.getKey())) {
                 return swapToObject(YamlEngine.unmarshal(each.getValue(), YamlSingleRuleConfiguration.class));
             }
         }