package com.gxx.sharding.base; import java.util.Collection; import java.util.LinkedHashSet; import org.apache.log4j.Logger; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm; import com.google.common.collect.Range; /** * 用户单字段分表算法 * @author Gxx */ public class UserSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm { /** * 日志处理器 */ private Logger logger = Logger.getLogger(UserSingleKeyTableShardingAlgorithm.class); /** * sql == 规则 * sharding_00.user_0 * sharding_00.user_1 * sharding_01.user_0 * sharding_01.user_1 */ public String doEqualSharding(Collection tableNames, ShardingValue shardingValue) { logger.info("用户单字段分表算法:sql equal 规则"); logger.info("sharding value:" + shardingValue.getValue()); for (String each : tableNames) { if (each.endsWith(shardingValue.getValue() % 2 + "")) { logger.info("扫描到表:" + each); return each; } } logger.info("没有扫描到任何表"); throw new IllegalArgumentException(); } /** * sql in 规则 */ public Collection doInSharding(Collection tableNames, ShardingValue shardingValue) { logger.info("用户单字段分表算法:sql in 规则"); logger.info("sharding values:" + shardingValue.getValues()); Collection result = new LinkedHashSet(tableNames.size()); for (long value : shardingValue.getValues()) { logger.info("sharding value:" + value); for (String each : tableNames) { if (each.endsWith(value % 2 + "")) { logger.info("扫描到表:" + each); result.add(each); } } } logger.info("扫描最终结果:" + result); return result; } /** * sql between 规则 */ public Collection doBetweenSharding(Collection tableNames, ShardingValue shardingValue) { logger.info("用户单字段分表算法:sql in 规则"); logger.info("sharding value range:" + shardingValue.getValueRange()); Collection result = new LinkedHashSet(tableNames.size()); Range range = (Range) shardingValue.getValueRange(); for (long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) { logger.info("sharding value:" + i); for (String each : tableNames) { if (each.endsWith(i % 2 + "")) { logger.info("扫描到表:" + each); result.add(each); } } } logger.info("扫描最终结果:" + result); return result; } }