1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package com.huojutech.sharding.algorithm;
-
- import java.sql.Timestamp;
- import java.util.ArrayList;
- import java.util.Calendar;
- import java.util.Collection;
- import java.util.Iterator;
- import java.util.List;
-
- import groovy.util.logging.Slf4j;
- import io.shardingsphere.core.api.algorithm.sharding.ListShardingValue;
- import io.shardingsphere.core.api.algorithm.sharding.PreciseShardingValue;
- import io.shardingsphere.core.api.algorithm.sharding.RangeShardingValue;
- import io.shardingsphere.core.api.algorithm.sharding.ShardingValue;
- import io.shardingsphere.core.api.algorithm.sharding.standard.RangeShardingAlgorithm;
-
- @Slf4j
- public class RangeTableShardingAlgorithm implements RangeShardingAlgorithm<String> {
-
-
- public Collection<String> doSharding(Collection<String> availableTargetNames,
- Collection<ShardingValue> shardingValues) {
-
- Collection<Object> orderCodeValues = getShardingValue(shardingValues, "order_code");
- Collection<Object> dateValues = getShardingValue(shardingValues, "gmt_create");
- List<String> shardingSuffix = new ArrayList<>();
-
- /**例如:根据user_id + order_id 双分片键来进行分表*/
- //Set<List<Integer>> valueResult = Sets.cartesianProduct(userIdValues, orderIdValues);
- for (Object orderCode : orderCodeValues) {
- long code = Long.parseLong(((String)orderCode).substring(16, 20));
-
- for (Object date : dateValues) {
- Timestamp timestamp = (Timestamp)date;
- Calendar calendar = Calendar.getInstance();
- calendar.setTimeInMillis(timestamp.getTime());
- int year = calendar.get(Calendar.YEAR);
- String suffix = year + "_" + (code&0x001);
-
- availableTargetNames.forEach(x -> {
- if (x.endsWith(suffix)) {
- shardingSuffix.add(x);
- }
- });
- }
- }
-
- return shardingSuffix;
- }
-
- private Collection<Object> getShardingValue(Collection<ShardingValue> shardingValues, final String key) {
- Collection<Object> valueSet = new ArrayList<>();
- Iterator<ShardingValue> iterator = shardingValues.iterator();
- while (iterator.hasNext()) {
- ShardingValue next = iterator.next();
- if (next instanceof ListShardingValue) {
- ListShardingValue value = (ListShardingValue) next;
- /**例如:根据user_id + order_id 双分片键来进行分表*/
- if (value.getColumnName().equals(key)) {
- return value.getValues();
- }
- }
- }
- return valueSet;
- }
-
- public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
- long code = Long.parseLong((shardingValue.getValue()).substring(16, 20));
- long year = Long.parseLong((shardingValue.getValue()).substring(0, 4));
- String suffix = year + "_" + (code&0x001);
-
- for (String tableName : availableTargetNames) {
- if (tableName.endsWith(suffix)) {
- return tableName;
- }
- }
- return null;
- }
-
- @Override
- public Collection<String> doSharding(Collection<String> availableTargetNames,
- RangeShardingValue<String> shardingValue) {
-
-
- return null;
- }
-
- }
|