未验证 提交 1dafe799 编写于 作者: J Juan Pan(Trista) 提交者: GitHub

Add auto tables for sharding rule and give spring test (#5961)

* Add auto tables for sharding rule and give spring test

* for better expression
上级 6ab53e00
......@@ -74,7 +74,8 @@ public final class ShardingRule implements DataNodeRoutedRule {
Preconditions.checkArgument(null != shardingRuleConfiguration, "ShardingRuleConfig cannot be null.");
Preconditions.checkArgument(null != dataSourceNames && !dataSourceNames.isEmpty(), "Data sources cannot be empty.");
this.dataSourceNames = getDataSourceNames(shardingRuleConfiguration.getTables(), dataSourceNames);
tableRules = createTableRules(shardingRuleConfiguration);
tableRules = new LinkedList<>(createTableRules(shardingRuleConfiguration));
tableRules.addAll(createAutoTableRules(shardingRuleConfiguration));
broadcastTables = shardingRuleConfiguration.getBroadcastTables();
bindingTableRules = createBindingTableRules(shardingRuleConfiguration.getBindingTableGroups());
defaultDatabaseShardingStrategy = createDefaultShardingStrategy(shardingRuleConfiguration.getDefaultDatabaseShardingStrategy());
......@@ -108,6 +109,11 @@ public final class ShardingRule implements DataNodeRoutedRule {
return shardingRuleConfig.getTables().stream().map(each ->
new TableRule(each, dataSourceNames, getDefaultGenerateKeyColumn(shardingRuleConfig))).collect(Collectors.toList());
}
private Collection<TableRule> createAutoTableRules(final ShardingRuleConfiguration shardingRuleConfig) {
return shardingRuleConfig.getAutoTables().stream().map(each ->
new TableRule(each, dataSourceNames, getDefaultGenerateKeyColumn(shardingRuleConfig))).collect(Collectors.toList());
}
private String getDefaultGenerateKeyColumn(final ShardingRuleConfiguration shardingRuleConfig) {
return Optional.ofNullable(shardingRuleConfig.getDefaultKeyGeneratorConfig()).map(KeyGeneratorConfiguration::getColumn).orElse(null);
......
......@@ -76,6 +76,9 @@ public final class ShardingRuleBeanDefinitionParser extends AbstractBeanDefiniti
private List<BeanDefinition> parseTableRulesConfiguration(final Element element) {
Element tableRulesElement = DomUtils.getChildElementByTagName(element, ShardingRuleBeanDefinitionTag.TABLE_RULES_TAG);
if (null == tableRulesElement) {
return new LinkedList<>();
}
List<Element> tableRuleElements = DomUtils.getChildElementsByTagName(tableRulesElement, ShardingRuleBeanDefinitionTag.TABLE_RULE_TAG);
List<BeanDefinition> result = new ManagedList<>(tableRuleElements.size());
for (Element each : tableRuleElements) {
......@@ -118,6 +121,9 @@ public final class ShardingRuleBeanDefinitionParser extends AbstractBeanDefiniti
private List<BeanDefinition> parseAutoTableRulesConfiguration(final Element element) {
Element tableRulesElement = DomUtils.getChildElementByTagName(element, ShardingRuleBeanDefinitionTag.AUTO_TABLE_RULES_TAG);
if (null == tableRulesElement) {
return new LinkedList<>();
}
List<Element> tableRuleElements = DomUtils.getChildElementsByTagName(tableRulesElement, ShardingRuleBeanDefinitionTag.AUTO_TABLE_RULE_TAG);
List<BeanDefinition> result = new ManagedList<>(tableRuleElements.size());
for (Element each : tableRuleElements) {
......
......@@ -27,6 +27,7 @@
<xsd:complexType>
<xsd:all>
<xsd:element ref="table-rules" minOccurs="0" />
<xsd:element ref="auto-table-rules" minOccurs="0" />
<xsd:element ref="binding-table-rules" minOccurs="0" />
<xsd:element ref="broadcast-table-rules" minOccurs="0" />
</xsd:all>
......@@ -54,6 +55,21 @@
<xsd:attribute name="logic-index" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="auto-table-rules">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="auto-table-rule" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="auto-table-rule">
<xsd:complexType>
<xsd:attribute name="logic-table" type="xsd:string" use="required" />
<xsd:attribute name="actual-data-sources" type="xsd:string" />
<xsd:attribute name="sharding-strategy-ref" type="xsd:string" />
<xsd:attribute name="key-generator-ref" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="binding-table-rules">
<xsd:complexType>
<xsd:sequence>
......
......@@ -133,6 +133,28 @@ public class ShardingNamespaceTest extends AbstractJUnit4SpringContextTests {
new String[]{applicationContext.getBean("inlineStrategy", StandardShardingStrategyConfiguration.class).getShardingColumn()}));
assertThat(shardingRule.getDefaultKeyGenerateAlgorithm(), instanceOf(IncrementKeyGenerateAlgorithm.class));
}
@Test
public void assertAutoShardingDataSource() {
Map<String, DataSource> dataSourceMap = getDataSourceMap("autoShardingDataSource");
assertNotNull(dataSourceMap.get("dbtbl_0"));
assertNotNull(dataSourceMap.get("dbtbl_1"));
ShardingRule shardingRule = getShardingRule("autoShardingDataSource");
assertThat(shardingRule.getTableRules().size(), is(1));
TableRule tableRule = shardingRule.getTableRules().iterator().next();
assertThat(tableRule.getLogicTable(), is("t_order"));
assertThat(tableRule.getActualDataNodes().size(), is(4));
assertTrue(tableRule.getActualDataNodes().contains(new DataNode("dbtbl_0", "t_order_0")));
assertTrue(tableRule.getActualDataNodes().contains(new DataNode("dbtbl_1", "t_order_1")));
assertTrue(tableRule.getActualDataNodes().contains(new DataNode("dbtbl_0", "t_order_2")));
assertTrue(tableRule.getActualDataNodes().contains(new DataNode("dbtbl_1", "t_order_3")));
assertTrue(null == tableRule.getDatabaseShardingStrategy());
assertTrue(Arrays.equals(tableRule.getTableShardingStrategy().getShardingColumns().toArray(new String[]{}),
new String[]{applicationContext.getBean("inlineStrategy", StandardShardingStrategyConfiguration.class).getShardingColumn()}));
assertTrue(tableRule.getGenerateKeyColumn().isPresent());
assertThat(tableRule.getGenerateKeyColumn().get(), is("order_id"));
assertThat(tableRule.getKeyGenerateAlgorithm(), instanceOf(IncrementKeyGenerateAlgorithm.class));
}
@Test
public void assertTableRuleWithAttributesDataSource() {
......
......@@ -45,12 +45,18 @@
<prop key="algorithm.expression">t_order_${order_id % 4}</prop>
</props>
</sharding:sharding-algorithm>
<sharding:sharding-algorithm id="modStrategyShardingAlgorithm" type="MOD">
<props>
<prop key="mod.value">4</prop>
</props>
</sharding:sharding-algorithm>
<sharding:key-generate-algorithm id="incrementAlgorithm" type="INCREMENT" />
<sharding:standard-strategy id="standardStrategy" sharding-column="user_id" algorithm-ref="standardModuloDatabaseShardingAlgorithm" />
<sharding:standard-strategy id="rangeStandardStrategy" sharding-column="order_id" algorithm-ref="standardModuloTableShardingAlgorithm" />
<sharding:standard-strategy id="inlineStrategy" sharding-column="order_id" algorithm-ref="inlineStrategyShardingAlgorithm" />
<sharding:standard-strategy id="modStrategy" sharding-column="order_id" algorithm-ref="modStrategyShardingAlgorithm" />
<sharding:complex-strategy id="complexStrategy" sharding-columns="order_id,user_id" algorithm-ref="defaultComplexKeysShardingAlgorithm" />
<sharding:hint-strategy id="hintStrategy" algorithm-ref="defaultHintShardingAlgorithm" />
<sharding:none-strategy id="noneStrategy" />
......@@ -64,6 +70,12 @@
<sharding:table-rule logic-table="t_order" />
</sharding:table-rules>
</sharding:rule>
<sharding:rule id="autoShardingDataSourceWithAutoTableRule">
<sharding:auto-table-rules>
<sharding:auto-table-rule logic-table="t_order" actual-data-sources="dbtbl_0, dbtbl_1" sharding-strategy-ref="modStrategy" key-generator-ref="orderKeyGenerator" />
</sharding:auto-table-rules>
</sharding:rule>
<encrypt:encrypt-strategy id="aes_encrypt_strategy" type="AES">
<props>
......@@ -80,7 +92,9 @@
</encrypt:rule>
<shardingsphere:data-source id="simpleShardingDataSource" data-source-names="dbtbl_0" rule-refs="simpleShardingDataSourceShardingRule, simpleShardingDataSourceEncryptRule" />
<shardingsphere:data-source id="autoShardingDataSource" data-source-names="dbtbl_0, dbtbl_1" rule-refs="autoShardingDataSourceWithAutoTableRule" />
<sharding:rule id="masterSlaveShardingDataSourceByDefaultStrategyShardingRule" default-key-generator-ref="defaultKeyGenerator">
<sharding:table-rules>
<sharding:table-rule logic-table="t_order" actual-data-nodes="dbtbl_${0..1}.t_order_${0..3}" database-strategy-ref="standardStrategy" table-strategy-ref="inlineStrategy" key-generator-ref="orderKeyGenerator" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册