From e1bbc5c9cd0e0939e2249725bc66f9b4727e9c4d Mon Sep 17 00:00:00 2001 From: terrymanu Date: Wed, 25 May 2016 19:13:22 +0800 Subject: [PATCH] fix #82 --- .../common/api/ShardingRuleBuilder.java | 16 +++-- .../common/api/config/TableRuleConfig.java | 2 + .../rdb/sharding/config/common/AllTests.java | 12 ++-- .../AbstractClosureShardingAlgorithmTest.java | 72 +++++++++++++++++++ .../ClosureDatabaseShardingAlgorithmTest.java | 31 ++++++++ .../ClosureShardingAlgorithmTest.java | 69 ------------------ .../ClosureTableShardingAlgorithmTest.java | 31 ++++++++ .../src/test/resources/config/config-all.yaml | 1 + ...JdbcDataSourceBeanDefinitionParserTag.java | 2 + ...ingJdbcDataSourceBeanDefinitionParser.java | 4 ++ .../main/resources/META-INF/namespace/rdb.xsd | 1 + .../ddframe/rdb/sharding/AllSpringTests.java | 4 +- ...espaceForIndicatedDataSourceNamesTest.java | 25 +++++++ ...thNamespaceForIndicatedDataSourceNames.xml | 26 +++++++ .../META-INF/rdb/withoutNamespace.xml | 14 ++-- .../rdb/withoutNamespaceStrategyOutside.xml | 6 ++ .../rdb/sharding/api/rule/TableRule.java | 37 ++++++++-- .../rdb/sharding/api/rule/TableRuleTest.java | 14 ++++ .../content/post/configuration.md | 4 +- .../content/post/release_notes.md | 6 +- 20 files changed, 284 insertions(+), 93 deletions(-) create mode 100644 sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/AbstractClosureShardingAlgorithmTest.java create mode 100644 sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureDatabaseShardingAlgorithmTest.java delete mode 100644 sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureShardingAlgorithmTest.java create mode 100644 sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureTableShardingAlgorithmTest.java create mode 100644 sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/spring/cases/namespace/WithNamespaceForIndicatedDataSourceNamesTest.java create mode 100644 sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceForIndicatedDataSourceNames.xml diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java index 9477a30b73e11..ff3f5fd58b6a3 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/ShardingRuleBuilder.java @@ -97,11 +97,17 @@ private DataSourceRule buildDataSourceRule() { private Collection buildTableRules(final DataSourceRule dataSourceRule) { Collection result = new ArrayList<>(shardingRuleConfig.getTables().size()); for (Entry each : shardingRuleConfig.getTables().entrySet()) { - TableRule.TableRuleBuilder tableRuleBuilder = TableRule.builder(each.getKey()).dataSourceRule(dataSourceRule).dynamic(each.getValue().isDynamic()) - .databaseShardingStrategy(buildShardingStrategy(each.getValue().getDatabaseStrategy(), DatabaseShardingStrategy.class)) - .tableShardingStrategy(buildShardingStrategy(each.getValue().getTableStrategy(), TableShardingStrategy.class)); - if (null != each.getValue().getActualTables()) { - tableRuleBuilder.actualTables(new InlineParser(each.getValue().getActualTables()).evaluate()); + String logicTable = each.getKey(); + TableRuleConfig tableRuleConfig = each.getValue(); + TableRule.TableRuleBuilder tableRuleBuilder = TableRule.builder(logicTable).dataSourceRule(dataSourceRule) + .dynamic(tableRuleConfig.isDynamic()) + .databaseShardingStrategy(buildShardingStrategy(tableRuleConfig.getDatabaseStrategy(), DatabaseShardingStrategy.class)) + .tableShardingStrategy(buildShardingStrategy(tableRuleConfig.getTableStrategy(), TableShardingStrategy.class)); + if (null != tableRuleConfig.getActualTables()) { + tableRuleBuilder.actualTables(new InlineParser(tableRuleConfig.getActualTables()).evaluate()); + } + if (!Strings.isNullOrEmpty(tableRuleConfig.getDataSourceNames())) { + tableRuleBuilder.dataSourceNames(new InlineParser(tableRuleConfig.getDataSourceNames()).evaluate()); } result.add(tableRuleBuilder.build()); } diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java index 6d4ebf189441c..2b72cdd98c078 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/main/java/com/dangdang/ddframe/rdb/sharding/config/common/api/config/TableRuleConfig.java @@ -33,6 +33,8 @@ public class TableRuleConfig { private String actualTables; + private String dataSourceNames; + private StrategyConfig databaseStrategy; private StrategyConfig tableStrategy; diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java index 7b54ced064bec..118cb16a82170 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/AllTests.java @@ -18,17 +18,19 @@ package com.dangdang.ddframe.rdb.sharding.config.common; import com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilderTest; -import com.dangdang.ddframe.rdb.sharding.config.common.internal.parser.InlineParserTest; -import com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm.ClosureShardingAlgorithmTest; +import com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm.ClosureDatabaseShardingAlgorithmTest; +import com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm.ClosureTableShardingAlgorithmTest; import com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm.ShardingValueWrapperTest; +import com.dangdang.ddframe.rdb.sharding.config.common.internal.parser.InlineParserTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ - ShardingRuleBuilderTest.class, - ClosureShardingAlgorithmTest.class, - ShardingValueWrapperTest.class, + ShardingRuleBuilderTest.class, + ClosureDatabaseShardingAlgorithmTest.class, + ClosureTableShardingAlgorithmTest.class, + ShardingValueWrapperTest.class, InlineParserTest.class }) public class AllTests { diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/AbstractClosureShardingAlgorithmTest.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/AbstractClosureShardingAlgorithmTest.java new file mode 100644 index 0000000000000..489da3e2ff1dc --- /dev/null +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/AbstractClosureShardingAlgorithmTest.java @@ -0,0 +1,72 @@ +/* + * Copyright 1999-2015 dangdang.com. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm; + +import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; +import com.google.common.collect.BoundType; +import com.google.common.collect.Range; +import groovy.lang.MissingMethodException; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.junit.Assert.assertThat; + +public abstract class AbstractClosureShardingAlgorithmTest { + + protected static final String EXPRESSION = "target_${log.info(id.toString()); id.longValue() % 2}"; + + protected static final String WRONG_EXPRESSION = "target_${log.info(id.error());}"; + + protected static final String LOG_ROOT = "default"; + + protected abstract ClosureShardingAlgorithm createClosureShardingAlgorithm(); + + protected abstract ClosureShardingAlgorithm createErrorClosureShardingAlgorithm(); + + @Test + public void assertEqual() { + Collection result = createClosureShardingAlgorithm().doSharding(Collections.singletonList("target_1"), Collections.>singletonList(new ShardingValue<>("target", "id", 1L))); + assertThat(result.size(), is(1)); + assertThat(result, hasItem("target_1")); + } + + @Test + public void assertIn() { + Collection result = createClosureShardingAlgorithm().doSharding(Arrays.asList("target_0", "target_1"), + Collections.>singletonList(new ShardingValue<>("target", "id", Arrays.asList(1, 2)))); + assertThat(result.size(), is(2)); + assertThat(result, hasItem("target_0")); + assertThat(result, hasItem("target_1")); + } + + @Test(expected = UnsupportedOperationException.class) + public void assertBetween() { + createClosureShardingAlgorithm().doSharding(Arrays.asList("target_0", "target_1"), + Collections.>singletonList(new ShardingValue<>("target", "id", Range.range(1, BoundType.CLOSED, 2, BoundType.OPEN)))); + } + + @Test(expected = MissingMethodException.class) + public void assertEvaluateInlineExpressionFailure() { + createErrorClosureShardingAlgorithm().doSharding(Collections.singletonList("target_1"), Collections.>singletonList(new ShardingValue<>("target", "id", 1L))); + } +} diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureDatabaseShardingAlgorithmTest.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureDatabaseShardingAlgorithmTest.java new file mode 100644 index 0000000000000..47e7b5417e7b5 --- /dev/null +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureDatabaseShardingAlgorithmTest.java @@ -0,0 +1,31 @@ +/* + * Copyright 1999-2015 dangdang.com. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm; + +public final class ClosureDatabaseShardingAlgorithmTest extends AbstractClosureShardingAlgorithmTest { + + @Override + protected ClosureShardingAlgorithm createClosureShardingAlgorithm() { + return new ClosureDatabaseShardingAlgorithm(EXPRESSION, LOG_ROOT); + } + + @Override + protected ClosureShardingAlgorithm createErrorClosureShardingAlgorithm() { + return new ClosureDatabaseShardingAlgorithm(WRONG_EXPRESSION, LOG_ROOT); + } +} diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureShardingAlgorithmTest.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureShardingAlgorithmTest.java deleted file mode 100644 index f7a366991824e..0000000000000 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureShardingAlgorithmTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1999-2015 dangdang.com. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- */ - -package com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; - -import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; -import com.google.common.collect.BoundType; -import com.google.common.collect.Range; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsCollectionContaining.hasItem; -import static org.junit.Assert.assertThat; - -public class ClosureShardingAlgorithmTest { - - private static ClosureShardingAlgorithm algorithm; - - @BeforeClass - public static void initAlgorithm() { - algorithm = new ClosureDatabaseShardingAlgorithm("t_order_${log.info(id.toString()); id.longValue() % 2}", "default"); - } - - @Test - public void testEqual() { - Collection result = algorithm.doSharding(Collections.singletonList("t_order_1"), Collections.>singletonList(new ShardingValue<>("t_order", "id", 1L))); - assertThat(result.size(), is(1)); - assertThat(result, hasItem("t_order_1")); - } - - @Test - public void testIn() { - Collection result = algorithm.doSharding(Arrays.asList("t_order_0", "t_order_1"), - Collections.>singletonList(new ShardingValue<>("t_order", "id", Arrays.asList(1, 2)))); - assertThat(result.size(), is(2)); - assertThat(result, hasItem("t_order_0")); - assertThat(result, hasItem("t_order_1")); - } - - @Test(expected = UnsupportedOperationException.class) - public void testBetween() { - algorithm.doSharding(Arrays.asList("t_order_0", "t_order_1"), - Collections.>singletonList(new ShardingValue<>("t_order", "id", Range.range(1, BoundType.CLOSED, 2, BoundType.OPEN)))); - } - - @Test(expected = NullPointerException.class) - public void testNoShardingValue() { - algorithm.doSharding(Collections.singletonList("t_order_no"), Collections.>emptyList()); - } -} diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureTableShardingAlgorithmTest.java b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureTableShardingAlgorithmTest.java new file mode 100644 index 0000000000000..c64615703ad79 --- /dev/null +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/java/com/dangdang/ddframe/rdb/sharding/config/common/internal/algorithm/ClosureTableShardingAlgorithmTest.java @@ -0,0 +1,31 @@ +/* + * Copyright 1999-2015 dangdang.com. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm; + +public final class ClosureTableShardingAlgorithmTest extends AbstractClosureShardingAlgorithmTest { + + @Override + protected ClosureShardingAlgorithm createClosureShardingAlgorithm() { + return new ClosureTableShardingAlgorithm(EXPRESSION, LOG_ROOT); + } + + @Override + protected ClosureShardingAlgorithm createErrorClosureShardingAlgorithm() { + return new ClosureTableShardingAlgorithm(WRONG_EXPRESSION, LOG_ROOT); + } +} diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-all.yaml b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-all.yaml index e7437dbef9a7f..9330a2f8d1773 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-all.yaml +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-common/src/test/resources/config/config-all.yaml @@ -17,6 +17,7 @@ defaultDataSourceName: db0 tables: config: actualTables: config_${0..1} + dataSourceNames: config t_order: actualTables: t_order_${0..1} diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java index 1d7ad8603efaa..eb0f03dd3a407 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/constants/ShardingJdbcDataSourceBeanDefinitionParserTag.java @@ -52,6 +52,8 @@ public final class ShardingJdbcDataSourceBeanDefinitionParserTag { public static final String ACTUAL_TABLES_ATTR = "actual-tables"; + public static final String DATA_SOURCE_NAMES_ATTR = "data-source-names"; + public static final String DATABASE_STRATEGY_ATTR = "database-strategy"; public static final String TABLE_STRATEGY_ATTR = "table-strategy"; diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java index 19fd6430f471a..50758e494a19a 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/java/com/dangdang/ddframe/rdb/sharding/spring/namespace/parser/ShardingJdbcDataSourceBeanDefinitionParser.java @@ -104,6 +104,10 @@ private BeanDefinition parseTableRuleConfig(final Element tableElement) { if (!Strings.isNullOrEmpty(actualTables)) { factory.addPropertyValue("actualTables", actualTables); } + String dataSourceNames = tableElement.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.DATA_SOURCE_NAMES_ATTR); + if (!Strings.isNullOrEmpty(dataSourceNames)) { + factory.addPropertyValue("dataSourceNames", dataSourceNames); + } String databaseStrategy = tableElement.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.DATABASE_STRATEGY_ATTR); if (!Strings.isNullOrEmpty(databaseStrategy)) { factory.addPropertyReference("databaseStrategy", databaseStrategy); diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd index 4e2f286a9351d..4354c5c497c09 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/main/resources/META-INF/namespace/rdb.xsd @@ -39,6 +39,7 @@ + diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/AllSpringTests.java b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/AllSpringTests.java index 51ecbc1bfa287..6c5848fbd195e 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/AllSpringTests.java +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/AllSpringTests.java @@ -26,6 +26,7 @@ import com.dangdang.ddframe.rdb.sharding.spring.cases.namespace.WithNamespaceBindingTablesTest; import com.dangdang.ddframe.rdb.sharding.spring.cases.namespace.WithNamespaceDefaultStrategyTest; import com.dangdang.ddframe.rdb.sharding.spring.cases.namespace.WithNamespaceDifferentTablesTest; +import com.dangdang.ddframe.rdb.sharding.spring.cases.namespace.WithNamespaceForIndicatedDataSourceNamesTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @@ -41,7 +42,8 @@ WithNamespaceBindingTablesTest.class, WithoutNamespaceTest.class, WithoutNamespaceDefaultStrategyTest.class, - WithNamespaceDifferentTablesTest.class + WithNamespaceDifferentTablesTest.class, + WithNamespaceForIndicatedDataSourceNamesTest.class }) public class AllSpringTests { } diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/spring/cases/namespace/WithNamespaceForIndicatedDataSourceNamesTest.java b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/spring/cases/namespace/WithNamespaceForIndicatedDataSourceNamesTest.java new file mode 100644 index 0000000000000..faef8e2105ec8 --- /dev/null +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/java/com/dangdang/ddframe/rdb/sharding/spring/cases/namespace/WithNamespaceForIndicatedDataSourceNamesTest.java @@ -0,0 +1,25 @@ +/* + * Copyright 1999-2015 dangdang.com. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package com.dangdang.ddframe.rdb.sharding.spring.cases.namespace; + +import com.dangdang.ddframe.rdb.sharding.spring.AbstractShardingBothDataBasesAndTablesSpringDBUnitTest; +import org.springframework.test.context.ContextConfiguration; + +@ContextConfiguration(locations = "classpath:META-INF/rdb/namespace/withNamespaceForIndicatedDataSourceNames.xml") +public final class WithNamespaceForIndicatedDataSourceNamesTest extends AbstractShardingBothDataBasesAndTablesSpringDBUnitTest { +} diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceForIndicatedDataSourceNames.xml b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceForIndicatedDataSourceNames.xml new file mode 100644 index 0000000000000..897b5d71bbea9 --- /dev/null +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/namespace/withNamespaceForIndicatedDataSourceNames.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml index 9c983308af4cf..aefce5db3557b 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespace.xml @@ -29,8 +29,11 @@ - - + + + + + @@ -45,8 +48,11 @@ - - + + + + + diff --git a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml index 66052799a5e96..a14309468e920 100644 --- a/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml +++ b/sharding-jdbc-config-parent/sharding-jdbc-config-spring/src/test/resources/META-INF/rdb/withoutNamespaceStrategyOutside.xml @@ -34,6 +34,9 @@ + + + @@ -54,6 +57,9 @@ + + + diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java index c42ec2302739f..c779416196b92 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRule.java @@ -59,7 +59,7 @@ public final class TableRule { * @deprecated 未来将改为private权限, 不在对外公开, 不建议使用非Spring命名空间的配置. */ @Deprecated - public TableRule(final String logicTable, final boolean dynamic, final List actualTables, final DataSourceRule dataSourceRule, + public TableRule(final String logicTable, final boolean dynamic, final List actualTables, final DataSourceRule dataSourceRule, final Collection dataSourceNames, final DatabaseShardingStrategy databaseShardingStrategy, final TableShardingStrategy tableShardingStrategy) { Preconditions.checkNotNull(logicTable); this.logicTable = logicTable; @@ -71,9 +71,9 @@ public TableRule(final String logicTable, final boolean dynamic, final List generateDataNodes(final DataSourceRule dataSourceRule) { return result; } - private List generateDataNodes(final List actualTables, final DataSourceRule dataSourceRule) { - Collection dataSourceNames = null == dataSourceRule ? Collections.emptyList() : dataSourceRule.getDataSourceNames(); + private List generateDataNodes(final List actualTables, final DataSourceRule dataSourceRule, final Collection actualDataSourceNames) { + Collection dataSourceNames = getDataSourceNames(dataSourceRule, actualDataSourceNames); List result = new ArrayList<>(actualTables.size() * (dataSourceNames.isEmpty() ? 1 : dataSourceNames.size())); for (String actualTable : actualTables) { if (DataNode.isValidDataNode(actualTable)) { @@ -111,6 +111,16 @@ private List generateDataNodes(final List actualTables, final return result; } + private Collection getDataSourceNames(final DataSourceRule dataSourceRule, final Collection actualDataSourceNames) { + if (null == dataSourceRule) { + return Collections.emptyList(); + } + if (null == actualDataSourceNames || actualDataSourceNames.isEmpty()) { + return dataSourceRule.getDataSourceNames(); + } + return actualDataSourceNames; + } + /** * 根据数据源名称过滤获取真实数据单元. * @@ -194,8 +204,10 @@ public static class TableRuleBuilder { private boolean dynamic; private List actualTables; - + private DataSourceRule dataSourceRule; + + private Collection dataSourceNames; private DatabaseShardingStrategy databaseShardingStrategy; @@ -233,6 +245,17 @@ public TableRuleBuilder dataSourceRule(final DataSourceRule dataSourceRule) { this.dataSourceRule = dataSourceRule; return this; } + + /** + * 构建数据源分片规则. + * + * @param dataSourceNames 数据源名称集合 + * @return 规则配置对象构建器 + */ + public TableRuleBuilder dataSourceNames(final Collection dataSourceNames) { + this.dataSourceNames = dataSourceNames; + return this; + } /** * 构建数据库分片策略. @@ -262,7 +285,7 @@ public TableRuleBuilder tableShardingStrategy(final TableShardingStrategy tableS * @return 表规则配置对象 */ public TableRule build() { - return new TableRule(logicTable, dynamic, actualTables, dataSourceRule, databaseShardingStrategy, tableShardingStrategy); + return new TableRule(logicTable, dynamic, actualTables, dataSourceRule, dataSourceNames, databaseShardingStrategy, tableShardingStrategy); } } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java index 9ff8532449e0c..8a9fe319838ed 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/TableRuleTest.java @@ -116,6 +116,15 @@ public void assertTableRuleWithDataNodeString() { assertNull(actual.getTableShardingStrategy()); } + @Test + public void assertTableRuleWithDataSourceNames() { + TableRule actual = TableRule.builder("logicTable").actualTables(Arrays.asList("table_0", "table_1", "table_2")) + .dataSourceRule(createDataSourceRule()).dataSourceNames(Arrays.asList("ds0", "ds1")).build(); + assertActualTable(actual); + assertNull(actual.getDatabaseShardingStrategy()); + assertNull(actual.getTableShardingStrategy()); + } + private void assertActualTable(final TableRule actual) { assertThat(actual.getActualTables().size(), is(6)); assertTrue(actual.getActualTables().contains(new DataNode("ds0", "table_0"))); @@ -126,6 +135,11 @@ private void assertActualTable(final TableRule actual) { assertTrue(actual.getActualTables().contains(new DataNode("ds1", "table_2"))); } + @Test(expected = NullPointerException.class) + public void assertTableRuleWithoutActualTablesAndDataSourceRule() { + TableRule.builder("logicTable").build(); + } + @Test public void assertGetActualDataNodesForStatic() { TableRule actual = TableRule.builder("logicTable") diff --git a/sharding-jdbc-doc/content/post/configuration.md b/sharding-jdbc-doc/content/post/configuration.md index 0572593a9e2e5..9ee84bf090e6e 100644 --- a/sharding-jdbc-doc/content/post/configuration.md +++ b/sharding-jdbc-doc/content/post/configuration.md @@ -87,6 +87,7 @@ tables: 分库分表配置,可配置多个logic_table_name : 逻辑表名 dynamic: 是否为动态表 actualTables: 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源。不填写表示为只分库不分表或动态表(需要配置dynamic=true)。 + dataSourceNames: 数据源名称,多个数据源用逗号分隔,支持inline表达式。不填写表示使用全部数据源 databaseStrategy: 分库策略 shardingColumns: 分片列名,多个列以逗号分隔 algorithmClassName: 分库算法全类名,该类需使用默认的构造器或者提供无参数的构造器,与algorithmExpression出现一个即可 @@ -224,8 +225,9 @@ props: 属性配置(可选) | logic-table | 属性 | String | 是 | 逻辑表名 | | dynamic | 属性 | boolean | 否 | 是否动态表 | | actual-tables | 属性 | String | 否 | 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源 指定数据源需要加前缀,不加前缀为默认数据源。不填写表示为只分库不分表或动态表(需要配置dynamic=true) | +| data-source-names | 属性 | String | 否 | 数据源名称,多个数据源用逗号分隔,支持inline表达式。不填写表示使用全部数据源 | | database-strategy | 属性 | String | 否 | 分库策略,对应``中分库策略id, 如果不填需配置`` | -| table-strategy | 属性 | String | 否 | 分表策略,对应``中分表策略id, 如果不填需配置`` | +| table-strategy | 属性 | String | 否 | 分表策略,对应``中分表策略id, 如果不填需配置`` | ### \ diff --git a/sharding-jdbc-doc/content/post/release_notes.md b/sharding-jdbc-doc/content/post/release_notes.md index 5121ffbf07788..da2c8bc373a47 100644 --- a/sharding-jdbc-doc/content/post/release_notes.md +++ b/sharding-jdbc-doc/content/post/release_notes.md @@ -8,9 +8,13 @@ weight = 1 ## 1.2.2-SNAPSHOT +### 功能提升 + +1. [ISSUE #82](https://github.com/dangdangdotcom/sharding-jdbc/issues/82) TableRule可传入dataSourceName属性,用于指定该TableRule对应的数据源 + ### 缺陷修正 -1. [ISSUE #63](https://github.com/dangdangdotcom/sharding-jdbc/issues/81) 关联表查询使用or查询条件解析结果异常 +1. [ISSUE #81](https://github.com/dangdangdotcom/sharding-jdbc/issues/81) 关联表查询使用or查询条件解析结果异常 ## 1.2.1