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 { public Collection doSharding(Collection availableTargetNames, Collection shardingValues) { Collection orderCodeValues = getShardingValue(shardingValues, "order_code"); Collection dateValues = getShardingValue(shardingValues, "gmt_create"); List shardingSuffix = new ArrayList<>(); /**例如:根据user_id + order_id 双分片键来进行分表*/ //Set> 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 getShardingValue(Collection shardingValues, final String key) { Collection valueSet = new ArrayList<>(); Iterator 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 availableTargetNames, PreciseShardingValue 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 doSharding(Collection availableTargetNames, RangeShardingValue shardingValue) { return null; } }