Skip to content

Commit

Permalink
fix #61
Browse files Browse the repository at this point in the history
  • Loading branch information
terrymanu committed May 19, 2016
1 parent b5539fc commit e360c9c
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,22 +42,24 @@ public static void initAlgorithm() {

@Test
public void testEqual() {
Collection<String> result = algorithm.doSharding(Collections.singletonList("t_order_1"), Collections.<ShardingValue<?>>singletonList(new ShardingValue<>("id", 1L)));
Collection<String> result = algorithm.doSharding(Collections.singletonList("t_order_1"), Collections.<ShardingValue<?>>singletonList(new ShardingValue<>("t_order", "id", 1L)));
assertThat(result.size(), is(1));
assertThat(result, hasItem("t_order_1"));
}

@Test
public void testIn() {
Collection<String> result = algorithm.doSharding(Arrays.asList("t_order_0", "t_order_1"), Collections.<ShardingValue<?>>singletonList(new ShardingValue<>("id", Arrays.asList(1, 2))));
Collection<String> result = algorithm.doSharding(Arrays.asList("t_order_0", "t_order_1"),
Collections.<ShardingValue<?>>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.<ShardingValue<?>>singletonList(new ShardingValue<>("id", Range.range(1, BoundType.CLOSED, 2, BoundType.OPEN))));
algorithm.doSharding(Arrays.asList("t_order_0", "t_order_1"),
Collections.<ShardingValue<?>>singletonList(new ShardingValue<>("t_order", "id", Range.range(1, BoundType.CLOSED, 2, BoundType.OPEN))));
}

@Test(expected = NullPointerException.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public void addDatabaseShardingValue(final String logicTable, final String shard
* @param values 分片值
*/
public void addDatabaseShardingValue(final String logicTable, final String shardingColumn, final Condition.BinaryOperator binaryOperator, final Comparable<?>... values) {
databaseShardingValues.put(new ShardingKey(logicTable, shardingColumn), getShardingValue(shardingColumn, binaryOperator, values));
databaseShardingValues.put(new ShardingKey(logicTable, shardingColumn), getShardingValue(logicTable, shardingColumn, binaryOperator, values));
}

/**
Expand All @@ -101,19 +101,19 @@ public void addTableShardingValue(final String logicTable, final String sharding
* @param values 分片值
*/
public void addTableShardingValue(final String logicTable, final String shardingColumn, final Condition.BinaryOperator binaryOperator, final Comparable<?>... values) {
tableShardingValues.put(new ShardingKey(logicTable, shardingColumn), getShardingValue(shardingColumn, binaryOperator, values));
tableShardingValues.put(new ShardingKey(logicTable, shardingColumn), getShardingValue(logicTable, shardingColumn, binaryOperator, values));
}

@SuppressWarnings("unchecked")
private ShardingValue getShardingValue(final String shardingColumn, final Condition.BinaryOperator binaryOperator, final Comparable<?>[] values) {
private ShardingValue getShardingValue(final String logicTable, final String shardingColumn, final Condition.BinaryOperator binaryOperator, final Comparable<?>[] values) {
Preconditions.checkArgument(null != values && values.length > 0);
switch (binaryOperator) {
case EQUAL:
return new ShardingValue<Comparable<?>>(shardingColumn, values[0]);
return new ShardingValue<Comparable<?>>(logicTable, shardingColumn, values[0]);
case IN:
return new ShardingValue(shardingColumn, Arrays.asList(values));
return new ShardingValue(logicTable, shardingColumn, Arrays.asList(values));
case BETWEEN:
return new ShardingValue(shardingColumn, Range.range(values[0], BoundType.CLOSED, values[1], BoundType.CLOSED));
return new ShardingValue(logicTable, shardingColumn, Range.range(values[0], BoundType.CLOSED, values[1], BoundType.CLOSED));
default:
throw new UnsupportedOperationException(binaryOperator.getExpression());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
@ToString
public final class ShardingValue<T extends Comparable<?>> {

private final String logicTableName;

private final String columnName;

private final T value;
Expand All @@ -50,16 +52,16 @@ public final class ShardingValue<T extends Comparable<?>> {

private final Range<T> valueRange;

public ShardingValue(final String columnName, final T value) {
this(columnName, value, Collections.<T>emptyList(), null);
public ShardingValue(final String logicTableName, final String columnName, final T value) {
this(logicTableName, columnName, value, Collections.<T>emptyList(), null);
}

public ShardingValue(final String columnName, final Collection<T> values) {
this(columnName, null, values, null);
public ShardingValue(final String logicTableName, final String columnName, final Collection<T> values) {
this(logicTableName, columnName, null, values, null);
}

public ShardingValue(final String columnName, final Range<T> valueRange) {
this(columnName, null, Collections.<T>emptyList(), valueRange);
public ShardingValue(final String logicTableName, final String columnName, final Range<T> valueRange) {
this(logicTableName, columnName, null, Collections.<T>emptyList(), valueRange);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ public final class Condition {
/**
* 列对象.
*
* @author gaohongtao, zhangliang
* @author gaohongtao
* @author zhangliang
*/
@RequiredArgsConstructor
@Getter
Expand All @@ -61,7 +62,8 @@ public static final class Column {
/**
* 操作符枚举.
*
* @author gaohongtao, zhangliang
* @author gaohongtao
* @author zhangliang
*/
@RequiredArgsConstructor
public enum BinaryOperator {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@ public static ShardingValue<?> convertConditionToShardingValue(final Condition c
case EQUAL:
case IN:
if (1 == conditionValues.size()) {
return new ShardingValue<Comparable<?>>(condition.getColumn().getColumnName(), conditionValues.get(0));
return new ShardingValue<Comparable<?>>(condition.getColumn().getTableName(), condition.getColumn().getColumnName(), conditionValues.get(0));
}
return new ShardingValue<>(condition.getColumn().getColumnName(), conditionValues);
return new ShardingValue<>(condition.getColumn().getTableName(), condition.getColumn().getColumnName(), conditionValues);
case BETWEEN:
return new ShardingValue<>(condition.getColumn().getColumnName(), Range.range(conditionValues.get(0), BoundType.CLOSED, conditionValues.get(1), BoundType.CLOSED));
return new ShardingValue<>(condition.getColumn().getTableName(), condition.getColumn().getColumnName(),
Range.range(conditionValues.get(0), BoundType.CLOSED, conditionValues.get(1), BoundType.CLOSED));
default:
throw new UnsupportedOperationException(condition.getOperator().getExpression());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,31 +30,34 @@ public final class ShardingValueTest {

@Test
public void assertGetTypeWithSingleValue() {
assertThat(new ShardingValue<>("columnName", "value").getType(), is(ShardingValueType.SINGLE));
assertThat(new ShardingValue<>("logicTableName", "columnName", "value").getType(), is(ShardingValueType.SINGLE));
}

@Test
public void assertGetTypeWithMultipleValue() {
assertThat(new ShardingValue<>("columnName", Collections.singletonList("value")).getType(), is(ShardingValueType.LIST));
assertThat(new ShardingValue<>("logicTableName", "columnName", Collections.singletonList("value")).getType(), is(ShardingValueType.LIST));
}

@Test
public void assertGetTypeWithRangeValue() {
assertThat(new ShardingValue<>("columnName", Range.closed(10, 20)).getType(), is(ShardingValueType.RANGE));
assertThat(new ShardingValue<>("logicTableName", "columnName", Range.closed(10, 20)).getType(), is(ShardingValueType.RANGE));
}

@Test
public void assertToStringWithSingleValue() {
assertThat(new ShardingValue<>("columnName", "value").toString(), is("ShardingValue(columnName=columnName, value=value, values=[], valueRange=null)"));
assertThat(new ShardingValue<>("logicTableName", "columnName", "value").toString(), is(
"ShardingValue(logicTableName=logicTableName, columnName=columnName, value=value, values=[], valueRange=null)"));
}

@Test
public void assertToStringWithMultipleValue() {
assertThat(new ShardingValue<>("columnName", Collections.singletonList("value")).toString(), is("ShardingValue(columnName=columnName, value=null, values=[value], valueRange=null)"));
assertThat(new ShardingValue<>("logicTableName", "columnName", Collections.singletonList("value")).toString(), is(
"ShardingValue(logicTableName=logicTableName, columnName=columnName, value=null, values=[value], valueRange=null)"));
}

@Test
public void assertToStringWithRangeValue() {
assertThat(new ShardingValue<>("columnName", Range.closed(10, 20)).toString(), is("ShardingValue(columnName=columnName, value=null, values=[], valueRange=[10‥20])"));
assertThat(new ShardingValue<>("logicTableName", "columnName", Range.closed(10, 20)).toString(), is(
"ShardingValue(logicTableName=logicTableName, columnName=columnName, value=null, values=[], valueRange=[10‥20])"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,27 +52,29 @@ public void assertDoStaticShardingForInsertWithoutShardingColumns() {
@Test
public void assertDoStaticShardingForEqualSingleKey() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestSingleKeyShardingAlgorithm());
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("column", "1"))), is((Collection<String>) Collections.singletonList("1")));
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("logicTable", "column", "1"))),
is((Collection<String>) Collections.singletonList("1")));
}

@Test
public void assertDoStaticShardingForInSingleKey() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestSingleKeyShardingAlgorithm());
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("column", Arrays.asList("1", "3")))),
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("logicTable", "column", Arrays.asList("1", "3")))),
is((Collection<String>) Arrays.asList("1", "3")));
}

@Test
public void assertDoStaticShardingForBetweenSingleKey() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestSingleKeyShardingAlgorithm());
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("column", Range.open("1", "3")))),
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("logicTable", "column", Range.open("1", "3")))),
is((Collection<String>) Arrays.asList("1", "2", "3")));
}

@Test
public void assertDoStaticShardingForMultipleKeys() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestMultipleKeysShardingAlgorithm());
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("column", "1"))), is((Collection<String>) Arrays.asList("1", "2", "3")));
assertThat(strategy.doStaticSharding(SQLStatementType.SELECT, targets, createShardingValues(new ShardingValue<>("logicTable", "column", "1"))),
is((Collection<String>) Arrays.asList("1", "2", "3")));
}

@Test(expected = IllegalStateException.class)
Expand All @@ -84,25 +86,25 @@ public void assertDoDynamicShardingWithoutShardingColumns() {
@Test
public void assertDoDynamicShardingForEqualSingleKey() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestSingleKeyShardingAlgorithm());
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("column", "1"))), is((Collection<String>) Collections.singletonList("1")));
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("logicTable", "column", "1"))), is((Collection<String>) Collections.singletonList("1")));
}

@Test
public void assertDoDynamicShardingForInSingleKey() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestSingleKeyShardingAlgorithm());
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("column", Arrays.asList("1", "3")))), is((Collection<String>) Arrays.asList("1", "3")));
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("logicTable", "column", Arrays.asList("1", "3")))), is((Collection<String>) Arrays.asList("1", "3")));
}

@Test
public void assertDoDynamicShardingForBetweenSingleKey() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestSingleKeyShardingAlgorithm());
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("column", Range.open("1", "3")))), is((Collection<String>) Arrays.asList("1", "2", "3")));
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("logicTable", "column", Range.open("1", "3")))), is((Collection<String>) Arrays.asList("1", "2", "3")));
}

@Test
public void assertDoDynamicShardingForMultipleKeys() {
ShardingStrategy strategy = new ShardingStrategy("column", new TestMultipleKeysShardingAlgorithm());
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("column", "1"))), is((Collection<String>) Collections.<String>emptyList()));
assertThat(strategy.doDynamicSharding(createShardingValues(new ShardingValue<>("logicTable", "column", "1"))), is((Collection<String>) Collections.<String>emptyList()));
}

private Collection<ShardingValue<?>> createShardingValues(final ShardingValue<String> shardingValue) {
Expand Down
1 change: 1 addition & 0 deletions sharding-jdbc-doc/content/post/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ weight = 1

### 功能提升

1. [ISSUE #61](https://github.com/dangdangdotcom/sharding-jdbc/issues/61) 在ShardingValue类中加入逻辑表名
1. [ISSUE #66](https://github.com/dangdangdotcom/sharding-jdbc/issues/66) 在JDBC层的Statement增加对get/set MaxFieldSize,MaxRows和QueryTimeout的支持

### 缺陷修正
Expand Down
1 change: 0 additions & 1 deletion sharding-jdbc-doc/content/post/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ weight = 11

### config 2.0
1. 动态表配置 `(完成)`
1. 只分库不需要逻辑表和真实表对应配置
1. 简化只分库配置,无需配置逻辑表和真实表对应关系
1. 简化只分表配置,可指定默认数据源,简化单库TableRule配置

Expand Down

0 comments on commit e360c9c

Please sign in to comment.