RangeTableShardingAlgorithm.java 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package com.huojutech.sharding.algorithm;
  2. import java.sql.Timestamp;
  3. import java.util.ArrayList;
  4. import java.util.Calendar;
  5. import java.util.Collection;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import groovy.util.logging.Slf4j;
  9. import io.shardingsphere.core.api.algorithm.sharding.ListShardingValue;
  10. import io.shardingsphere.core.api.algorithm.sharding.PreciseShardingValue;
  11. import io.shardingsphere.core.api.algorithm.sharding.RangeShardingValue;
  12. import io.shardingsphere.core.api.algorithm.sharding.ShardingValue;
  13. import io.shardingsphere.core.api.algorithm.sharding.standard.RangeShardingAlgorithm;
  14. @Slf4j
  15. public class RangeTableShardingAlgorithm implements RangeShardingAlgorithm<String> {
  16. public Collection<String> doSharding(Collection<String> availableTargetNames,
  17. Collection<ShardingValue> shardingValues) {
  18. Collection<Object> orderCodeValues = getShardingValue(shardingValues, "order_code");
  19. Collection<Object> dateValues = getShardingValue(shardingValues, "gmt_create");
  20. List<String> shardingSuffix = new ArrayList<>();
  21. /**例如:根据user_id + order_id 双分片键来进行分表*/
  22. //Set<List<Integer>> valueResult = Sets.cartesianProduct(userIdValues, orderIdValues);
  23. for (Object orderCode : orderCodeValues) {
  24. long code = Long.parseLong(((String)orderCode).substring(16, 20));
  25. for (Object date : dateValues) {
  26. Timestamp timestamp = (Timestamp)date;
  27. Calendar calendar = Calendar.getInstance();
  28. calendar.setTimeInMillis(timestamp.getTime());
  29. int year = calendar.get(Calendar.YEAR);
  30. String suffix = year + "_" + (code&0x001);
  31. availableTargetNames.forEach(x -> {
  32. if (x.endsWith(suffix)) {
  33. shardingSuffix.add(x);
  34. }
  35. });
  36. }
  37. }
  38. return shardingSuffix;
  39. }
  40. private Collection<Object> getShardingValue(Collection<ShardingValue> shardingValues, final String key) {
  41. Collection<Object> valueSet = new ArrayList<>();
  42. Iterator<ShardingValue> iterator = shardingValues.iterator();
  43. while (iterator.hasNext()) {
  44. ShardingValue next = iterator.next();
  45. if (next instanceof ListShardingValue) {
  46. ListShardingValue value = (ListShardingValue) next;
  47. /**例如:根据user_id + order_id 双分片键来进行分表*/
  48. if (value.getColumnName().equals(key)) {
  49. return value.getValues();
  50. }
  51. }
  52. }
  53. return valueSet;
  54. }
  55. public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
  56. long code = Long.parseLong((shardingValue.getValue()).substring(16, 20));
  57. long year = Long.parseLong((shardingValue.getValue()).substring(0, 4));
  58. String suffix = year + "_" + (code&0x001);
  59. for (String tableName : availableTargetNames) {
  60. if (tableName.endsWith(suffix)) {
  61. return tableName;
  62. }
  63. }
  64. return null;
  65. }
  66. @Override
  67. public Collection<String> doSharding(Collection<String> availableTargetNames,
  68. RangeShardingValue<String> shardingValue) {
  69. return null;
  70. }
  71. }