提交 98d7732d 编写于 作者: T terrymanu

refactor ShardingStrategy: auto merge in, split range strategy 13th version

上级 289759ac
......@@ -17,6 +17,7 @@
package com.dangdang.ddframe.rdb.sharding.config.common.internal.algorithm;
import com.dangdang.ddframe.rdb.sharding.api.RangeShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ListShardingValue;
import com.dangdang.ddframe.rdb.sharding.routing.strategy.MultipleKeysShardingAlgorithm;
......@@ -59,16 +60,10 @@ public class ClosureShardingAlgorithm implements MultipleKeysShardingAlgorithm {
List<String> columnNames = new ArrayList<>(shardingValues.size());
for (ShardingValue<?> each : shardingValues) {
columnNames.add(each.getColumnName());
switch (each.getType()) {
case SINGLE:
case LIST:
valuesDim.add(Sets.<Comparable>newHashSet(((ListShardingValue) each).getValues()));
break;
case RANGE:
throw new UnsupportedOperationException("Inline expression does not support BETWEEN, please use Java API Config");
default:
throw new UnsupportedOperationException(each.getType().name());
if (each instanceof RangeShardingValue) {
throw new UnsupportedOperationException("Inline expression does not support BETWEEN, please use Java API Config");
}
valuesDim.add(Sets.<Comparable>newHashSet(((ListShardingValue) each).getValues()));
}
Set<List<Comparable>> cartesianValues = Sets.cartesianProduct(valuesDim);
List<String> result = new ArrayList<>(cartesianValues.size());
......
......@@ -38,9 +38,4 @@ public final class ListShardingValue<T extends Comparable<?>> implements Shardin
private final String columnName;
private final Collection<T> values;
@Override
public ShardingValueType getType() {
return ShardingValueType.LIST;
}
}
......@@ -37,9 +37,4 @@ public final class RangeShardingValue<T extends Comparable<?>> implements Shardi
private final String columnName;
private final Range<T> valueRange;
@Override
public ShardingValueType getType() {
return ShardingValueType.RANGE;
}
}
......@@ -37,11 +37,4 @@ public interface ShardingValue<T extends Comparable<?>> {
* @return column name
*/
String getColumnName();
/**
* Get sharding value type.
*
* @return sharding value type
*/
ShardingValueType getType();
}
package com.dangdang.ddframe.rdb.sharding.api;
/**
* Sharding value type.
*
* @author zhangliang
*/
public enum ShardingValueType {
/**
* Sharding for {@code =}.
*/
SINGLE,
/**
* Sharding for {@code IN}.
*/
LIST,
/**
* Sharding for {@code BETWEEN}.
*/
RANGE
}
......@@ -36,9 +36,4 @@ public final class SingleShardingValue<T extends Comparable<?>> implements Shard
private final String columnName;
private final T value;
@Override
public ShardingValueType getType() {
return ShardingValueType.SINGLE;
}
}
......@@ -105,12 +105,10 @@ public class ShardingStrategy {
if (shardingAlgorithm instanceof SingleKeyShardingAlgorithm) {
SingleKeyShardingAlgorithm<?> singleKeyShardingAlgorithm = (SingleKeyShardingAlgorithm<?>) shardingAlgorithm;
ShardingValue shardingValue = shardingValues.iterator().next();
switch (shardingValue.getType()) {
case RANGE:
return singleKeyShardingAlgorithm.doBetweenSharding(availableTargetNames, (RangeShardingValue) shardingValue);
default:
throw new UnsupportedOperationException(shardingValue.getType().getClass().getName());
if (shardingValue instanceof RangeShardingValue) {
return singleKeyShardingAlgorithm.doBetweenSharding(availableTargetNames, (RangeShardingValue) shardingValue);
}
throw new UnsupportedOperationException("Cannot support shardingValue:" + shardingValue);
}
if (shardingAlgorithm instanceof MultipleKeysShardingAlgorithm) {
return ((MultipleKeysShardingAlgorithm) shardingAlgorithm).doSharding(availableTargetNames, shardingValues);
......
......@@ -17,9 +17,9 @@
package com.dangdang.ddframe.rdb.sharding.routing.type.hint;
import com.dangdang.ddframe.rdb.sharding.api.RangeShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ListShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ShardingValueType;
import com.dangdang.ddframe.rdb.sharding.api.SingleShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule;
import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy;
......@@ -80,7 +80,7 @@ public final class DatabaseHintRoutingEngine implements RoutingEngine {
}
private boolean isAccurateSharding(final ShardingValue shardingValue, final ShardingStrategy shardingStrategy) {
return shardingStrategy.getShardingAlgorithm() instanceof SingleKeyShardingAlgorithm && ShardingValueType.RANGE != shardingValue.getType();
return shardingStrategy.getShardingAlgorithm() instanceof SingleKeyShardingAlgorithm && !(shardingValue instanceof RangeShardingValue);
}
@SuppressWarnings("unchecked")
......
......@@ -17,9 +17,9 @@
package com.dangdang.ddframe.rdb.sharding.routing.type.simple;
import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ListShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ShardingValueType;
import com.dangdang.ddframe.rdb.sharding.api.RangeShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.SingleShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.rule.DataNode;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
......@@ -155,7 +155,7 @@ public final class SimpleRoutingEngine implements RoutingEngine {
}
private boolean isAccurateSharding(final List<ShardingValue> shardingValues, final ShardingStrategy shardingStrategy) {
return 1 == shardingValues.size() && shardingStrategy.getShardingAlgorithm() instanceof SingleKeyShardingAlgorithm && ShardingValueType.RANGE != shardingValues.get(0).getType();
return 1 == shardingValues.size() && shardingStrategy.getShardingAlgorithm() instanceof SingleKeyShardingAlgorithm && !(shardingValues.get(0) instanceof RangeShardingValue);
}
@SuppressWarnings("unchecked")
......
......@@ -34,16 +34,16 @@ public final class MultipleKeysModuloDatabaseShardingAlgorithm implements Multip
@Override
public Collection<String> doSharding(final Collection<String> availableTargetNames, final Collection<ShardingValue> shardingValues) {
ShardingValue shardingValue = shardingValues.iterator().next();
switch (shardingValue.getType()) {
case SINGLE:
return doEqualSharding(availableTargetNames, (SingleShardingValue<Integer>) shardingValue);
case LIST:
return doInSharding(availableTargetNames, (ListShardingValue<Integer>) shardingValue);
case RANGE:
return doBetweenSharding(availableTargetNames, (RangeShardingValue<Integer>) shardingValue);
default:
throw new UnsupportedOperationException();
if (shardingValue instanceof SingleShardingValue) {
return doEqualSharding(availableTargetNames, (SingleShardingValue<Integer>) shardingValue);
}
if (shardingValue instanceof ListShardingValue) {
return doInSharding(availableTargetNames, (ListShardingValue<Integer>) shardingValue);
}
if (shardingValue instanceof RangeShardingValue) {
return doBetweenSharding(availableTargetNames, (RangeShardingValue<Integer>) shardingValue);
}
throw new UnsupportedOperationException();
}
private Collection<String> doEqualSharding(final Collection<String> availableTargetNames, final SingleShardingValue<Integer> shardingValue) {
......
......@@ -46,7 +46,6 @@ public final class HintManagerTest {
ShardingKey shardingKey = new ShardingKey("logicTable", "shardingColumn");
assertTrue(HintManagerHolder.getDatabaseShardingValue(shardingKey).isPresent());
assertThat(hintManager.getDatabaseShardingValue(shardingKey).getColumnName(), is("shardingColumn"));
assertThat(hintManager.getDatabaseShardingValue(shardingKey).getType(), is(ShardingValueType.LIST));
assertThat(((ListShardingValue) hintManager.getDatabaseShardingValue(shardingKey)).getValues().size(), is(3));
}
}
......@@ -58,7 +57,6 @@ public final class HintManagerTest {
ShardingKey shardingKey = new ShardingKey("logicTable", "shardingColumn");
assertTrue(HintManagerHolder.getDatabaseShardingValue(shardingKey).isPresent());
assertThat(hintManager.getDatabaseShardingValue(shardingKey).getColumnName(), is("shardingColumn"));
assertThat(hintManager.getDatabaseShardingValue(shardingKey).getType(), is(ShardingValueType.RANGE));
assertThat(((RangeShardingValue) hintManager.getDatabaseShardingValue(shardingKey)).getValueRange().lowerEndpoint(), is((Comparable) 1));
assertThat(((RangeShardingValue) hintManager.getDatabaseShardingValue(shardingKey)).getValueRange().upperEndpoint(), is((Comparable) 10));
}
......@@ -83,7 +81,6 @@ public final class HintManagerTest {
ShardingKey shardingKey = new ShardingKey("logicTable", "shardingColumn");
assertTrue(HintManagerHolder.getTableShardingValue(shardingKey).isPresent());
assertThat(hintManager.getTableShardingValue(shardingKey).getColumnName(), is("shardingColumn"));
assertThat(hintManager.getTableShardingValue(shardingKey).getType(), is(ShardingValueType.LIST));
assertThat(((ListShardingValue) hintManager.getTableShardingValue(shardingKey)).getValues().size(), is(3));
}
}
......@@ -95,7 +92,6 @@ public final class HintManagerTest {
ShardingKey shardingKey = new ShardingKey("logicTable", "shardingColumn");
assertTrue(HintManagerHolder.getTableShardingValue(shardingKey).isPresent());
assertThat(hintManager.getTableShardingValue(shardingKey).getColumnName(), is("shardingColumn"));
assertThat(hintManager.getTableShardingValue(shardingKey).getType(), is(ShardingValueType.RANGE));
assertThat(((RangeShardingValue) hintManager.getTableShardingValue(shardingKey)).getValueRange().lowerEndpoint(), is((Comparable) 1));
assertThat(((RangeShardingValue) hintManager.getTableShardingValue(shardingKey)).getValueRange().upperEndpoint(), is((Comparable) 10));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册