/*
* JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jef.database.routing.function;
/**
* 描述一个对指定类型的函数操作,用来将不同的值转化为分表时的表名后缀
* @author Administrator
*
*/
public enum KeyFunction {
/**
* 对文本取Hash值,然后按1024取模。按照余数的分布来选择到不同的分区上。<p>
* 对应类为:jef.database.routing.function.HashMod1024MappingFunction.HashMod1024MappingFunction<br>
* <h3>算法机制</h3>
* 将文本截断后,计算其HashCode并按1024取模。从而得到一个范围为0~1023的整数。
* 然后根据实现划定的范围,将这个整数映射到一个表名/库名上。
*
* <h3>配置方法一</h3>
* 支持properties参数:<br>
* <code>
* partition.bucket.range = 0:DB1,256:DB2,512:DB3,768:DB4
* </code><br>
* 上述配置等效于<br>
* <code>
* partition.bucket.range = 0-255:DB1,256-511:DB2,512-767:DB3,768-1023:DB4
* </code>
* 上例中,可以控制将0~1023的小片分别平均分到四个表/库中。
*
* <h3>配置方法2</h3>
* 使用Annotation中的functionConstructorParams.
* <code><pre>@PartitionKey(
* field="field",
* function=KeyFunction.HASH_MOD1024_RANGE,
* functionConstructorParams= {"0:DB1,256:DB2,512:DB3,768:DB4","10"}
* )
* </pre></code>
* 使用注解也可以指定该对象的分区范围,第二个参数“10”还可以指定计算hashCode的文本长度。
*/
HASH_MOD1024_RANGE,
/**
* 10求余。参数由functionConstructorParams确定
*/
MODULUS, //取余
/**
* 对指定的日期型字段,获取yyyy格式年份
*/
YEAR, //年
/**
* 对指定的日期型字段,获取yyyyMM格式年月
*/
YEAR_MONTH,//年+月
/**
* 对指定的日期型字段,获取yyyyMMdd格式年月
*/
YEAR_MONTH_DAY,//年月日 yyyyMMdd
/**
* 对指定的日期型字段,获取MM格式月份
*/
MONTH, //月
/**
* 对指定的日期型字段,获取dd格式日
*/
DAY, //日
/**
* 对指定日期类型字段,取年的最后两位
*/
YEAR_LAST2,
/**
* 对指定日期类型字段,取小时数字(24)
*/
HH24,//24小时的小时数
/**
* 对指定日期类型字段,取星期(0表示星期日,1~6)
*/
WEEKDAY,
/**
* 对任意类型的字段,将其数值转换为String<p>
* <b>默认值</b>
*/
RAW,//不处理
/**
* 常量映射,如启动参数配置为如下。
* {@code "M:1,F:2,01-20:3,21-41:4,A-Z:12"}
* 表示当值为M时,映射为1,01~20之间映射为3,21-41之间映射为4。 以此类推
*
*/
MAPPING,
}