From 487df317fe428ceab5dbf59a22fb8809cac87f39 Mon Sep 17 00:00:00 2001 From: terrymanu Date: Mon, 25 Apr 2016 16:21:39 +0800 Subject: [PATCH] refactor --- .../rdb/sharding/api/rule/DataNode.java | 21 +++++++ .../rdb/sharding/api/rule/DataSourceRule.java | 1 - .../rdb/sharding/api/rule/ShardingRule.java | 60 ++++++++++--------- .../rdb/sharding/api/rule/TableRule.java | 15 +---- .../rdb/sharding/router/SQLRouteEngine.java | 2 +- .../router/binding/BindingTablesRouter.java | 2 +- .../ddframe/rdb/sharding/api/AllApiTest.java | 4 +- .../rdb/sharding/api/rule/DataNodeTest.java | 49 +++++++++++++++ .../sharding/api/rule/DataSourceRuleTest.java | 5 -- .../sharding/api/rule/ShardingRuleTest.java | 18 +++--- 10 files changed, 119 insertions(+), 58 deletions(-) create mode 100644 sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java index 187639a2da..71c431096e 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNode.java @@ -17,11 +17,14 @@ package com.dangdang.ddframe.rdb.sharding.api.rule; +import com.google.common.base.Splitter; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import java.util.List; + /** * 分库分表数据单元. * @@ -33,7 +36,25 @@ import lombok.ToString; @ToString public final class DataNode { + private static final String DELIMITER = "."; + private final String dataSourceName; private final String tableName; + + public DataNode(final String dataNode) { + List segments = Splitter.on(DELIMITER).splitToList(dataNode); + dataSourceName = segments.get(0); + tableName = segments.get(1); + } + + /** + * 判断字符串是否为合法的分库分表数据单元字符串. + * + * @param dataNodeStr 待判断的字符串 + * @return 是否为合法的分库分表数据单元字符串 + */ + public static boolean isValidDataNode(final String dataNodeStr) { + return dataNodeStr.contains(DELIMITER) && 2 == Splitter.on(DELIMITER).splitToList(dataNodeStr).size(); + } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java index 9064f36f13..8e524f5011 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRule.java @@ -34,7 +34,6 @@ public final class DataSourceRule { private final Map dataSourceMap; public DataSourceRule(final Map dataSourceMap) { - Preconditions.checkNotNull(dataSourceMap, "Must have one data source at least."); Preconditions.checkState(!dataSourceMap.isEmpty(), "Must have one data source at least."); this.dataSourceMap = dataSourceMap; } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java index 50c3c62703..534ede41a4 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRule.java @@ -133,21 +133,14 @@ public final class ShardingRule { } /** - * 根据逻辑表名称获取binding表配置的逻辑表名称集合. - * - * @param logicTable 逻辑表名称 - * @return binding表配置的逻辑表名称集合 + * 判断逻辑表名称集合是否全部属于Binding表. + * + * @param logicTables 逻辑表名称集合 + * @return 是否全部属于Binding表 */ - public Optional getBindingTableRule(final String logicTable) { - if (null == bindingTableRules) { - return Optional.absent(); - } - for (BindingTableRule each : bindingTableRules) { - if (each.hasLogicTable(logicTable)) { - return Optional.of(each); - } - } - return Optional.absent(); + public boolean isAllBindingTables(final Collection logicTables) { + Collection bindingTables = filterAllBindingTables(logicTables); + return !bindingTables.isEmpty() && bindingTables.containsAll(logicTables); } /** @@ -160,13 +153,7 @@ public final class ShardingRule { if (logicTables.isEmpty()) { return Collections.emptyList(); } - Optional bindingTableRule = Optional.absent(); - for (String each : logicTables) { - bindingTableRule = getBindingTableRule(each); - if (bindingTableRule.isPresent()) { - break; - } - } + Optional bindingTableRule = findBindingTableRule(logicTables); if (!bindingTableRule.isPresent()) { return Collections.emptyList(); } @@ -175,15 +162,32 @@ public final class ShardingRule { return result; } + private Optional findBindingTableRule(final Collection logicTables) { + for (String each : logicTables) { + Optional result = findBindingTableRule(each); + if (result.isPresent()) { + return result; + } + } + return Optional.absent(); + } + /** - * 判断逻辑表名称集合是否全部属于Binding表. - * - * @param logicTables 逻辑表名称集合 - * @return 是否全部属于Binding表 + * 根据逻辑表名称获取binding表配置的逻辑表名称集合. + * + * @param logicTable 逻辑表名称 + * @return binding表配置的逻辑表名称集合 */ - public boolean isAllBindingTable(final Collection logicTables) { - Collection bindingTables = filterAllBindingTables(logicTables); - return !bindingTables.isEmpty() && bindingTables.containsAll(logicTables); + public Optional findBindingTableRule(final String logicTable) { + if (null == bindingTableRules) { + return Optional.absent(); + } + for (BindingTableRule each : bindingTableRules) { + if (each.hasLogicTable(logicTable)) { + return Optional.of(each); + } + } + return Optional.absent(); } /** 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 d20ded2493..77253aaf77 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 @@ -24,7 +24,6 @@ import java.util.List; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; -import com.google.common.base.Splitter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -69,9 +68,8 @@ public final class TableRule { private void generateDataNodes(final List actualTables, final DataSourceRule dataSourceRule) { for (String actualTable : actualTables) { - if (actualTable.contains(".")) { - List actualDatabaseTable = Splitter.on(".").splitToList(actualTable); - this.actualTables.add(new DataNode(actualDatabaseTable.get(0), actualDatabaseTable.get(1))); + if (DataNode.isValidDataNode(actualTable)) { + this.actualTables.add(new DataNode(actualTable)); } else { for (String dataSourceName : dataSourceRule.getDataSourceNames()) { this.actualTables.add(new DataNode(dataSourceName, actualTable)); @@ -126,14 +124,7 @@ public final class TableRule { return result; } - /** - * 根据数据源和真实表名称查找真实表顺序. - * - * @param dataSourceName 数据源名称 - * @param actualTableName 真实表名称 - * @return 真实表顺序 - */ - public int findActualTableIndex(final String dataSourceName, final String actualTableName) { + int findActualTableIndex(final String dataSourceName, final String actualTableName) { int result = 0; for (DataNode each : actualTables) { if (each.getDataSourceName().equals(dataSourceName) && each.getTableName().equals(actualTableName)) { diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java index e94989eed2..8002dabeac 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/SQLRouteEngine.java @@ -93,7 +93,7 @@ public final class SQLRouteEngine { RoutingResult result; if (1 == logicTables.size()) { result = new SingleTableRouter(shardingRule, logicTables.iterator().next(), conditionContext, type).route(); - } else if (shardingRule.isAllBindingTable(logicTables)) { + } else if (shardingRule.isAllBindingTables(logicTables)) { result = new BindingTablesRouter(shardingRule, logicTables, conditionContext, type).route(); } else { // TODO 可配置是否执行笛卡尔积 diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/binding/BindingTablesRouter.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/binding/BindingTablesRouter.java index b4e2e48c71..4f511a1b59 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/binding/BindingTablesRouter.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/router/binding/BindingTablesRouter.java @@ -51,7 +51,7 @@ public class BindingTablesRouter { this.logicTables = logicTables; this.conditionContext = conditionContext; this.sqlStatementType = sqlStatementType; - Optional optionalBindingTableRule = shardingRule.getBindingTableRule(logicTables.iterator().next()); + Optional optionalBindingTableRule = shardingRule.findBindingTableRule(logicTables.iterator().next()); Preconditions.checkState(optionalBindingTableRule.isPresent()); bindingTableRule = optionalBindingTableRule.get(); } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java index 7e7c0a1e01..f65063e6b1 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/AllApiTest.java @@ -20,6 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.api; import com.dangdang.ddframe.rdb.sharding.api.props.ShardingPropertiesConstantTest; import com.dangdang.ddframe.rdb.sharding.api.props.ShardingPropertiesTest; import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRuleTest; +import com.dangdang.ddframe.rdb.sharding.api.rule.DataNodeTest; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRuleTest; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRuleTest; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRuleTest; @@ -41,7 +42,8 @@ import org.junit.runners.Suite; ShardingValueTest.class, DataSourceRuleTest.class, ShardingRuleTest.class, - TableRuleTest.class, + TableRuleTest.class, + DataNodeTest.class, BindingTableRuleTest.class, ShardingStrategyTest.class, DatabaseShardingStrategyTest.class, diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java new file mode 100644 index 0000000000..3475146d89 --- /dev/null +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataNodeTest.java @@ -0,0 +1,49 @@ +/** + * 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.api.rule; + +import org.junit.Test; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class DataNodeTest { + + @Test + public void assertIsValidDataNode() { + assertTrue(DataNode.isValidDataNode("ds_0.tbl_0")); + } + + @Test + public void assertIsInvalidDataNodeWithoutDelimiter() { + assertFalse(DataNode.isValidDataNode("ds_0_tbl_0")); + } + + @Test + public void assertIsInvalidDataNodeWithTwoDelimiters() { + assertFalse(DataNode.isValidDataNode("ds_0.tbl_0.tbl_1")); + } + + @Test + public void assertNewDataNode() { + assertThat(new DataNode("ds_0.tbl_0").getDataSourceName(), is("ds_0")); + assertThat(new DataNode("ds_0.tbl_0").getTableName(), is("tbl_0")); + } +} diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java index 78ac6662eb..e487c95ccd 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/DataSourceRuleTest.java @@ -30,11 +30,6 @@ public final class DataSourceRuleTest { dataSourceRule = new DataSourceRule(dataSourceMap); } - @Test(expected = NullPointerException.class) - public void assertNewDataSourceFailureWhenDataSourceMapIsNull() { - new DataSourceRule(null); - } - @Test(expected = IllegalStateException.class) public void assertNewDataSourceFailureWhenDataSourceMapIsEmpty() { new DataSourceRule(Collections.emptyMap()); diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java index 788543b2cc..8aa6190077 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/api/rule/ShardingRuleTest.java @@ -115,19 +115,19 @@ public final class ShardingRuleTest { @Test public void assertGetBindingTableRuleForNotConfig() { ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule())); - assertFalse(actual.getBindingTableRule("logicTable").isPresent()); + assertFalse(actual.findBindingTableRule("logicTable").isPresent()); } @Test public void assertGetBindingTableRuleForNotFound() { - assertFalse(createShardingRule().getBindingTableRule("newTable").isPresent()); + assertFalse(createShardingRule().findBindingTableRule("newTable").isPresent()); } @Test public void assertGetBindingTableRuleForFound() { BindingTableRule bindingTableRule = createBindingTableRule(); ShardingRule actual = new ShardingRule(createDataSourceRule(), Collections.singletonList(createTableRule()), Collections.singletonList(bindingTableRule)); - assertThat(actual.getBindingTableRule("logicTable").get(), is(bindingTableRule)); + assertThat(actual.findBindingTableRule("logicTable").get(), is(bindingTableRule)); } @Test @@ -150,20 +150,20 @@ public final class ShardingRuleTest { @Test public void assertIsAllBindingTableWhenLogicTablesIsEmpty() { - assertFalse(createShardingRule().isAllBindingTable(Collections.emptyList())); + assertFalse(createShardingRule().isAllBindingTables(Collections.emptyList())); } @Test public void assertIsNotAllBindingTable() { - assertFalse(createShardingRule().isAllBindingTable(Collections.singletonList("newTable"))); - assertFalse(createShardingRule().isAllBindingTable(Arrays.asList("logicTable", "newTable"))); + assertFalse(createShardingRule().isAllBindingTables(Collections.singletonList("newTable"))); + assertFalse(createShardingRule().isAllBindingTables(Arrays.asList("logicTable", "newTable"))); } @Test public void assertIsAllBindingTable() { - assertTrue(createShardingRule().isAllBindingTable(Collections.singletonList("logicTable"))); - assertTrue(createShardingRule().isAllBindingTable(Collections.singletonList("subLogicTable"))); - assertTrue(createShardingRule().isAllBindingTable(Arrays.asList("logicTable", "subLogicTable"))); + assertTrue(createShardingRule().isAllBindingTables(Collections.singletonList("logicTable"))); + assertTrue(createShardingRule().isAllBindingTables(Collections.singletonList("subLogicTable"))); + assertTrue(createShardingRule().isAllBindingTables(Arrays.asList("logicTable", "subLogicTable"))); } private ShardingRule createShardingRule() { -- GitLab