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

Format sharding algorithm (#6000)

上级 250d4a5a
......@@ -84,12 +84,12 @@ public final class CustomDateTimeShardingAlgorithm implements StandardShardingAl
@Getter
@Setter
private Properties properties = new Properties();
@Override
public String getType() {
return "CUSTOM_DATE_TIME";
}
@Override
public void init() {
Preconditions.checkNotNull(properties.getProperty(DATE_TIME_FORMAT));
......
......@@ -48,7 +48,7 @@ public final class DatetimeShardingAlgorithm implements StandardShardingAlgorith
private static final String PARTITION_SECONDS = "partition.seconds";
private static final String DATETIME_LOWER = "datetime.lower";
private static final String DATETIME_UPPER = "datetime.upper";
private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
......@@ -58,10 +58,10 @@ public final class DatetimeShardingAlgorithm implements StandardShardingAlgorith
@Getter
@Setter
private Properties properties = new Properties();
@Getter
private int autoTablesAmount;
@Override
public void init() {
Preconditions.checkNotNull(properties.get(PARTITION_SECONDS), "Sharding partition volume cannot be null.");
......@@ -98,21 +98,21 @@ public final class DatetimeShardingAlgorithm implements StandardShardingAlgorith
}
return result;
}
private int doSharding(final long shardingValue) {
DecimalFormat decimalFormat = new DecimalFormat("0.00");
String position = decimalFormat.format((float) shardingValue / getPartitionValue());
return Math.min(Math.max(0, (int) Math.ceil(Float.parseFloat(position))), autoTablesAmount - 1);
}
private int getFirstPartition(final Range<Comparable<?>> valueRange) {
return valueRange.hasLowerBound() ? doSharding(parseDate(valueRange.lowerEndpoint())) : 0;
}
private int getLastPartition(final Range<Comparable<?>> valueRange) {
return valueRange.hasUpperBound() ? doSharding(parseDate(valueRange.upperEndpoint())) : autoTablesAmount - 1;
}
private boolean checkDatetimePattern(final String datetime) {
try {
DATE_FORMAT.parse(datetime);
......
......@@ -42,7 +42,7 @@ public final class HashShardingAlgorithm implements StandardShardingAlgorithm<Co
@Getter
@Setter
private Properties properties = new Properties();
@Override
public void init() {
Preconditions.checkNotNull(properties.get(MODULO_VALUE), "Modulo value cannot be null.");
......@@ -75,7 +75,7 @@ public final class HashShardingAlgorithm implements StandardShardingAlgorithm<Co
public String getType() {
return "HASH_MOD";
}
@Override
public int getAutoTablesAmount() {
Preconditions.checkNotNull(properties.get(MODULO_VALUE), "Modulo value cannot be null.");
......
......@@ -42,7 +42,7 @@ public final class ModuloShardingAlgorithm implements StandardShardingAlgorithm<
@Getter
@Setter
private Properties properties = new Properties();
@Override
public void init() {
Preconditions.checkNotNull(properties.get(MODULO_VALUE), "Modulo value cannot be null.");
......@@ -90,7 +90,7 @@ public final class ModuloShardingAlgorithm implements StandardShardingAlgorithm<
public String getType() {
return "MOD";
}
@Override
public int getAutoTablesAmount() {
Preconditions.checkNotNull(properties.get(MODULO_VALUE), "Modulo value cannot be null.");
......
......@@ -35,7 +35,7 @@ public final class InlineShardingAlgorithm implements StandardShardingAlgorithm<
private static final String ALGORITHM_EXPRESSION = "algorithm.expression";
private static final String ALLOW_RANGE_QUERY = "allow.range.query.with.inline.sharding";
private Closure<?> closure;
private Properties properties = new Properties();
......@@ -72,7 +72,7 @@ public final class InlineShardingAlgorithm implements StandardShardingAlgorithm<
public void setProperties(final Properties properties) {
this.properties = properties;
}
@Override
public void init() {
Preconditions.checkNotNull(properties.get(ALGORITHM_EXPRESSION), "Inline sharding algorithm expression cannot be null.");
......
......@@ -35,26 +35,26 @@ import java.util.Properties;
* Abstract range sharding algorithm.
*/
public abstract class AbstractRangeShardingAlgorithm implements StandardShardingAlgorithm<Long>, ShardingAutoTableAlgorithm {
private Map<Integer, Range<Long>> partitionRangeMap;
@Getter
@Setter
private Properties properties = new Properties();
@Override
public final void init() {
partitionRangeMap = createPartitionRangeMap(properties);
}
abstract Map<Integer, Range<Long>> createPartitionRangeMap(Properties properties);
@Override
public final String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<Long> shardingValue) {
return availableTargetNames.stream().filter(each -> each.endsWith(getPartition(partitionRangeMap, shardingValue.getValue()) + ""))
.findFirst().orElseThrow(UnsupportedOperationException::new);
}
@Override
public final Collection<String> doSharding(final Collection<String> availableTargetNames, final RangeShardingValue<Long> shardingValue) {
Collection<String> result = new LinkedHashSet<>(availableTargetNames.size());
......@@ -69,15 +69,15 @@ public abstract class AbstractRangeShardingAlgorithm implements StandardSharding
}
return result;
}
private int getFirstPartition(final Range<Long> valueRange) {
return valueRange.hasLowerBound() ? getPartition(partitionRangeMap, valueRange.lowerEndpoint()) : 0;
}
private int getLastPartition(final Range<Long> valueRange) {
return valueRange.hasUpperBound() ? getPartition(partitionRangeMap, valueRange.upperEndpoint()) : partitionRangeMap.size() - 1;
}
private Integer getPartition(final Map<Integer, Range<Long>> partitionRangeMap, final Long value) {
for (Entry<Integer, Range<Long>> entry : partitionRangeMap.entrySet()) {
if (entry.getValue().contains(value)) {
......@@ -86,7 +86,7 @@ public abstract class AbstractRangeShardingAlgorithm implements StandardSharding
}
throw new UnsupportedOperationException();
}
@Override
public final int getAutoTablesAmount() {
return partitionRangeMap.size();
......
......@@ -51,7 +51,7 @@ public final class CustomRangeShardingAlgorithm extends AbstractRangeShardingAlg
public String getType() {
return "CUSTOM_RANGE";
}
@Override
public Map<Integer, Range<Long>> createPartitionRangeMap(final Properties properties) {
Preconditions.checkNotNull(properties.get(PARTITION_RANGES), "Custom range sharding algorithm partition ranges cannot be null.");
......
......@@ -52,7 +52,7 @@ public final class StandardRangeShardingAlgorithm extends AbstractRangeShardingA
public String getType() {
return "STANDARD_RANGE";
}
@Override
public Map<Integer, Range<Long>> createPartitionRangeMap(final Properties properties) {
Preconditions.checkNotNull(properties.get(RANGE_LOWER), "Standard range sharding algorithm partition lower cannot be null.");
......
......@@ -58,7 +58,7 @@ public class CustomDateTimeShardingAlgorithmTest {
initShardStrategyByMonth();
initShardStrategyByQuarter();
}
@Test
public void assertPreciseDoShardingByQuarter() {
List<RouteValue> shardingValues = Lists.newArrayList(new ListRouteValue<>("create_time", "t_order",
......@@ -68,7 +68,7 @@ public class CustomDateTimeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_202001"));
assertTrue(actual.contains("t_order_202002"));
}
@Test
public void assertRangeDoShardingByQuarter() {
Range<String> rangeValue = Range.closed("2019-10-15 10:59:08", "2020-04-08 10:59:08");
......@@ -76,7 +76,7 @@ public class CustomDateTimeShardingAlgorithmTest {
Collection<String> actual = shardingStrategyByQuarter.doSharding(availableTablesForQuarterStrategy, shardingValues, new ConfigurationProperties(new Properties()));
assertThat(actual.size(), is(3));
}
@Test
public void assertPreciseDoShardingByMonth() {
List<RouteValue> shardingValues = Lists.newArrayList(new ListRouteValue<>("create_time", "t_order",
......@@ -86,7 +86,7 @@ public class CustomDateTimeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_202001"));
assertTrue(actual.contains("t_order_202004"));
}
@Test
public void assertRangeDoShardingByMonth() {
Range<String> rangeValue = Range.closed("2019-10-15 10:59:08", "2020-04-08 10:59:08");
......@@ -94,7 +94,7 @@ public class CustomDateTimeShardingAlgorithmTest {
Collection<String> actual = shardingStrategyByMonth.doSharding(availableTablesForMonthStrategy, shardingValues, new ConfigurationProperties(new Properties()));
assertThat(actual.size(), is(7));
}
@Test
public void assertLowerHalfRangeDoSharding() {
Range<String> rangeValue = Range.atLeast("2018-10-15 10:59:08");
......@@ -102,7 +102,7 @@ public class CustomDateTimeShardingAlgorithmTest {
Collection<String> actual = shardingStrategyByQuarter.doSharding(availableTablesForQuarterStrategy, shardingValues, new ConfigurationProperties(new Properties()));
assertThat(actual.size(), is(9));
}
@Test
public void assertUpperHalfRangeDoSharding() {
Range<String> rangeValue = Range.atMost("2019-09-01 00:00:00");
......@@ -110,7 +110,7 @@ public class CustomDateTimeShardingAlgorithmTest {
Collection<String> actual = shardingStrategyByQuarter.doSharding(availableTablesForQuarterStrategy, shardingValues, new ConfigurationProperties(new Properties()));
assertThat(actual.size(), is(15));
}
@Test
public void assertFormat() {
String inputFormat = "yyyy-MM-dd HH:mm:ss.SSS";
......@@ -123,7 +123,7 @@ public class CustomDateTimeShardingAlgorithmTest {
assertEquals("202004", tableNameShardedByQuarter);
assertEquals("202010", tableNameShardedByMonth);
}
private void initShardStrategyByQuarter() {
CustomDateTimeShardingAlgorithm shardingAlgorithm = new CustomDateTimeShardingAlgorithm();
shardingAlgorithm.getProperties().setProperty("datetime.format", "yyyy-MM-dd HH:mm:ss");
......@@ -141,7 +141,7 @@ public class CustomDateTimeShardingAlgorithmTest {
}
}
}
private void initShardStrategyByMonth() {
CustomDateTimeShardingAlgorithm shardingAlgorithm = new CustomDateTimeShardingAlgorithm();
shardingAlgorithm.getProperties().setProperty("datetime.format", "yyyy-MM-dd HH:mm:ss");
......
......@@ -60,7 +60,7 @@ public final class DatetimeShardingAlgorithmTest {
assertThat(actual.size(), is(1));
assertTrue(actual.contains("t_order_1"));
}
@Test
public void assertPreciseDoShardingWithFirstPartition() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3");
......@@ -71,7 +71,7 @@ public final class DatetimeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_0"));
assertTrue(actual.contains("t_order_1"));
}
@Test
public void assertPreciseDoShardingBeyondTheLastOne() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3", "t_order_4", "t_order_5");
......@@ -102,7 +102,7 @@ public final class DatetimeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_2"));
assertTrue(actual.contains("t_order_3"));
}
@Test
public void assertRangeDoShardingWithoutLowerBound() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3");
......@@ -115,7 +115,7 @@ public final class DatetimeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_2"));
assertTrue(actual.contains("t_order_3"));
}
@Test
public void assertRangeDoShardingWithoutUpperBound() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3", "t_order_4", "t_order_5");
......@@ -127,7 +127,7 @@ public final class DatetimeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_4"));
assertTrue(actual.contains("t_order_5"));
}
@Test
public void assertGetAutoTablesAmount() {
DatetimeShardingAlgorithm shardingAlgorithm = new DatetimeShardingAlgorithm();
......
......@@ -38,7 +38,7 @@ public final class InlineShardingAlgorithmTest {
private StandardShardingStrategy shardingStrategy;
private StandardShardingStrategy shardingStrategyWithSimplified;
@Before
public void setUp() {
InlineShardingAlgorithm shardingAlgorithm = new InlineShardingAlgorithm();
......@@ -52,7 +52,7 @@ public final class InlineShardingAlgorithmTest {
StandardShardingStrategyConfiguration shardingStrategyConfigWithSimplified = new StandardShardingStrategyConfiguration("order_id", shardingAlgorithmWithSimplified);
shardingStrategyWithSimplified = new StandardShardingStrategy(shardingStrategyConfigWithSimplified);
}
@Test
public void assertDoSharding() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3");
......@@ -62,7 +62,7 @@ public final class InlineShardingAlgorithmTest {
Collection<String> actualWithSimplified = shardingStrategyWithSimplified.doSharding(availableTargetNames, shardingValues, new ConfigurationProperties(new Properties()));
assertThat(actualWithSimplified.size(), is(4));
}
@Test
public void assertDoShardingWithNonExistNodes() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1");
......@@ -72,7 +72,7 @@ public final class InlineShardingAlgorithmTest {
Collection<String> actualWithSimplified = shardingStrategyWithSimplified.doSharding(availableTargetNames, shardingValues, new ConfigurationProperties(new Properties()));
assertThat(actualWithSimplified.size(), is(2));
}
@Test
public void assertGetShardingColumns() {
assertThat(shardingStrategy.getShardingColumns().size(), is(1));
......
......@@ -62,7 +62,7 @@ public final class StandardRangeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_2"));
assertTrue(actual.contains("t_order_5"));
}
@Test
public void assertRangeDoShardingWithoutLowerBound() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3", "t_order_4", "t_order_5");
......@@ -72,7 +72,7 @@ public final class StandardRangeShardingAlgorithmTest {
assertTrue(actual.contains("t_order_0"));
assertTrue(actual.contains("t_order_1"));
}
@Test
public void assertRangeDoShardingWithoutUpperBound() {
List<String> availableTargetNames = Lists.newArrayList("t_order_0", "t_order_1", "t_order_2", "t_order_3", "t_order_4", "t_order_5");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册