package org.opencloudb.route.function;
import org.opencloudb.config.model.rule.RuleAlgorithm;
/**
* 直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)。
* <function name="sub" class="org.opencloudb.route.function.PartitionDirectBySubString">
* <property name="startIndex">9</property> <!-- zero-based -->
* <property name="size">2</property>
* <property name="partitionCount">8</property>
* <property name="defaultPartition">0</property>
* </function>
*/
public class PartitionDirectBySubString extends AbstractPartionAlgorithm implements RuleAlgorithm {
// 字符子串起始索引(zero-based)
private int startIndex;
// 字串长度
private int size;
// 分区数量
private int partitionCount;
// 默认分区(在分区数量定义时,字串标示的分区编号不在分区数量内时,使用默认分区)
private int defaultPartition;
public void setStartIndex(String str) {
startIndex = Integer.parseInt(str);
}
public void setSize(String str) {
size = Integer.parseInt(str);
}
public void setPartitionCount(String partitionCount) {
this.partitionCount = Integer.parseInt(partitionCount);
}
public void setDefaultPartition(String defaultPartition) {
this.defaultPartition = Integer.parseInt(defaultPartition);
}
@Override
public void init() {
}
@Override
public Integer calculate(String columnValue) {
String partitionSubString = columnValue.substring(startIndex, startIndex + size);
int partition = Integer.parseInt(partitionSubString, 10);
return partitionCount > 0 && partition >= partitionCount
? defaultPartition : partition;
}
}