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 1548c251880 CREATE SHARDING TABLE RULE (#19509)
1548c251880 is described below

commit 1548c2518800c4cc0ed500ebc0eea602cbbbfa9d
Author: Xin Huang <[email protected]>
AuthorDate: Wed Jul 27 01:02:57 2022 +0800

    CREATE SHARDING TABLE RULE (#19509)
    
    * create sharding table rule finish
    
    * create sharding table rule CI fix
    
    * sharding binding table rule finish
    
    * update database & table & key_generator strategy
    
    * update database & table & key_generator strategy function name and TODO
---
 .../common/constant/DistSQLScriptConstants.java    |  46 +++++++
 .../queryable/ConvertYamlConfigurationHandler.java | 146 ++++++++++++++++++++-
 2 files changed, 191 insertions(+), 1 deletion(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
index 292a6173554..bca7e53d1c5 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/constant/DistSQLScriptConstants.java
@@ -63,4 +63,50 @@ public final class DistSQLScriptConstants {
             + ")";
     
     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))"
+            + System.lineSeparator()
+            + ")";
+
+    public static final String CREATE_SHARDING_TABLE = "CREATE SHARDING TABLE 
RULE";
+
+    public static final String SHARDING_TABLE = " %s ("
+            + System.lineSeparator()
+            + "DATANODES(\"%s\"),"
+            + System.lineSeparator()
+            + "%s"
+            + System.lineSeparator()
+            + ")";
+
+    public static final String DATABASE_STRATEGY = "DATABASE_STRATEGY";
+
+    public static final String TABLE_STRATEGY = "TABLE_STRATEGY";
+
+    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),"
+            + System.lineSeparator();
+
+    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),"
+            + System.lineSeparator();
+
+    public static final String CREATE_KEY_GENERATOR = "CREATE SHARDING KEY 
GENERATOR";
+
+    public static final String KEY_GENERATOR = " %s ("
+            + System.lineSeparator()
+            + "TYPE(NAME=%s)"
+            + System.lineSeparator()
+            + ")";
+
+    public static final String SHARDING_BINDING_TABLE_RULES = "CREATE SHARDING 
BINDING TABLE RULES %s";
+
+    public static final String BINDING = "(%s)";
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
index 609eeefb3af..3d0a896ba4f 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
@@ -21,12 +21,14 @@ import com.google.common.base.Preconditions;
 import com.zaxxer.hikari.HikariDataSource;
 import org.apache.commons.lang3.StringUtils;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
+import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import 
org.apache.shardingsphere.infra.datasource.props.custom.CustomDataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.props.synonym.PoolPropertySynonyms;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRuleConfiguration;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration;
@@ -34,6 +36,14 @@ import 
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConf
 import 
org.apache.shardingsphere.proxy.backend.config.yaml.swapper.YamlProxyDataSourceConfigurationSwapper;
 import 
org.apache.shardingsphere.proxy.backend.text.distsql.ral.QueryableRALBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.distsql.ral.common.constant.DistSQLScriptConstants;
+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;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.yaml.swapper.ShardingRuleConfigurationYamlSwapper;
 
 import java.io.File;
 import java.io.IOException;
@@ -42,6 +52,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Properties;
 
 /**
  * Convert yaml configuration handler.
@@ -73,6 +84,7 @@ public class ConvertYamlConfigurationHandler extends 
QueryableRALBackendHandler<
         StringBuilder result = new StringBuilder();
         appendDatabase(yamlConfig.getDatabaseName(), result);
         appendResources(yamlConfig.getDataSources(), result);
+        appendRules(yamlConfig.getRules(), result);
         // TODO append rules by feature SPI
         return result.toString();
     }
@@ -96,7 +108,7 @@ public class ConvertYamlConfigurationHandler extends 
QueryableRALBackendHandler<
                 
stringBuilder.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
             }
         }
-        stringBuilder.append(DistSQLScriptConstants.SEMI);
+        
stringBuilder.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
     }
     
     private void appendResource(final String resourceName, final 
DataSourceProperties dataSourceProperties, final StringBuilder stringBuilder) {
@@ -135,4 +147,136 @@ public class ConvertYamlConfigurationHandler extends 
QueryableRALBackendHandler<
             }
         }
     }
+
+    private void appendRules(final Collection<YamlRuleConfiguration> rules, 
final StringBuilder stringBuilder) {
+        if (rules.isEmpty()) {
+            return;
+        }
+        for (YamlRuleConfiguration rule: rules) {
+            ShardingRuleConfiguration shardingRuleConfig = new 
ShardingRuleConfigurationYamlSwapper().swapToObject((YamlShardingRuleConfiguration)
 rule);
+            appendShardingAlgorithms(shardingRuleConfig, stringBuilder);
+            appendKeyGenerators(shardingRuleConfig, stringBuilder);
+            appendShardingTableRules(shardingRuleConfig, stringBuilder);
+            // TODO append autoTables
+            appendShardingBindingTableRules(shardingRuleConfig, stringBuilder);
+        }
+    }
+
+    private void appendShardingAlgorithms(final ShardingRuleConfiguration 
shardingRuleConfig, final StringBuilder stringBuilder) {
+        stringBuilder.append(DistSQLScriptConstants.CREATE_SHARDING_ALGORITHM);
+        Iterator<Entry<String, ShardingSphereAlgorithmConfiguration>> iterator 
= shardingRuleConfig.getShardingAlgorithms().entrySet().iterator();
+        while (iterator.hasNext()) {
+            Entry<String, ShardingSphereAlgorithmConfiguration> entry = 
iterator.next();
+            String shardingAlgorithmName = entry.getKey();
+            String algorithmType = entry.getValue().getType().toLowerCase();
+            String property = 
appendShardingAlgorithmProperties(entry.getValue().getProps());
+            
stringBuilder.append(String.format(DistSQLScriptConstants.SHARDING_ALGORITHM, 
shardingAlgorithmName, algorithmType, property));
+            if (iterator.hasNext()) {
+                stringBuilder.append(DistSQLScriptConstants.COMMA);
+            }
+        }
+        
stringBuilder.append(DistSQLScriptConstants.SEMI).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);
+            }
+        }
+        return result.toString();
+    }
+
+    private void appendKeyGenerators(final ShardingRuleConfiguration 
shardingRuleConfig, final StringBuilder stringBuilder) {
+        stringBuilder.append(DistSQLScriptConstants.CREATE_KEY_GENERATOR);
+        Iterator<Entry<String, ShardingSphereAlgorithmConfiguration>> iterator 
= shardingRuleConfig.getKeyGenerators().entrySet().iterator();
+        while (iterator.hasNext()) {
+            Entry<String, ShardingSphereAlgorithmConfiguration> entry = 
iterator.next();
+            String generatorName = entry.getKey();
+            String type = entry.getValue().getType();
+            
stringBuilder.append(String.format(DistSQLScriptConstants.KEY_GENERATOR, 
generatorName, type));
+            if (iterator.hasNext()) {
+                stringBuilder.append(DistSQLScriptConstants.COMMA);
+            }
+        }
+        
stringBuilder.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+    }
+
+    private void appendShardingTableRules(final ShardingRuleConfiguration 
shardingRuleConfig, final StringBuilder stringBuilder) {
+        stringBuilder.append(DistSQLScriptConstants.CREATE_SHARDING_TABLE);
+        Iterator<ShardingTableRuleConfiguration> iterator = 
shardingRuleConfig.getTables().iterator();
+        while (iterator.hasNext()) {
+            ShardingTableRuleConfiguration entry = iterator.next();
+            String tableName = entry.getLogicTable();
+            String dataNodes = entry.getActualDataNodes();
+            String strategy = appendTableStrategy(entry);
+            
stringBuilder.append(String.format(DistSQLScriptConstants.SHARDING_TABLE, 
tableName, dataNodes, strategy));
+            if (iterator.hasNext()) {
+                stringBuilder.append(DistSQLScriptConstants.COMMA);
+            }
+        }
+        
stringBuilder.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+    }
+
+    private String appendTableStrategy(final ShardingTableRuleConfiguration 
shardingTableRuleConfig) {
+        StringBuilder result = new StringBuilder();
+        if (null != shardingTableRuleConfig.getDatabaseShardingStrategy()) {
+            getStrategy(shardingTableRuleConfig.getDatabaseShardingStrategy(), 
DistSQLScriptConstants.DATABASE_STRATEGY, result);
+        }
+        if (null != shardingTableRuleConfig.getTableShardingStrategy()) {
+            getStrategy(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));
+        }
+        return result.substring(0, result.length() - 2);
+    }
+
+    private StringBuilder getStrategy(final ShardingStrategyConfiguration 
shardingStrategyConfiguration, final String strategyType, final StringBuilder 
result) {
+        String type = shardingStrategyConfiguration.getType().toLowerCase();
+        String shardingAlgorithmName = 
shardingStrategyConfiguration.getShardingAlgorithmName();
+        switch (type) {
+            case "standard":
+                StandardShardingStrategyConfiguration 
standardShardingStrategyConfig = (StandardShardingStrategyConfiguration) 
shardingStrategyConfiguration;
+                String shardingColumn = 
standardShardingStrategyConfig.getShardingColumn();
+                
result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_STANDARD, 
strategyType, type, shardingColumn, shardingAlgorithmName));
+                break;
+            case "complex":
+                ComplexShardingStrategyConfiguration 
complexShardingStrategyConfig = (ComplexShardingStrategyConfiguration) 
shardingStrategyConfiguration;
+                String shardingColumns = 
complexShardingStrategyConfig.getShardingColumns();
+                
result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_COMPLEX, 
strategyType, type, shardingColumns, shardingAlgorithmName));
+                break;
+            case "hint":
+                
result.append(String.format(DistSQLScriptConstants.SHARDING_STRATEGY_HINT, 
type, shardingAlgorithmName));
+                break;
+            default:
+                break;
+        }
+        return result;
+    }
+    
+    private void appendShardingBindingTableRules(final 
ShardingRuleConfiguration shardingRuleConfig, final StringBuilder 
stringBuilder) {
+        String bindings = 
getBinding(shardingRuleConfig.getBindingTableGroups().iterator());
+        
stringBuilder.append(String.format(DistSQLScriptConstants.SHARDING_BINDING_TABLE_RULES,
 bindings));
+    }
+
+    private String getBinding(final Iterator<String> iterator) {
+        StringBuilder result = new StringBuilder();
+        while (iterator.hasNext()) {
+            String binding = iterator.next();
+            result.append(String.format(DistSQLScriptConstants.BINDING, 
binding));
+            if (iterator.hasNext()) {
+                result.append(DistSQLScriptConstants.COMMA);
+            }
+        }
+        
result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+        return result.toString();
+    }
 }

Reply via email to