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 2022/11/03 00:28:35 UTC

[shardingsphere] branch master updated: Refactor ConvertYamlConfigurationHandler. (#21912)

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 6846f956b76 Refactor ConvertYamlConfigurationHandler. (#21912)
6846f956b76 is described below

commit 6846f956b769c99e5ce790fb7c73ebd6a0fc5e11
Author: yx9o <ya...@163.com>
AuthorDate: Thu Nov 3 08:28:27 2022 +0800

    Refactor ConvertYamlConfigurationHandler. (#21912)
    
    * Refactor ConvertYamlConfigurationHandler.
    
    * update.
    
    * update.
    
    * update.
---
 .../common/constant/DistSQLScriptConstants.java    |  60 +--
 .../queryable/ConvertYamlConfigurationHandler.java | 588 ++++++++-------------
 .../ConvertYamlConfigurationHandlerTest.java       |  38 +-
 .../resources/expected/convert-add-resource.yaml   |  35 --
 .../resources/expected/convert-create-encrypt.yaml |  23 +-
 .../resources/expected/convert-create-shadow.yaml  |  25 +-
 .../expected/convert-create-sharding.yaml          |  39 +-
 .../expected/convert-database-discovery.yaml       |  31 +-
 .../expected/convert-readwrite-splitting.yaml      |  29 +-
 9 files changed, 311 insertions(+), 557 deletions(-)

diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
index 5acfcbff263..ae6f21b6dab 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
@@ -26,18 +26,6 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class DistSQLScriptConstants {
     
-    public static final String RESOURCE_DB = "resource_db";
-    
-    public static final String SHARDING_DB = "sharding_db";
-    
-    public static final String READWRITE_SPLITTING_DB = "readwrite_splitting_db";
-    
-    public static final String DATABASE_DISCOVERY_DB = "database_discovery_db";
-    
-    public static final String ENCRYPT_DB = "encrypt_db";
-    
-    public static final String SHADOW_DB = "shadow_db";
-    
     public static final String STANDARD = "standard";
     
     public static final String COMPLEX = "complex";
@@ -52,7 +40,7 @@ public final class DistSQLScriptConstants {
     
     public static final String USE_DATABASE = "USE %s;";
     
-    public static final String ADD_RESOURCE = "REGISTER STORAGE UNIT";
+    public static final String REGISTER_STORAGE_UNIT = "REGISTER STORAGE UNIT";
     
     public static final String KEY_URL = "url";
     
@@ -62,11 +50,11 @@ public final class DistSQLScriptConstants {
     
     public static final String RESOURCE_DEFINITION = " %s ("
             + System.lineSeparator()
-            + "URL=\"%s\","
+            + "URL='%s',"
             + System.lineSeparator()
-            + "USER=\"%s\","
+            + "USER='%s',"
             + System.lineSeparator()
-            + "PASSWORD=\"%s\","
+            + "PASSWORD='%s',"
             + System.lineSeparator()
             + "PROPERTIES(%s)"
             + System.lineSeparator()
@@ -74,20 +62,20 @@ public final class DistSQLScriptConstants {
     
     public static final String RESOURCE_DEFINITION_WITHOUT_PASSWORD = " %s ("
             + System.lineSeparator()
-            + "URL=\"%s\","
+            + "URL='%s',"
             + System.lineSeparator()
-            + "USER=\"%s\","
+            + "USER='%s',"
             + System.lineSeparator()
             + "PROPERTIES(%s)"
             + ")";
     
-    public static final String PROPERTY = "\"%s\"=\"%s\"";
+    public static final String PROPERTY = "'%s'='%s'";
     
     public static final String CREATE_SHARDING_ALGORITHM = "CREATE SHARDING ALGORITHM";
     
     public static final String SHARDING_ALGORITHM = " %s ("
             + System.lineSeparator()
-            + "TYPE(NAME=\"%s\", PROPERTIES(%s))"
+            + "%s"
             + System.lineSeparator()
             + ")";
     
@@ -95,7 +83,7 @@ public final class DistSQLScriptConstants {
     
     public static final String SHARDING_TABLE = " %s ("
             + System.lineSeparator()
-            + "DATANODES(\"%s\"),"
+            + "DATANODES('%s'),"
             + System.lineSeparator()
             + "%s"
             + System.lineSeparator()
@@ -105,13 +93,13 @@ public final class DistSQLScriptConstants {
     
     public static final String TABLE_STRATEGY = "TABLE_STRATEGY";
     
-    public static final String SHARDING_STRATEGY_STANDARD = "%s(TYPE=\"%s\", SHARDING_COLUMN=%s, SHARDING_ALGORITHM=%s),"
+    public static final String SHARDING_STRATEGY_STANDARD = "%s(TYPE='%s', SHARDING_COLUMN=%s, SHARDING_ALGORITHM=%s),"
             + System.lineSeparator();
     
-    public static final String SHARDING_STRATEGY_COMPLEX = "%s(TYPE=\"%s\", SHARDING_COLUMNS=%s, SHARDING_ALGORITHM=%s),"
+    public static final String SHARDING_STRATEGY_COMPLEX = "%s(TYPE='%s', SHARDING_COLUMNS=%s, SHARDING_ALGORITHM=%s),"
             + System.lineSeparator();
     
-    public static final String SHARDING_STRATEGY_HINT = "%s(TYPE=\"%s\", SHARDING_ALGORITHM=%s),"
+    public static final String SHARDING_STRATEGY_HINT = "%s(TYPE='%s', SHARDING_ALGORITHM=%s),"
             + System.lineSeparator();
     
     public static final String KEY_GENERATOR_STRATEGY = "KEY_GENERATE_STRATEGY(COLUMN=%s, KEY_GENERATOR=%s),"
@@ -121,13 +109,13 @@ public final class DistSQLScriptConstants {
     
     public static final String KEY_GENERATOR = " %s ("
             + System.lineSeparator()
-            + "TYPE(NAME=\"%s\")"
+            + "%s"
             + System.lineSeparator()
             + ")";
     
-    public static final String SHARDING_BINDING_TABLE_RULES = "CREATE SHARDING BINDING TABLE RULES %s";
+    public static final String SHARDING_BINDING_TABLE_RULES = "CREATE SHARDING BINDING TABLE RULES";
     
-    public static final String BRACKET = "(%s)";
+    public static final String BINDING_TABLES = " (%s)";
     
     public static final String BROADCAST_TABLE_RULE = "CREATE BROADCAST TABLE RULE %s";
     
@@ -137,15 +125,7 @@ public final class DistSQLScriptConstants {
             + System.lineSeparator()
             + "WRITE_STORAGE_UNIT=%s,"
             + System.lineSeparator()
-            + "READ_STORAGE_UNITS(%s),"
-            + System.lineSeparator()
-            + "%s"
-            + System.lineSeparator()
-            + ")";
-    
-    public static final String READWRITE_SPLITTING_TYPE = "TYPE(NAME=\"%s\")";
-    
-    public static final String READWRITE_SPLITTING_TYPE_PROPERTIES = "TYPE(NAME=\"%s\", PROPERTIES(%s))";
+            + "READ_STORAGE_UNITS(%s)%s)";
     
     public static final String READ_RESOURCE = "%s";
     
@@ -172,15 +152,15 @@ public final class DistSQLScriptConstants {
             + "),"
             + "QUERY_WITH_CIPHER_COLUMN=%s)";
     
-    public static final String ENCRYPT_COLUMN = "(NAME=%s,%s,%s)";
+    public static final String ENCRYPT_COLUMN = "(NAME=%s, %s, %s)";
     
     public static final String PLAIN = "PLAIN=%s";
     
     public static final String CIPHER = "CIPHER=%s";
     
-    public static final String TYPE = "TYPE(NAME='%s', PROPERTIES(%s))";
+    public static final String ALGORITHM_TYPE = "TYPE(NAME='%s', PROPERTIES(%s))";
     
-    public static final String ENCRYPT_TYPE_WITHOUT_PROPERTIES = "TYPE(NAME='%s')";
+    public static final String ALGORITHM_TYPE_WITHOUT_PROPERTIES = "TYPE(NAME='%s')";
     
     public static final String CREATE_SHADOW = "CREATE SHADOW RULE";
     
@@ -195,6 +175,4 @@ public final class DistSQLScriptConstants {
             + ")";
     
     public static final String SHADOW_TABLE = "%s(%s)";
-    
-    public static final String SHADOW_TABLE_TYPE = "TYPE(NAME=\"%s\", PROPERTIES(%s))";
 }
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
index 8d3121e71b2..ad99c663946 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
@@ -17,17 +17,20 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
-import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.zaxxer.hikari.HikariDataSource;
+import org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDataSourceRuleConfiguration;
+import org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryHeartBeatConfiguration;
 import org.apache.shardingsphere.dbdiscovery.yaml.config.YamlDatabaseDiscoveryRuleConfiguration;
-import org.apache.shardingsphere.dbdiscovery.yaml.config.rule.YamlDatabaseDiscoveryDataSourceRuleConfiguration;
-import org.apache.shardingsphere.dbdiscovery.yaml.config.rule.YamlDatabaseDiscoveryHeartBeatConfiguration;
+import org.apache.shardingsphere.dbdiscovery.yaml.swapper.YamlDatabaseDiscoveryRuleConfigurationSwapper;
 import org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
+import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
+import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
+import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.yaml.config.YamlEncryptRuleConfiguration;
-import org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptColumnRuleConfiguration;
-import org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptTableRuleConfiguration;
+import org.apache.shardingsphere.encrypt.yaml.swapper.YamlEncryptRuleConfigurationSwapper;
 import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
@@ -35,7 +38,6 @@ import org.apache.shardingsphere.infra.datasource.props.custom.CustomDataSourceP
 import org.apache.shardingsphere.infra.datasource.props.synonym.PoolPropertySynonyms;
 import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
-import org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration;
@@ -44,12 +46,16 @@ import org.apache.shardingsphere.proxy.backend.config.yaml.swapper.YamlProxyData
 import org.apache.shardingsphere.proxy.backend.exception.FileIOException;
 import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.QueryableRALBackendHandler;
 import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.common.constant.DistSQLScriptConstants;
+import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
 import org.apache.shardingsphere.readwritesplitting.yaml.config.YamlReadwriteSplittingRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.yaml.config.rule.YamlReadwriteSplittingDataSourceRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.yaml.config.strategy.YamlStaticReadwriteSplittingStrategyConfiguration;
+import org.apache.shardingsphere.readwritesplitting.yaml.swapper.YamlReadwriteSplittingRuleConfigurationSwapper;
+import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
+import org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
+import org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguration;
 import org.apache.shardingsphere.shadow.yaml.config.YamlShadowRuleConfiguration;
-import org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration;
-import org.apache.shardingsphere.shadow.yaml.config.table.YamlShadowTableConfiguration;
+import org.apache.shardingsphere.shadow.yaml.swapper.YamlShadowRuleConfigurationSwapper;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
 import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
@@ -67,8 +73,6 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
-import java.util.SortedMap;
-import java.util.Set;
 import java.util.TreeMap;
 
 /**
@@ -99,95 +103,56 @@ public final class ConvertYamlConfigurationHandler extends QueryableRALBackendHa
     
     private String generateDistSQL(final YamlProxyDatabaseConfiguration yamlConfig) {
         StringBuilder result = new StringBuilder();
-        String databaseType = yamlConfig.getDatabaseName();
-        switch (databaseType) {
-            case DistSQLScriptConstants.RESOURCE_DB:
-                addResourceDistSQL(yamlConfig, result);
-                break;
-            case DistSQLScriptConstants.SHARDING_DB:
-                addShardingDistSQL(yamlConfig, result);
-                break;
-            case DistSQLScriptConstants.READWRITE_SPLITTING_DB:
-                addReadWriteSplittingDistSQL(yamlConfig, result);
-                break;
-            case DistSQLScriptConstants.DATABASE_DISCOVERY_DB:
-                addDatabaseDiscoveryDistSQL(yamlConfig, result);
-                break;
-            case DistSQLScriptConstants.ENCRYPT_DB:
-                addEncryptDistSQL(yamlConfig, result);
-                break;
-            case DistSQLScriptConstants.SHADOW_DB:
-                addShadowDistSQL(yamlConfig, result);
-                break;
-            default:
-                break;
+        appendResourceDistSQL(yamlConfig, result);
+        for (YamlRuleConfiguration each : yamlConfig.getRules()) {
+            if (each instanceof YamlReadwriteSplittingRuleConfiguration) {
+                appendReadWriteSplittingDistSQL((YamlReadwriteSplittingRuleConfiguration) each, result);
+            } else if (each instanceof YamlShardingRuleConfiguration) {
+                appendShardingDistSQL((YamlShardingRuleConfiguration) each, result);
+            } else if (each instanceof YamlDatabaseDiscoveryRuleConfiguration) {
+                appendDatabaseDiscoveryDistSQL((YamlDatabaseDiscoveryRuleConfiguration) each, result);
+            } else if (each instanceof YamlEncryptRuleConfiguration) {
+                appendEncryptDistSQL((YamlEncryptRuleConfiguration) each, result);
+            } else if (each instanceof YamlShadowRuleConfiguration) {
+                appendShadowDistSQL((YamlShadowRuleConfiguration) each, result);
+            }
         }
         return result.toString();
     }
     
-    private void addResourceDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
+    private void appendResourceDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
         appendDatabase(yamlConfig.getDatabaseName(), result);
         appendResources(yamlConfig.getDataSources(), result);
     }
     
-    private void addShardingDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
-        appendDatabase(yamlConfig.getDatabaseName(), result);
-        appendResources(yamlConfig.getDataSources(), result);
-        appendShardingRules(yamlConfig.getRules(), result);
-    }
-    
-    private void addReadWriteSplittingDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
-        appendDatabase(yamlConfig.getDatabaseName(), result);
-        appendResources(yamlConfig.getDataSources(), result);
-        appendReadWriteSplittingRules(yamlConfig.getRules(), result);
-    }
-    
-    private void addDatabaseDiscoveryDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
-        appendDatabase(yamlConfig.getDatabaseName(), result);
-        appendResources(yamlConfig.getDataSources(), result);
-        appendDatabaseDiscoveryRules(yamlConfig.getRules(), result);
-    }
-    
-    private void addEncryptDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
-        appendDatabase(yamlConfig.getDatabaseName(), result);
-        appendResources(yamlConfig.getDataSources(), result);
-        appendEncryptRules(yamlConfig.getRules(), result);
-    }
-    
-    private void addShadowDistSQL(final YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
-        appendDatabase(yamlConfig.getDatabaseName(), result);
-        appendResources(yamlConfig.getDataSources(), result);
-        appendShadowRules(yamlConfig.getRules(), result);
-    }
-    
     private void appendDatabase(final String databaseName, final StringBuilder result) {
         result.append(String.format(DistSQLScriptConstants.CREATE_DATABASE, databaseName)).append(System.lineSeparator());
-        result.append(String.format(DistSQLScriptConstants.USE_DATABASE, databaseName)).append(System.lineSeparator());
+        result.append(String.format(DistSQLScriptConstants.USE_DATABASE, databaseName)).append(System.lineSeparator()).append(System.lineSeparator());
     }
     
     private void appendResources(final Map<String, YamlProxyDataSourceConfiguration> dataSources, final StringBuilder result) {
         if (dataSources.isEmpty()) {
             return;
         }
-        result.append(DistSQLScriptConstants.ADD_RESOURCE);
+        result.append(DistSQLScriptConstants.REGISTER_STORAGE_UNIT);
         Iterator<Entry<String, YamlProxyDataSourceConfiguration>> iterator = dataSources.entrySet().iterator();
         while (iterator.hasNext()) {
             Entry<String, YamlProxyDataSourceConfiguration> entry = iterator.next();
-            DataSourceProperties dataSourceProperties = DataSourcePropertiesCreator.create(HikariDataSource.class.getName(), dataSourceConfigSwapper.swap(entry.getValue()));
-            appendResource(entry.getKey(), dataSourceProperties, result);
+            DataSourceProperties dataSourceProps = DataSourcePropertiesCreator.create(HikariDataSource.class.getName(), dataSourceConfigSwapper.swap(entry.getValue()));
+            appendResource(entry.getKey(), dataSourceProps, result);
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
     }
     
-    private void appendResource(final String resourceName, final DataSourceProperties dataSourceProperties, final StringBuilder result) {
-        Map<String, Object> connectionProperties = dataSourceProperties.getConnectionPropertySynonyms().getStandardProperties();
-        String url = (String) connectionProperties.get(DistSQLScriptConstants.KEY_URL);
-        String username = (String) connectionProperties.get(DistSQLScriptConstants.KEY_USERNAME);
-        String password = (String) connectionProperties.get(DistSQLScriptConstants.KEY_PASSWORD);
-        String props = getResourceProperties(dataSourceProperties.getPoolPropertySynonyms(), dataSourceProperties.getCustomDataSourceProperties());
+    private void appendResource(final String resourceName, final DataSourceProperties dataSourceProps, final StringBuilder result) {
+        Map<String, Object> connectionProps = dataSourceProps.getConnectionPropertySynonyms().getStandardProperties();
+        String url = (String) connectionProps.get(DistSQLScriptConstants.KEY_URL);
+        String username = (String) connectionProps.get(DistSQLScriptConstants.KEY_USERNAME);
+        String password = (String) connectionProps.get(DistSQLScriptConstants.KEY_PASSWORD);
+        String props = getResourceProperties(dataSourceProps.getPoolPropertySynonyms(), dataSourceProps.getCustomDataSourceProperties());
         if (Strings.isNullOrEmpty(password)) {
             result.append(String.format(DistSQLScriptConstants.RESOURCE_DEFINITION_WITHOUT_PASSWORD, resourceName, url, username, props));
         } else {
@@ -195,135 +160,114 @@ public final class ConvertYamlConfigurationHandler extends QueryableRALBackendHa
         }
     }
     
-    private String getResourceProperties(final PoolPropertySynonyms poolPropertySynonyms, final CustomDataSourceProperties customDataSourceProperties) {
+    private String getResourceProperties(final PoolPropertySynonyms poolPropertySynonyms, final CustomDataSourceProperties customDataSourceProps) {
         StringBuilder result = new StringBuilder();
         appendProperties(poolPropertySynonyms.getStandardProperties(), result);
-        if (!customDataSourceProperties.getProperties().isEmpty()) {
+        if (!customDataSourceProps.getProperties().isEmpty()) {
             result.append(DistSQLScriptConstants.COMMA);
-            appendProperties(customDataSourceProperties.getProperties(), result);
+            appendProperties(customDataSourceProps.getProperties(), result);
         }
         return result.toString();
     }
     
-    private void appendProperties(final Map<String, Object> properties, final StringBuilder stringBuilder) {
+    private void appendProperties(final Map<String, Object> properties, final StringBuilder result) {
         Iterator<Entry<String, Object>> iterator = properties.entrySet().iterator();
         while (iterator.hasNext()) {
             Entry<String, Object> entry = iterator.next();
             if (null == entry.getValue()) {
                 continue;
             }
-            stringBuilder.append(String.format(DistSQLScriptConstants.PROPERTY, entry.getKey(), entry.getValue()));
+            result.append(String.format(DistSQLScriptConstants.PROPERTY, entry.getKey(), entry.getValue()));
             if (iterator.hasNext()) {
-                stringBuilder.append(DistSQLScriptConstants.COMMA);
+                result.append(DistSQLScriptConstants.COMMA).append(" ");
             }
         }
     }
     
-    private void appendShardingRules(final Collection<YamlRuleConfiguration> ruleConfigs, final StringBuilder result) {
-        if (ruleConfigs.isEmpty()) {
-            return;
-        }
-        for (YamlRuleConfiguration ruleConfig : ruleConfigs) {
-            ShardingRuleConfiguration shardingRuleConfig = new YamlShardingRuleConfigurationSwapper().swapToObject((YamlShardingRuleConfiguration) ruleConfig);
-            appendShardingAlgorithms(shardingRuleConfig, result);
-            appendKeyGenerators(shardingRuleConfig, result);
-            appendShardingTableRules(shardingRuleConfig, result);
-            // TODO append autoTables
-            appendShardingBindingTableRules(shardingRuleConfig, result);
-            appendShardingBroadcastTableRules(shardingRuleConfig, result);
-        }
+    private void appendShardingDistSQL(final YamlShardingRuleConfiguration yamlRuleConfig, final StringBuilder result) {
+        ShardingRuleConfiguration ruleConfig = new YamlShardingRuleConfigurationSwapper().swapToObject(yamlRuleConfig);
+        appendShardingAlgorithms(ruleConfig, result);
+        appendKeyGenerators(ruleConfig, result);
+        appendShardingTableRules(ruleConfig, result);
+        // TODO append autoTables
+        appendShardingBindingTableRules(ruleConfig, result);
+        appendShardingBroadcastTableRules(ruleConfig, result);
     }
     
-    private void appendShardingAlgorithms(final ShardingRuleConfiguration shardingRuleConfig, final StringBuilder result) {
+    private void appendShardingAlgorithms(final ShardingRuleConfiguration ruleConfig, final StringBuilder result) {
+        if (ruleConfig.getShardingAlgorithms().isEmpty()) {
+            return;
+        }
         result.append(DistSQLScriptConstants.CREATE_SHARDING_ALGORITHM);
-        Iterator<Entry<String, AlgorithmConfiguration>> iterator = shardingRuleConfig.getShardingAlgorithms().entrySet().iterator();
+        Iterator<Entry<String, AlgorithmConfiguration>> iterator = ruleConfig.getShardingAlgorithms().entrySet().iterator();
         while (iterator.hasNext()) {
             Entry<String, AlgorithmConfiguration> entry = iterator.next();
-            String shardingAlgorithmName = entry.getKey();
-            String algorithmType = entry.getValue().getType().toLowerCase();
-            String property = appendShardingAlgorithmProperties(entry.getValue().getProps());
-            result.append(String.format(DistSQLScriptConstants.SHARDING_ALGORITHM, shardingAlgorithmName, algorithmType, property));
+            result.append(String.format(DistSQLScriptConstants.SHARDING_ALGORITHM, entry.getKey(), getAlgorithmType(entry.getValue())));
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
     }
     
-    private String appendShardingAlgorithmProperties(final Properties property) {
-        StringBuilder result = new StringBuilder();
-        Iterator<Entry<Object, Object>> iterator = property.entrySet().iterator();
-        while (iterator.hasNext()) {
-            Entry<Object, Object> entry = iterator.next();
-            result.append(String.format(DistSQLScriptConstants.PROPERTY, entry.getKey(), entry.getValue()));
-            if (iterator.hasNext()) {
-                result.append(DistSQLScriptConstants.COMMA);
-            }
+    private void appendKeyGenerators(final ShardingRuleConfiguration ruleConfig, final StringBuilder result) {
+        if (ruleConfig.getKeyGenerators().isEmpty()) {
+            return;
         }
-        return result.toString();
-    }
-    
-    private void appendKeyGenerators(final ShardingRuleConfiguration shardingRuleConfig, final StringBuilder result) {
         result.append(DistSQLScriptConstants.CREATE_KEY_GENERATOR);
-        Iterator<Entry<String, AlgorithmConfiguration>> iterator = shardingRuleConfig.getKeyGenerators().entrySet().iterator();
+        Iterator<Entry<String, AlgorithmConfiguration>> iterator = ruleConfig.getKeyGenerators().entrySet().iterator();
         while (iterator.hasNext()) {
             Entry<String, AlgorithmConfiguration> entry = iterator.next();
-            String generatorName = entry.getKey();
-            String type = entry.getValue().getType();
-            result.append(String.format(DistSQLScriptConstants.KEY_GENERATOR, generatorName, type));
+            result.append(String.format(DistSQLScriptConstants.KEY_GENERATOR, entry.getKey(), getAlgorithmType(entry.getValue())));
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
     }
     
-    private void appendShardingTableRules(final ShardingRuleConfiguration shardingRuleConfig, final StringBuilder result) {
+    private void appendShardingTableRules(final ShardingRuleConfiguration ruleConfig, final StringBuilder result) {
+        if (ruleConfig.getTables().isEmpty()) {
+            return;
+        }
         result.append(DistSQLScriptConstants.CREATE_SHARDING_TABLE);
-        Iterator<ShardingTableRuleConfiguration> iterator = shardingRuleConfig.getTables().iterator();
+        Iterator<ShardingTableRuleConfiguration> iterator = ruleConfig.getTables().iterator();
         while (iterator.hasNext()) {
-            ShardingTableRuleConfiguration entry = iterator.next();
-            String tableName = entry.getLogicTable();
-            String dataNodes = entry.getActualDataNodes();
-            String strategy = appendTableStrategy(entry);
-            result.append(String.format(DistSQLScriptConstants.SHARDING_TABLE, tableName, dataNodes, strategy));
+            ShardingTableRuleConfiguration tableRuleConfig = iterator.next();
+            result.append(String.format(DistSQLScriptConstants.SHARDING_TABLE, tableRuleConfig.getLogicTable(), tableRuleConfig.getActualDataNodes(), appendTableStrategy(tableRuleConfig)));
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
     }
     
     private String appendTableStrategy(final ShardingTableRuleConfiguration shardingTableRuleConfig) {
         StringBuilder result = new StringBuilder();
         if (null != shardingTableRuleConfig.getDatabaseShardingStrategy()) {
-            getStrategy(shardingTableRuleConfig.getDatabaseShardingStrategy(), DistSQLScriptConstants.DATABASE_STRATEGY, result);
+            appendStrategy(shardingTableRuleConfig.getDatabaseShardingStrategy(), DistSQLScriptConstants.DATABASE_STRATEGY, result);
         }
         if (null != shardingTableRuleConfig.getTableShardingStrategy()) {
-            getStrategy(shardingTableRuleConfig.getTableShardingStrategy(), DistSQLScriptConstants.TABLE_STRATEGY, result);
+            appendStrategy(shardingTableRuleConfig.getTableShardingStrategy(), DistSQLScriptConstants.TABLE_STRATEGY, result);
         }
         if (null != shardingTableRuleConfig.getKeyGenerateStrategy()) {
             KeyGenerateStrategyConfiguration keyGenerateStrategyConfig = shardingTableRuleConfig.getKeyGenerateStrategy();
-            String column = keyGenerateStrategyConfig.getColumn();
-            String keyGenerator = keyGenerateStrategyConfig.getKeyGeneratorName();
-            result.append(String.format(DistSQLScriptConstants.KEY_GENERATOR_STRATEGY, column, keyGenerator));
+            result.append(String.format(DistSQLScriptConstants.KEY_GENERATOR_STRATEGY, keyGenerateStrategyConfig.getColumn(), keyGenerateStrategyConfig.getKeyGeneratorName()));
         }
         return result.substring(0, result.lastIndexOf(","));
     }
     
-    private void getStrategy(final ShardingStrategyConfiguration shardingStrategyConfiguration, final String strategyType, final StringBuilder result) {
+    private void appendStrategy(final ShardingStrategyConfiguration shardingStrategyConfiguration, final String strategyType, final StringBuilder result) {
         String type = shardingStrategyConfiguration.getType().toLowerCase();
         String shardingAlgorithmName = shardingStrategyConfiguration.getShardingAlgorithmName();
         switch (type) {
             case DistSQLScriptConstants.STANDARD:
                 StandardShardingStrategyConfiguration standardShardingStrategyConfig = (StandardShardingStrategyConfiguration) shardingStrategyConfiguration;
-                String shardingColumn = standardShardingStrategyConfig.getShardingColumn();
-                result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_STANDARD, strategyType, type, shardingColumn, shardingAlgorithmName));
+                result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_STANDARD, strategyType, type, standardShardingStrategyConfig.getShardingColumn(), shardingAlgorithmName));
                 break;
             case DistSQLScriptConstants.COMPLEX:
                 ComplexShardingStrategyConfiguration complexShardingStrategyConfig = (ComplexShardingStrategyConfiguration) shardingStrategyConfiguration;
-                String shardingColumns = complexShardingStrategyConfig.getShardingColumns();
-                result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_COMPLEX, strategyType, type, shardingColumns, shardingAlgorithmName));
+                result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_COMPLEX, strategyType, type, complexShardingStrategyConfig.getShardingColumns(), shardingAlgorithmName));
                 break;
             case DistSQLScriptConstants.HINT:
                 result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_HINT, type, shardingAlgorithmName));
@@ -333,350 +277,230 @@ public final class ConvertYamlConfigurationHandler extends QueryableRALBackendHa
         }
     }
     
-    private void appendShardingBindingTableRules(final ShardingRuleConfiguration shardingRuleConfig, final StringBuilder result) {
-        String bindings = getBindings(shardingRuleConfig.getBindingTableGroups().iterator());
-        result.append(String.format(DistSQLScriptConstants.SHARDING_BINDING_TABLE_RULES, bindings));
-    }
-    
-    private String getBindings(final Iterator<String> iterator) {
-        StringBuilder result = new StringBuilder();
+    private void appendShardingBindingTableRules(final ShardingRuleConfiguration ruleConfig, final StringBuilder result) {
+        if (ruleConfig.getBindingTableGroups().isEmpty()) {
+            return;
+        }
+        result.append(DistSQLScriptConstants.SHARDING_BINDING_TABLE_RULES);
+        Iterator<String> iterator = ruleConfig.getBindingTableGroups().iterator();
         while (iterator.hasNext()) {
-            String binding = iterator.next();
-            result.append(String.format(DistSQLScriptConstants.BRACKET, binding));
+            result.append(String.format(DistSQLScriptConstants.BINDING_TABLES, iterator.next()));
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
-        return result.toString();
-    }
-    
-    private void appendShardingBroadcastTableRules(final ShardingRuleConfiguration shardingRuleConfig, final StringBuilder result) {
-        String broadcast = getBroadcast(shardingRuleConfig.getBroadcastTables());
-        result.append(String.format(DistSQLScriptConstants.BROADCAST_TABLE_RULE, broadcast));
-    }
-    
-    private String getBroadcast(final Collection<String> broadcastTables) {
-        return Joiner.on(",").join(broadcastTables) + DistSQLScriptConstants.SEMI + System.lineSeparator();
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
     }
     
-    private void appendReadWriteSplittingRules(final Collection<YamlRuleConfiguration> ruleConfigs, final StringBuilder result) {
-        if (ruleConfigs.isEmpty()) {
+    private void appendShardingBroadcastTableRules(final ShardingRuleConfiguration ruleConfig, final StringBuilder result) {
+        if (ruleConfig.getBroadcastTables().isEmpty()) {
             return;
         }
-        result.append(DistSQLScriptConstants.CREATE_READWRITE_SPLITTING_RULE);
-        for (YamlRuleConfiguration ruleConfig : ruleConfigs) {
-            appendStaticReadWriteSplittingRule(ruleConfig, result);
-            // TODO Dynamic READ-WRITE-SPLITTING RULES
-        }
+        result.append(String.format(DistSQLScriptConstants.BROADCAST_TABLE_RULE, String.join(",", ruleConfig.getBroadcastTables())));
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
     }
     
-    private void appendStaticReadWriteSplittingRule(final YamlRuleConfiguration ruleConfig, final StringBuilder result) {
-        Iterator<Entry<String, YamlReadwriteSplittingDataSourceRuleConfiguration>> dataSources = ((YamlReadwriteSplittingRuleConfiguration) ruleConfig).getDataSources().entrySet().iterator();
-        Iterator<Entry<String, YamlAlgorithmConfiguration>> loadBalancers = ((YamlReadwriteSplittingRuleConfiguration) ruleConfig).getLoadBalancers().entrySet().iterator();
-        while (dataSources.hasNext()) {
-            Entry<String, YamlReadwriteSplittingDataSourceRuleConfiguration> entryDataSources = dataSources.next();
-            Entry<String, YamlAlgorithmConfiguration> entryLoadBalances = loadBalancers.next();
-            YamlStaticReadwriteSplittingStrategyConfiguration staticStrategy = entryDataSources.getValue().getStaticStrategy();
-            String dataSourceName = entryDataSources.getKey();
-            String writeDataSourceName = staticStrategy.getWriteDataSourceName();
-            String readDataSourceNames = appendReadDataSourceNames(staticStrategy.getReadDataSourceNames());
-            String loadBalancerType = appendLoadBalancer(entryDataSources.getValue().getLoadBalancerName(), entryLoadBalances);
-            result.append(String.format(DistSQLScriptConstants.READWRITE_SPLITTING, dataSourceName, writeDataSourceName, readDataSourceNames, loadBalancerType));
-            if (dataSources.hasNext()) {
-                result.append(DistSQLScriptConstants.COMMA);
-            }
+    private void appendReadWriteSplittingDistSQL(final YamlReadwriteSplittingRuleConfiguration yamlRuleConfig, final StringBuilder result) {
+        ReadwriteSplittingRuleConfiguration ruleConfig = new YamlReadwriteSplittingRuleConfigurationSwapper().swapToObject(yamlRuleConfig);
+        if (ruleConfig.getDataSources().isEmpty()) {
+            return;
         }
-        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+        result.append(DistSQLScriptConstants.CREATE_READWRITE_SPLITTING_RULE);
+        appendStaticReadWriteSplittingRule(ruleConfig, result);
+        // TODO Dynamic READ-WRITE-SPLITTING RULES
     }
     
-    private String appendReadDataSourceNames(final Collection<String> readDataSourceNames) {
-        StringBuilder result = new StringBuilder();
-        Iterator<String> iterator = readDataSourceNames.iterator();
+    private void appendStaticReadWriteSplittingRule(final ReadwriteSplittingRuleConfiguration ruleConfig, final StringBuilder result) {
+        Iterator<ReadwriteSplittingDataSourceRuleConfiguration> iterator = ruleConfig.getDataSources().iterator();
         while (iterator.hasNext()) {
-            String readDataSourceName = iterator.next();
-            result.append(String.format(DistSQLScriptConstants.READ_RESOURCE, readDataSourceName));
+            ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig = iterator.next();
+            StaticReadwriteSplittingStrategyConfiguration staticStrategy = dataSourceRuleConfig.getStaticStrategy();
+            String readDataSourceNames = getReadDataSourceNames(staticStrategy.getReadDataSourceNames());
+            String loadBalancerType = getLoadBalancerType(ruleConfig.getLoadBalancers().get(dataSourceRuleConfig.getLoadBalancerName()));
+            result.append(String.format(DistSQLScriptConstants.READWRITE_SPLITTING, dataSourceRuleConfig.getName(), staticStrategy.getWriteDataSourceName(), readDataSourceNames, loadBalancerType));
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        return result.toString();
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
     }
     
-    private String appendLoadBalancer(final String loadBalancerName, final Entry<String, YamlAlgorithmConfiguration> loadBalancers) {
+    private String getLoadBalancerType(final AlgorithmConfiguration algorithmConfig) {
         StringBuilder result = new StringBuilder();
-        String loadBalancerProperties = "";
-        if (loadBalancers.getValue().getProps().isEmpty()) {
-            result.append(String.format(DistSQLScriptConstants.READWRITE_SPLITTING_TYPE, loadBalancers.getValue().getType()));
-        } else {
-            Iterator<Entry<Object, Object>> iterator = loadBalancers.getValue().getProps().entrySet().iterator();
-            while (iterator.hasNext()) {
-                Entry<Object, Object> entry = iterator.next();
-                if (loadBalancerName == entry.getKey()) {
-                    loadBalancerProperties = appendLoadBalancerProperties(loadBalancers.getValue().getProps());
-                }
-            }
-            result.append(String.format(DistSQLScriptConstants.READWRITE_SPLITTING_TYPE_PROPERTIES, loadBalancers.getValue().getType(), loadBalancerProperties));
+        String loadBalancerType = getAlgorithmType(algorithmConfig);
+        if (!Strings.isNullOrEmpty(loadBalancerType)) {
+            result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator()).append(loadBalancerType).append(System.lineSeparator());
         }
         return result.toString();
     }
     
-    private String appendLoadBalancerProperties(final Properties loadBalancerProperties) {
+    private String getReadDataSourceNames(final Collection<String> readDataSourceNames) {
         StringBuilder result = new StringBuilder();
-        Iterator<Entry<Object, Object>> iterator = loadBalancerProperties.entrySet().iterator();
+        Iterator<String> iterator = readDataSourceNames.iterator();
         while (iterator.hasNext()) {
-            Entry<Object, Object> entry = iterator.next();
-            result.append(String.format(DistSQLScriptConstants.PROPERTY, entry.getKey(), entry.getValue()));
-            while (iterator.hasNext()) {
+            result.append(String.format(DistSQLScriptConstants.READ_RESOURCE, iterator.next()));
+            if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
         return result.toString();
     }
     
-    private void appendDatabaseDiscoveryRules(final Collection<YamlRuleConfiguration> ruleConfigs, final StringBuilder result) {
-        if (ruleConfigs.isEmpty()) {
+    private void appendDatabaseDiscoveryDistSQL(final YamlDatabaseDiscoveryRuleConfiguration yamlRuleConfig, final StringBuilder result) {
+        DatabaseDiscoveryRuleConfiguration ruleConfig = new YamlDatabaseDiscoveryRuleConfigurationSwapper().swapToObject(yamlRuleConfig);
+        if (ruleConfig.getDataSources().isEmpty()) {
             return;
         }
         result.append(DistSQLScriptConstants.CREATE_DB_DISCOVERY);
-        for (YamlRuleConfiguration ruleConfig : ruleConfigs) {
-            Iterator<Entry<String, YamlDatabaseDiscoveryDataSourceRuleConfiguration>> dataSourcesIterator =
-                    ((YamlDatabaseDiscoveryRuleConfiguration) ruleConfig).getDataSources().entrySet().iterator();
-            while (dataSourcesIterator.hasNext()) {
-                Entry<String, YamlDatabaseDiscoveryDataSourceRuleConfiguration> entry = dataSourcesIterator.next();
-                String databaseDiscoveryName = entry.getKey();
-                String databaseSourceNames = getDatabaseDiscoveryResources(entry.getValue().getDataSourceNames());
-                String databaseType = getDatabaseDiscoveryType(entry.getValue().getDiscoveryTypeName(), ruleConfig);
-                String databaseHeartbeatProperty = getDatabaseDiscoveryHeartbeat(entry.getValue().getDiscoveryHeartbeatName(), ruleConfig);
-                result.append(String.format(DistSQLScriptConstants.DB_DISCOVERY, databaseDiscoveryName, databaseSourceNames, databaseType, databaseHeartbeatProperty));
-                if (dataSourcesIterator.hasNext()) {
-                    result.append(DistSQLScriptConstants.COMMA);
-                }
-            }
-            result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
-        }
-    }
-    
-    private String getDatabaseDiscoveryResources(final Collection<String> databaseDiscoveryNames) {
-        StringBuilder result = new StringBuilder();
-        Iterator<String> iterator = databaseDiscoveryNames.iterator();
+        Iterator<DatabaseDiscoveryDataSourceRuleConfiguration> iterator = ruleConfig.getDataSources().iterator();
         while (iterator.hasNext()) {
-            String databaseDiscoveryName = iterator.next();
-            result.append(databaseDiscoveryName);
+            DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfig = iterator.next();
+            String groupName = dataSourceRuleConfig.getGroupName();
+            String dataSourceNames = String.join(",", dataSourceRuleConfig.getDataSourceNames());
+            String databaseType = getAlgorithmType(ruleConfig.getDiscoveryTypes().get(dataSourceRuleConfig.getDiscoveryTypeName()));
+            String databaseHeartbeatProperty = getDatabaseDiscoveryHeartbeat(ruleConfig.getDiscoveryHeartbeats().get(dataSourceRuleConfig.getDiscoveryHeartbeatName()));
+            result.append(String.format(DistSQLScriptConstants.DB_DISCOVERY, groupName, dataSourceNames, databaseType, databaseHeartbeatProperty));
             if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA);
             }
         }
-        return result.toString();
-    }
-    
-    private String getDatabaseDiscoveryHeartbeat(final String discoveryHeartbeatName, final YamlRuleConfiguration ruleConfig) {
-        StringBuilder result = new StringBuilder();
-        Iterator<Entry<String, YamlDatabaseDiscoveryHeartBeatConfiguration>> discoveryHeartbeatsConfigs =
-                ((YamlDatabaseDiscoveryRuleConfiguration) ruleConfig).getDiscoveryHeartbeats().entrySet().iterator();
-        while (discoveryHeartbeatsConfigs.hasNext()) {
-            Entry<String, YamlDatabaseDiscoveryHeartBeatConfiguration> entry = discoveryHeartbeatsConfigs.next();
-            if (entry.getKey().equals(discoveryHeartbeatName)) {
-                getDatabaseDiscoveryProperties(entry.getValue().getProps(), result);
-            }
-        }
-        return result.toString();
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
     }
     
-    private String getDatabaseDiscoveryType(final String discoveryTypeName, final YamlRuleConfiguration ruleConfig) {
+    private String getDatabaseDiscoveryHeartbeat(final DatabaseDiscoveryHeartBeatConfiguration heartBeatConfig) {
         StringBuilder result = new StringBuilder();
-        StringBuilder properties = new StringBuilder();
-        Iterator<Entry<String, YamlAlgorithmConfiguration>> discoveryTypes = ((YamlDatabaseDiscoveryRuleConfiguration) ruleConfig).getDiscoveryTypes().entrySet().iterator();
-        while (discoveryTypes.hasNext()) {
-            Entry<String, YamlAlgorithmConfiguration> entry = discoveryTypes.next();
-            if (entry.getKey().equals(discoveryTypeName)) {
-                getDatabaseDiscoveryProperties(entry.getValue().getProps(), properties);
-                String typeName = entry.getValue().getType();
-                String typePros = properties.toString();
-                result.append(String.format(DistSQLScriptConstants.TYPE, typeName, typePros));
-            }
+        if (null == heartBeatConfig) {
+            return result.toString();
         }
+        result.append(getAlgorithmProperties(heartBeatConfig.getProps()));
         return result.toString();
     }
     
-    private void getDatabaseDiscoveryProperties(final Properties heartbeatProperties, final StringBuilder result) {
-        Iterator<Entry<Object, Object>> props = heartbeatProperties.entrySet().iterator();
-        while (props.hasNext()) {
-            Entry<Object, Object> entry = props.next();
-            result.append(String.format(DistSQLScriptConstants.PROPERTY, entry.getKey(), entry.getValue()));
-        }
-    }
-    
-    private void appendEncryptRules(final Collection<YamlRuleConfiguration> ruleConfigs, final StringBuilder result) {
-        if (ruleConfigs.isEmpty()) {
+    private void appendEncryptDistSQL(final YamlEncryptRuleConfiguration yamlRuleConfig, final StringBuilder result) {
+        EncryptRuleConfiguration ruleConfig = new YamlEncryptRuleConfigurationSwapper().swapToObject(yamlRuleConfig);
+        if (ruleConfig.getTables().isEmpty()) {
             return;
         }
         result.append(DistSQLScriptConstants.CREATE_ENCRYPT);
-        for (YamlRuleConfiguration ruleConfig : ruleConfigs) {
-            Iterator<Entry<String, YamlEncryptTableRuleConfiguration>> encryptTables = ((YamlEncryptRuleConfiguration) ruleConfig).getTables().entrySet().iterator();
-            while (encryptTables.hasNext()) {
-                Entry<String, YamlEncryptTableRuleConfiguration> entry = encryptTables.next();
-                String tableName = entry.getKey();
-                String columns = getEncryptColumns(entry.getValue().getColumns(), ruleConfig);
-                String queryWithCipher = getQueryWithCipher(entry.getValue().getQueryWithCipherColumn(), ruleConfig);
-                result.append(String.format(DistSQLScriptConstants.ENCRYPT, tableName, columns, queryWithCipher));
-                if (encryptTables.hasNext()) {
-                    result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
-                }
+        Iterator<EncryptTableRuleConfiguration> iterator = ruleConfig.getTables().iterator();
+        while (iterator.hasNext()) {
+            EncryptTableRuleConfiguration tableRuleConfig = iterator.next();
+            String tableName = tableRuleConfig.getName();
+            String columns = getEncryptColumns(tableRuleConfig.getColumns(), ruleConfig.getEncryptors());
+            boolean queryWithCipher = null != tableRuleConfig.getQueryWithCipherColumn() ? tableRuleConfig.getQueryWithCipherColumn() : true;
+            result.append(String.format(DistSQLScriptConstants.ENCRYPT, tableName, columns, queryWithCipher));
+            if (iterator.hasNext()) {
+                result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
             }
-            result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
         }
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
     }
     
-    private String getEncryptColumns(final Map<String, YamlEncryptColumnRuleConfiguration> columns, final YamlRuleConfiguration ruleConfig) {
+    private String getEncryptColumns(final Collection<EncryptColumnRuleConfiguration> ruleConfigs, final Map<String, AlgorithmConfiguration> encryptors) {
         StringBuilder result = new StringBuilder();
-        Iterator<Entry<String, YamlEncryptColumnRuleConfiguration>> columnsIter = columns.entrySet().iterator();
-        while (columnsIter.hasNext()) {
-            Entry<String, YamlEncryptColumnRuleConfiguration> entry = columnsIter.next();
-            String columnName = entry.getKey();
-            String columnPlainAndCipher = getColumnPlainAndCipher(entry.getValue());
-            String columnType = getColumnType(entry.getValue().getEncryptorName(), ruleConfig);
-            result.append(String.format(DistSQLScriptConstants.ENCRYPT_COLUMN, columnName, columnPlainAndCipher, columnType));
-            if (columnsIter.hasNext()) {
+        Iterator<EncryptColumnRuleConfiguration> iterator = ruleConfigs.iterator();
+        while (iterator.hasNext()) {
+            EncryptColumnRuleConfiguration columnRuleConfig = iterator.next();
+            String columnType = getAlgorithmType(encryptors.get(columnRuleConfig.getEncryptorName()));
+            result.append(String.format(DistSQLScriptConstants.ENCRYPT_COLUMN, columnRuleConfig.getLogicColumn(), getColumnPlainAndCipher(columnRuleConfig), columnType));
+            if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
             }
         }
         return result.toString();
     }
     
-    private String getColumnPlainAndCipher(final YamlEncryptColumnRuleConfiguration encryptColumnRuleConfiguration) {
+    private String getColumnPlainAndCipher(final EncryptColumnRuleConfiguration ruleConfig) {
         StringBuilder result = new StringBuilder();
-        String plainColumnName = encryptColumnRuleConfiguration.getPlainColumn();
-        String cipherColumnName = encryptColumnRuleConfiguration.getCipherColumn();
+        String plainColumnName = ruleConfig.getPlainColumn();
+        String cipherColumnName = ruleConfig.getCipherColumn();
         if (null != plainColumnName) {
             result.append(String.format(DistSQLScriptConstants.PLAIN, plainColumnName));
         }
         if (null != cipherColumnName) {
             if (null != plainColumnName) {
-                result.append(DistSQLScriptConstants.COMMA);
+                result.append(DistSQLScriptConstants.COMMA).append(" ");
             }
             result.append(String.format(DistSQLScriptConstants.CIPHER, cipherColumnName));
         }
         return result.toString();
     }
     
-    private String getColumnType(final String encryptorName, final YamlRuleConfiguration ruleConfig) {
-        StringBuilder result = new StringBuilder();
-        Iterator<Entry<String, YamlAlgorithmConfiguration>> encryptorConfigs = ((YamlEncryptRuleConfiguration) ruleConfig).getEncryptors().entrySet().iterator();
-        while (encryptorConfigs.hasNext()) {
-            Entry<String, YamlAlgorithmConfiguration> entry = encryptorConfigs.next();
-            if (entry.getKey().equals(encryptorName)) {
-                String typeName = entry.getValue().getType();
-                if (entry.getValue().getProps().isEmpty()) {
-                    result.append(String.format(DistSQLScriptConstants.ENCRYPT_TYPE_WITHOUT_PROPERTIES, typeName));
-                } else {
-                    String properties = getColumnTypeProperties(entry.getValue().getProps());
-                    result.append(String.format(DistSQLScriptConstants.TYPE, typeName, properties));
-                }
-            }
-        }
-        return result.toString();
-    }
-    
-    private String getColumnTypeProperties(final Properties properties) {
-        StringBuilder result = new StringBuilder();
-        Iterator<Entry<Object, Object>> props = properties.entrySet().iterator();
-        while (props.hasNext()) {
-            Entry<Object, Object> entry = props.next();
-            result.append(String.format(DistSQLScriptConstants.PROPERTY, entry.getKey(), entry.getValue()));
-            if (props.hasNext()) {
-                result.append(DistSQLScriptConstants.COMMA);
-            }
-        }
-        return result.toString();
-    }
-    
-    private String getQueryWithCipher(final Boolean queryWithCipherColumn, final YamlRuleConfiguration ruleConfig) {
-        return String.valueOf(null == queryWithCipherColumn ? ((YamlEncryptRuleConfiguration) ruleConfig).isQueryWithCipherColumn() : queryWithCipherColumn.toString().toLowerCase());
-    }
-    
-    private void appendShadowRules(final Collection<YamlRuleConfiguration> ruleConfigs, final StringBuilder result) {
-        if (ruleConfigs.isEmpty()) {
+    private void appendShadowDistSQL(final YamlShadowRuleConfiguration yamlRuleConfig, final StringBuilder result) {
+        ShadowRuleConfiguration ruleConfig = new YamlShadowRuleConfigurationSwapper().swapToObject(yamlRuleConfig);
+        if (ruleConfig.getDataSources().isEmpty()) {
             return;
         }
         result.append(DistSQLScriptConstants.CREATE_SHADOW);
-        for (YamlRuleConfiguration ruleConfig : ruleConfigs) {
-            Iterator<Entry<String, YamlShadowDataSourceConfiguration>> shadowDataSourcesIter = ((YamlShadowRuleConfiguration) ruleConfig).getDataSources().entrySet().iterator();
-            while (shadowDataSourcesIter.hasNext()) {
-                Entry<String, YamlShadowDataSourceConfiguration> entry = shadowDataSourcesIter.next();
-                String shadowRuleName = entry.getKey();
-                String source = entry.getValue().getProductionDataSourceName();
-                String shadow = entry.getValue().getShadowDataSourceName();
-                String shadowTables = getShadowTables(entry.getKey(), ruleConfig);
-                result.append(String.format(DistSQLScriptConstants.SHADOW, shadowRuleName, source, shadow, shadowTables));
-                if (shadowDataSourcesIter.hasNext()) {
-                    result.append(DistSQLScriptConstants.COMMA);
-                }
+        Iterator<Entry<String, ShadowDataSourceConfiguration>> iterator = ruleConfig.getDataSources().entrySet().iterator();
+        while (iterator.hasNext()) {
+            Entry<String, ShadowDataSourceConfiguration> dataSourceConfig = iterator.next();
+            String source = dataSourceConfig.getValue().getProductionDataSourceName();
+            String shadow = dataSourceConfig.getValue().getShadowDataSourceName();
+            String shadowRuleName = dataSourceConfig.getKey();
+            String shadowTables = getShadowTables(shadowRuleName, ruleConfig.getTables(), ruleConfig.getShadowAlgorithms());
+            result.append(String.format(DistSQLScriptConstants.SHADOW, shadowRuleName, source, shadow, shadowTables));
+            if (iterator.hasNext()) {
+                result.append(DistSQLScriptConstants.COMMA);
             }
-            result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
         }
+        result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
     }
     
-    private String getShadowTables(final String shadowName, final YamlRuleConfiguration ruleConfig) {
+    private String getShadowTables(final String shadowRuleName, final Map<String, ShadowTableConfiguration> ruleConfig, final Map<String, AlgorithmConfiguration> algorithmConfigs) {
         StringBuilder result = new StringBuilder();
-        Iterator<Entry<String, YamlShadowTableConfiguration>> shadowTablesIter = ((YamlShadowRuleConfiguration) ruleConfig).getTables().entrySet().iterator();
-        while (shadowTablesIter.hasNext()) {
-            Entry<String, YamlShadowTableConfiguration> entry = shadowTablesIter.next();
-            if (isBelongToShadowRule(shadowName, entry.getValue().getDataSourceNames())) {
-                String tableName = entry.getKey();
-                String tableTypes = getShadowTableTypes(entry.getValue().getShadowAlgorithmNames(), ruleConfig);
-                result.append(String.format(DistSQLScriptConstants.SHADOW_TABLE, tableName, tableTypes));
+        Iterator<Entry<String, ShadowTableConfiguration>> iterator = ruleConfig.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Entry<String, ShadowTableConfiguration> shadowTableConfig = iterator.next();
+            if (shadowTableConfig.getValue().getDataSourceNames().contains(shadowRuleName)) {
+                String shadowTableTypes = getShadowTableTypes(shadowTableConfig.getValue().getShadowAlgorithmNames(), algorithmConfigs);
+                result.append(String.format(DistSQLScriptConstants.SHADOW_TABLE, shadowTableConfig.getKey(), shadowTableTypes));
             }
-            if (shadowTablesIter.hasNext()) {
+            if (iterator.hasNext()) {
                 result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
             }
         }
         return result.toString();
     }
     
-    private Boolean isBelongToShadowRule(final String shadowName, final Collection<String> dataSourceNames) {
-        Iterator<String> dataSourceNamesIter = dataSourceNames.iterator();
-        while (dataSourceNamesIter.hasNext()) {
-            String dataSourceName = dataSourceNamesIter.next();
-            if (dataSourceName.equals(shadowName)) {
-                return true;
+    private String getShadowTableTypes(final Collection<String> shadowAlgorithmNames, final Map<String, AlgorithmConfiguration> algorithmConfigs) {
+        StringBuilder result = new StringBuilder();
+        Iterator<String> iterator = shadowAlgorithmNames.iterator();
+        while (iterator.hasNext()) {
+            result.append(getAlgorithmType(algorithmConfigs.get(iterator.next())));
+            if (iterator.hasNext()) {
+                result.append(DistSQLScriptConstants.COMMA).append(" ");
             }
         }
-        return false;
+        return result.toString();
     }
     
-    private String getShadowTableTypes(final Collection<String> shadowAlgorithmNames, final YamlRuleConfiguration ruleConfig) {
+    private String getAlgorithmType(final AlgorithmConfiguration algorithmConfig) {
         StringBuilder result = new StringBuilder();
-        Iterator<String> shadowAlgorithmNamesIter = shadowAlgorithmNames.iterator();
-        while (shadowAlgorithmNamesIter.hasNext()) {
-            String shadowAlgorithmName = shadowAlgorithmNamesIter.next();
-            Iterator<Entry<String, YamlAlgorithmConfiguration>> shadowAlgorithmsIter = ((YamlShadowRuleConfiguration) ruleConfig).getShadowAlgorithms().entrySet().iterator();
-            while (shadowAlgorithmsIter.hasNext()) {
-                Entry<String, YamlAlgorithmConfiguration> entry = shadowAlgorithmsIter.next();
-                if (entry.getKey().equals(shadowAlgorithmName)) {
-                    String typeName = entry.getValue().getType();
-                    String typeProperties = getAlgorithmProperties(entry.getValue().getProps());
-                    result.append(String.format(DistSQLScriptConstants.SHADOW_TABLE_TYPE, typeName, typeProperties));
-                }
-            }
-            if (shadowAlgorithmNamesIter.hasNext()) {
-                result.append(DistSQLScriptConstants.COMMA);
-            }
+        if (null == algorithmConfig) {
+            return result.toString();
+        }
+        String type = algorithmConfig.getType().toLowerCase();
+        if (algorithmConfig.getProps().isEmpty()) {
+            result.append(String.format(DistSQLScriptConstants.ALGORITHM_TYPE_WITHOUT_PROPERTIES, type));
+        } else {
+            result.append(String.format(DistSQLScriptConstants.ALGORITHM_TYPE, type, getAlgorithmProperties(algorithmConfig.getProps())));
         }
         return result.toString();
     }
     
-    private String getAlgorithmProperties(final Properties algorithmProperties) {
+    private String getAlgorithmProperties(final Properties properties) {
         StringBuilder result = new StringBuilder();
-        SortedMap<String, String> sortedMap = new TreeMap(algorithmProperties);
-        Set<String> set = sortedMap.keySet();
-        Iterator<String> prosIter = set.iterator();
-        while (prosIter.hasNext()) {
-            String prosKey = prosIter.next();
-            String prosValue = algorithmProperties.getProperty(prosKey);
-            result.append(String.format(DistSQLScriptConstants.PROPERTY, prosKey, prosValue));
-            if (prosIter.hasNext()) {
-                result.append(DistSQLScriptConstants.COMMA);
+        Iterator<String> iterator = new TreeMap(properties).keySet().iterator();
+        while (iterator.hasNext()) {
+            String key = iterator.next();
+            String value = properties.getProperty(key);
+            if (null == value) {
+                continue;
+            }
+            result.append(String.format(DistSQLScriptConstants.PROPERTY, key, value));
+            if (iterator.hasNext()) {
+                result.append(DistSQLScriptConstants.COMMA).append(" ");
             }
         }
         return result.toString();
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
index 8e8fa524b61..33dab4ec1ad 100644
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
@@ -19,12 +19,9 @@ package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.proxy.backend.util.ProxyContextRestorer;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -38,15 +35,12 @@ import java.util.Map;
 import java.util.Objects;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 
-public final class ConvertYamlConfigurationHandlerTest extends ProxyContextRestorer {
-    
-    private final String resourceFilePath = "/conf/convert/config-resource.yaml";
+public final class ConvertYamlConfigurationHandlerTest {
     
     private final String shardingFilePath = "/conf/convert/config-sharding.yaml";
     
@@ -58,8 +52,6 @@ public final class ConvertYamlConfigurationHandlerTest extends ProxyContextResto
     
     private final String shadowFilePath = "/conf/convert/config-shadow.yaml";
     
-    private final String resourceExpectedFilePath = "/expected/convert-add-resource.yaml";
-    
     private final String shardingExpectedFilePath = "/expected/convert-create-sharding.yaml";
     
     private final String readWriteSplittingExpectedFilePath = "/expected/convert-readwrite-splitting.yaml";
@@ -70,8 +62,6 @@ public final class ConvertYamlConfigurationHandlerTest extends ProxyContextResto
     
     private final String shadowExpectedFilePath = "/expected/convert-create-shadow.yaml";
     
-    private final String resource = "resource";
-    
     private final String sharding = "sharding";
     
     private final String readWriteSplitting = "readWriteSplitting";
@@ -86,7 +76,6 @@ public final class ConvertYamlConfigurationHandlerTest extends ProxyContextResto
     
     @Before
     public void setup() {
-        featureMap.put(resource, resourceFilePath);
         featureMap.put(sharding, shardingFilePath);
         featureMap.put(readWriteSplitting, readWriteSplittingFilePath);
         featureMap.put(databaseDiscovery, databaseDiscoveryFilePath);
@@ -94,39 +83,28 @@ public final class ConvertYamlConfigurationHandlerTest extends ProxyContextResto
         featureMap.put(shadow, shadowFilePath);
     }
     
-    @Before
-    public void init() {
-        ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        ProxyContext.init(contextManager);
-    }
-    
-    @Test
-    public void assertExecuteWithAddResource() throws SQLException {
-        assertExecute(resource, resourceExpectedFilePath);
-    }
-    
     @Test
-    public void assertExecuteWithCreateSharding() throws SQLException {
+    public void assertExecuteWithSharding() throws SQLException {
         assertExecute(sharding, shardingExpectedFilePath);
     }
     
     @Test
-    public void assertExecuteWithCreateReadWriteSplitting() throws SQLException {
+    public void assertExecuteWithReadWriteSplitting() throws SQLException {
         assertExecute(readWriteSplitting, readWriteSplittingExpectedFilePath);
     }
     
     @Test
-    public void assertExecuteWithCreateDatabaseDiscovery() throws SQLException {
+    public void assertExecuteWithDatabaseDiscovery() throws SQLException {
         assertExecute(databaseDiscovery, databaseDiscoveryExpectedFilePath);
     }
     
     @Test
-    public void assertExecuteWithCreateEncrypt() throws SQLException {
+    public void assertExecuteWithEncrypt() throws SQLException {
         assertExecute(encrypt, encryptExpectedFilePath);
     }
     
     @Test
-    public void assertExecuteWithCreateShadow() throws SQLException {
+    public void assertExecuteWithShadow() throws SQLException {
         assertExecute(shadow, shadowExpectedFilePath);
     }
     
@@ -174,7 +152,7 @@ public final class ConvertYamlConfigurationHandlerTest extends ProxyContextResto
                 BufferedReader reader = new BufferedReader(fileReader)) {
             String line;
             while (null != (line = reader.readLine())) {
-                if (!line.startsWith("#") && !line.trim().isEmpty()) {
+                if (!line.startsWith("#")) {
                     result.append(line).append(System.lineSeparator());
                 }
             }
diff --git a/proxy/backend/src/test/resources/expected/convert-add-resource.yaml b/proxy/backend/src/test/resources/expected/convert-add-resource.yaml
deleted file mode 100644
index ec5f87d9cc7..00000000000
--- a/proxy/backend/src/test/resources/expected/convert-add-resource.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# 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.
-#
-
-CREATE DATABASE resource_db;
-USE resource_db;
-REGISTER STORAGE UNIT ds_0 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_resource_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50","autoCommit"="false")
-), ds_1 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_resource_ds_1?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50","autoCommit"="false")
-), ds_2 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_resource_ds_2?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50","autoCommit"="false")
-);
diff --git a/proxy/backend/src/test/resources/expected/convert-create-encrypt.yaml b/proxy/backend/src/test/resources/expected/convert-create-encrypt.yaml
index 67791b5630e..f6c2241dbfb 100644
--- a/proxy/backend/src/test/resources/expected/convert-create-encrypt.yaml
+++ b/proxy/backend/src/test/resources/expected/convert-create-encrypt.yaml
@@ -14,22 +14,23 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 CREATE DATABASE encrypt_db;
 USE encrypt_db;
+
 REGISTER STORAGE UNIT ds_0 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_encrypt_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_encrypt_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), ds_1 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_encrypt_ds_1?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_encrypt_ds_1?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 );
+
 CREATE ENCRYPT RULE t_encrypt (
 COLUMNS(
-(NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME='AES', PROPERTIES("aes-key-value"="123456abc"))),
-(NAME=order_id,CIPHER=order_cipher,TYPE(NAME='MD5'))
+(NAME=user_id, PLAIN=user_plain, CIPHER=user_cipher, TYPE(NAME='aes', PROPERTIES('aes-key-value'='123456abc'))),
+(NAME=order_id, CIPHER=order_cipher, TYPE(NAME='md5'))
 ),QUERY_WITH_CIPHER_COLUMN=true);
diff --git a/proxy/backend/src/test/resources/expected/convert-create-shadow.yaml b/proxy/backend/src/test/resources/expected/convert-create-shadow.yaml
index e9349dd455a..ceee5de6ca6 100644
--- a/proxy/backend/src/test/resources/expected/convert-create-shadow.yaml
+++ b/proxy/backend/src/test/resources/expected/convert-create-shadow.yaml
@@ -14,24 +14,25 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 CREATE DATABASE shadow_db;
 USE shadow_db;
+
 REGISTER STORAGE UNIT ds (
-URL="jdbc:mysql://127.0.0.1:3306/demo_shadow_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_shadow_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), shadow_ds (
-URL="jdbc:mysql://127.0.0.1:3306/demo_shadow_ds_1?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_shadow_ds_1?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 );
+
 CREATE SHADOW RULE shadowDataSource(
 SOURCE=ds,
 SHADOW=shadow_ds,
-t_order(TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="insert","regex"="[1]")),TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="select","regex"="[1]"))),
-t_order_item(TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="insert","regex"="[1]")),TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="update","regex"="[1]")),TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="select","regex"="[1]"))),
-t_address(TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="insert","regex"="[1]")),TYPE(NAME="REGEX_MATCH", PROPERTIES("column"="user_id","operation"="select","regex"="[1]")),TYPE(NAME="SIMPLE_HINT", PROPERTIES("foo"="bar")))
+t_order(TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='insert', 'regex'='[1]')), TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='select', 'regex'='[1]'))),
+t_order_item(TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='insert', 'regex'='[1]')), TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='update', 'regex'='[1]')), TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='select', 'regex'='[1]'))),
+t_address(TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='insert', 'regex'='[1]')), TYPE(NAME='regex_match', PROPERTIES('column'='user_id', 'operation'='select', 'regex'='[1]')), TYPE(NAME='simple_hint', PROPERTIES('foo'='bar')))
 );
diff --git a/proxy/backend/src/test/resources/expected/convert-create-sharding.yaml b/proxy/backend/src/test/resources/expected/convert-create-sharding.yaml
index 47f771397e6..8570a01e526 100644
--- a/proxy/backend/src/test/resources/expected/convert-create-sharding.yaml
+++ b/proxy/backend/src/test/resources/expected/convert-create-sharding.yaml
@@ -14,38 +14,43 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 CREATE DATABASE sharding_db;
 USE sharding_db;
+
 REGISTER STORAGE UNIT ds_0 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_sharding_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_sharding_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), ds_1 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_sharding_ds_1?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_sharding_ds_1?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 );
+
 CREATE SHARDING ALGORITHM database_inline (
-TYPE(NAME="inline", PROPERTIES("algorithm-expression"="ds_${user_id % 2}","datetime-lower"="2022-01-01 00:00:00"))
+TYPE(NAME='inline', PROPERTIES('algorithm-expression'='ds_${user_id % 2}', 'datetime-lower'='2022-01-01 00:00:00'))
 ), t_order_inline (
-TYPE(NAME="inline", PROPERTIES("algorithm-expression"="t_order_${order_id % 2}","datetime-lower"="2022-01-01 00:00:00"))
+TYPE(NAME='inline', PROPERTIES('algorithm-expression'='t_order_${order_id % 2}', 'datetime-lower'='2022-01-01 00:00:00'))
 ), t_order_item_inline (
-TYPE(NAME="inline", PROPERTIES("algorithm-expression"="t_order_item_${order_id % 2}","datetime-lower"="2022-01-01 00:00:00"))
+TYPE(NAME='inline', PROPERTIES('algorithm-expression'='t_order_item_${order_id % 2}', 'datetime-lower'='2022-01-01 00:00:00'))
 );
+
 CREATE SHARDING KEY GENERATOR snowflake (
-TYPE(NAME="SNOWFLAKE")
+TYPE(NAME='snowflake')
 );
+
 CREATE SHARDING TABLE RULE t_order (
-DATANODES("ds_${0..1}.t_order_${0..1}"),
-TABLE_STRATEGY(TYPE="complex", SHARDING_COLUMNS=order_id, user_id, SHARDING_ALGORITHM=t_order_inline),
+DATANODES('ds_${0..1}.t_order_${0..1}'),
+TABLE_STRATEGY(TYPE='complex', SHARDING_COLUMNS=order_id, user_id, SHARDING_ALGORITHM=t_order_inline),
 KEY_GENERATE_STRATEGY(COLUMN=order_id, KEY_GENERATOR=snowflake)
 ), t_order_item (
-DATANODES("ds_${0..1}.t_order_item_${0..1}"),
-TABLE_STRATEGY(TYPE="complex", SHARDING_COLUMNS=order_id, user_id, SHARDING_ALGORITHM=t_order_item_inline),
+DATANODES('ds_${0..1}.t_order_item_${0..1}'),
+TABLE_STRATEGY(TYPE='complex', SHARDING_COLUMNS=order_id, user_id, SHARDING_ALGORITHM=t_order_item_inline),
 KEY_GENERATE_STRATEGY(COLUMN=order_item_id, KEY_GENERATOR=snowflake)
 );
+
 CREATE SHARDING BINDING TABLE RULES (t_order,t_order_item);
+
 CREATE BROADCAST TABLE RULE t_order,t_order_item;
diff --git a/proxy/backend/src/test/resources/expected/convert-database-discovery.yaml b/proxy/backend/src/test/resources/expected/convert-database-discovery.yaml
index 18fc5ab531e..47e4941a02f 100644
--- a/proxy/backend/src/test/resources/expected/convert-database-discovery.yaml
+++ b/proxy/backend/src/test/resources/expected/convert-database-discovery.yaml
@@ -14,27 +14,28 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 CREATE DATABASE database_discovery_db;
 USE database_discovery_db;
+
 REGISTER STORAGE UNIT ds_0 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_primary_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_primary_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='3000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), ds_1 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_replica_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_replica_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='3000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), ds_2 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_replica_ds_1?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_replica_ds_1?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='3000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 );
+
 CREATE DB_DISCOVERY RULE readwrite_ds (
 STORAGE_UNITS(ds_0,ds_1,ds_2),
-TYPE(NAME='MySQL.MGR', PROPERTIES("group-name"="92504d5b-6dec-11e8-91ea-246e9612aaf1")),
-HEARTBEAT(PROPERTIES("keep-alive-cron"="0/5 * * * * ?"))
+TYPE(NAME='mysql.mgr', PROPERTIES('group-name'='92504d5b-6dec-11e8-91ea-246e9612aaf1')),
+HEARTBEAT(PROPERTIES('keep-alive-cron'='0/5 * * * * ?'))
 );
diff --git a/proxy/backend/src/test/resources/expected/convert-readwrite-splitting.yaml b/proxy/backend/src/test/resources/expected/convert-readwrite-splitting.yaml
index 81227a3f860..d2ff40bb39d 100644
--- a/proxy/backend/src/test/resources/expected/convert-readwrite-splitting.yaml
+++ b/proxy/backend/src/test/resources/expected/convert-readwrite-splitting.yaml
@@ -14,27 +14,28 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 CREATE DATABASE readwrite_splitting_db;
 USE readwrite_splitting_db;
+
 REGISTER STORAGE UNIT write_ds_0 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_write_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_write_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), read_ds_0 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_read_ds_0?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_read_ds_0?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 ), read_ds_1 (
-URL="jdbc:mysql://127.0.0.1:3306/demo_read_ds_1?serverTimezone=UTC&useSSL=false",
-USER="root",
-PASSWORD="12345678",
-PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="30000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+URL='jdbc:mysql://127.0.0.1:3306/demo_read_ds_1?serverTimezone=UTC&useSSL=false',
+USER='root',
+PASSWORD='12345678',
+PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='1800000', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='50')
 );
+
 CREATE READWRITE_SPLITTING RULE readwrite_ds (
 WRITE_STORAGE_UNIT=write_ds_0,
 READ_STORAGE_UNITS(read_ds_0,read_ds_1),
-TYPE(NAME="RANDOM")
+TYPE(NAME='random')
 );