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