package com.mogujie.trade.tsharding.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 分片计算器
*
* @auther qigong on 5/28/15 1:06 PM.
*/
public class ShardingCaculator {
/**
* 根据分片参数值计算分表名
*
* @param shardingPara
* @return 分表名0xxx
*/
public static String caculateTableName(Long shardingPara) {
if (shardingPara >= 0) {
return "TradeOrder" + getNumberWithZeroSuffix((shardingPara % 10000) % 512);
}
return null;
}
/**
* 根据分片参数值计算分表名
*
* @param shardingPara
* @return 分表名0xxx
*/
public static Integer caculateTableIndex(Long shardingPara) {
if (shardingPara >= 0) {
return new Long(shardingPara % 10000 % 512).intValue();
}
return null;
}
/**
* 根据分片参数值计算分库名(逻辑库)
*
* @param shardingPara
* @return 分库名000x
*/
public static String caculateSchemaName(String fieldName, Long shardingPara) {
if (shardingPara >= 0) {
if ("sellerUserId".equals(fieldName)) {
return "sellertrade" + getNumberWithZeroSuffix(((shardingPara % 10000) % 512) / 64);
} else {
return "trade" + getNumberWithZeroSuffix(((shardingPara % 10000) % 512) / 64);
}
}
return null;
}
/**
* 根据分片参数值计算数据源名
*
* @param shardingPara
* @return DatasourceName 见数据源配置文件
*/
public static String caculateDatasourceName(String fieldName, Long shardingPara) {
if (shardingPara >= 0) {
if ("sellerUserId".equals(fieldName)) {
return "seller_ds_" + ((shardingPara % 10000) % 512) / 256;
} else {
return "buyer_ds_" + ((shardingPara % 10000) % 512) / 256;
}
}
return null;
}
public static String getNumberWithZeroSuffix(long number) {
if (number >= 100) {
return "0" + number;
} else if (number >= 10) {
return "00" + number;
} else if (number >= 0) {
return "000" + number;
}
return null;
}
/**
* 按订单号批量查询:跨表查,先按分表做分组
*
* @param listShopOrderIds
* @return tableNo -> orderIds
*/
public static Map<Integer, List<Long>> getTableNoAndOrderIdsMap(List<Long> listShopOrderIds) {
HashMap<Integer, List<Long>> shopOrderIdsMap = new HashMap();
if (listShopOrderIds == null || listShopOrderIds.size() == 0) {
return shopOrderIdsMap;
}
for (Long shopOrderId : listShopOrderIds) {
Integer tableNo = ShardingCaculator.caculateTableIndex(shopOrderId);
List<Long> orderIds = shopOrderIdsMap.get(tableNo);
if (orderIds == null) {
orderIds = new ArrayList<>();
}
orderIds.add(shopOrderId);
shopOrderIdsMap.put(tableNo, orderIds);
}
return shopOrderIdsMap;
}
public static void main(String args[]) {
System.out.println(caculateTableName(6000004386417L));
System.out.println(caculateSchemaName("buyerUserId", 6000004386417L));
System.out.println(caculateTableName(35586213L));
System.out.println(caculateSchemaName("sellerUserId", 35586213L));
}
}