MyCat分表分库规则实现

  /***
 * 先根据截取字段的日期分组,再根据字段值数据按天入表
 * @author Fx_demon
 *
 */

public class PartitionBySubstringRangeDateDay extends AbstractPartitionAlgorithm
        implements RuleAlgorithm {
    
    private static final long serialVersionUID = -6211713068380831727L;

    private static final Logger LOGGER = LoggerFactory.getLogger(PartitionBySubstringRangeDateDay.class);

    private int startIndex; // 从第N位开始截取字符串
    private String dateFormat;// 日期格式 ,yyMMdd或者yyyyMMdd
    private int dateFormatLength;

    /** 日期分组 */
    private List<String[]> rangeDate;
    private int rangeDateSize;

    /** 每个分组对应的数据库节点数量 ,逗号分隔, 配置如 3 , 6 */
    private int[] partitionCount;
    private PartitionByDate[] partitionByDay;


    @Override
    public void init() {
        dateFormatLength = dateFormat.length();
        rangeDateSize = rangeDate.size();

        if (rangeDateSize != partitionCount.length) {
            throw new IllegalArgumentException("rangeDate not match partitionCount");
        }
    }


    @Override
    public Integer calculate(String columnValue) {
        String date = columnValue.substring(startIndex, startIndex + dateFormatLength);
        date = date.replace("-", "");
        int count = 0;
        for (int i = 0; i < rangeDateSize; i++) {
           
            String rangeDateStart = rangeDate.get(i)[0].replace("-", "");
            String rangeDateEnd = rangeDate.get(i)[1].replace("-", "");
           
            if (date.compareTo(rangeDateStart) >= 0 && date.compareTo(rangeDateEnd) <= 0) {
               
                this.partitionByDay[i].setsBeginDate(rangeDate.get(i)[0]);
                this.partitionByDay[i].setsEndDate(rangeDate.get(i)[1]);
               
                return partitionByDay[i].calculate(columnValue) + count;
            } else {
                count += partitionCount[i];
            }

        }
        return null;
    }


    // 在columnValue截取日期的起始记录
    public void setStartIndex(String startIndex) {
        this.startIndex = Integer.parseInt(startIndex);
    }


    // 数据库节点的数量
    public void setPartitionCount(String partitionCount) {
        String[] partitionCountStr = partitionCount.split(",");
        this.partitionCount = new int[partitionCountStr.length];
        this.partitionByDay = new PartitionByDate[partitionCountStr.length];
        for (int i = 0; i < partitionCountStr.length; i++) {
            this.partitionCount[i] = Integer.parseInt(partitionCountStr[i]);
            this.partitionByDay[i] = new PartitionByDate();
            this.partitionByDay[i].setDateFormat(dateFormat);
            this.partitionByDay[i].setsBeginDate("2017-01-01");
            this.partitionByDay[i].setsPartionDay("1");
            this.partitionByDay[i].init();
        }
    }


    /** 日期分组,逗号分隔如 ,【 20170101@20170331 , 20170401@20170630】 或  【 20170101@20170331 , 2017-04-01@2017-06-30】*/
    public void setRangeDate(String rangeDateStr) {
        String[] rangeDateArr = rangeDateStr.split(",");
        this.rangeDate = new LinkedList<>();
        for (String rangeDate : rangeDateArr) {
            String[] date = rangeDate.trim().split("@");
            date[0] = date[0].trim();
            date[1] = date[1].trim();
            this.rangeDate.add(date);
        }
    }


    public void setDateFormat(final String dateFormat) {
        if ((!"yyMMdd".equals(dateFormat) && !"yyyyMMdd".equals(dateFormat) && ( !"yyyy-MM-dd".equals(dateFormat))) ) {
            throw new IllegalArgumentException("only support yyyyMMdd or yyMMdd or yyyy-MM-dd ");
        }
        this.dateFormat = dateFormat;
    }


    @Override
    public int getPartitionNum() {
        int sum = 0;
        for (int i : this.partitionCount)
            sum += i;
        return sum;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值