package jef.database.routing.function; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import jef.database.annotation.PartitionFunction; import jef.database.query.RegexpDimension; import jef.tools.StringUtils; import jef.tools.string.CharUtils; import jef.tools.string.StringIterator; import com.google.common.base.Objects; /** * 描述针对分表的维度,不是一个可度量的维度,而是直接将这个字符串拼到表名中 */ public final class RawFunc implements PartitionFunction<Object>{ private String[] nullValue; private int maxLen; public RawFunc(String defaultWhenFieldIsNull, int maxLen) { if (defaultWhenFieldIsNull.length() > 0) { this.nullValue = StringUtils.split(defaultWhenFieldIsNull, ','); for (int i = 0; i < nullValue.length; i++) { nullValue[i] = nullValue[i].trim(); } } if (maxLen > 0) this.maxLen = maxLen; } public String eval(Object value) { return String.valueOf(value); } @SuppressWarnings("unchecked") public List<Object> iterator(Object min, Object max, boolean left, boolean right) { if (min == null && max == null) { if (nullValue != null) { return Arrays.asList((Object[]) nullValue); } else { return Collections.EMPTY_LIST; } } else if (Objects.equal(min, max)) { return Arrays.asList(min); } else { // 范围丢失 if ((min instanceof Integer) && (max instanceof Integer)){ return iteratorInt((Integer) min, (Integer) max,left,right); } else if ((min instanceof Long) && (max instanceof Long)) { return iteratorLong((Long) min, (Long) max,left,right); } else if (min instanceof String || max instanceof String) { return iteratorString((String) min, (String) max,left,right); } else { return Arrays.asList(min, max); } } } @SuppressWarnings("unchecked") private List<Object> iteratorLong(long min, long max,boolean left,boolean right) { List<Object> result = new ArrayList<Object>(); if (max < min) { return Collections.EMPTY_LIST; } long step = 1; if ((max - min) > 1000) { step = (max - min) / 100; } long i = left?min:min+step; for (; i < max; i += step) { result.add(i); } if (right && i < max) { result.add(max); } return result; } @SuppressWarnings("unchecked") private List<Object> iteratorInt(int min, int max,boolean left,boolean right) { List<Object> result = new ArrayList<Object>(); if (max < min) { return Collections.EMPTY_LIST; } int step = 1; if ((max - min) > 1000) { step = (max - min) / 100; } int i = left?min:min+step; for (; i < max; i += step) { result.add(i); } if (right && i < max) { result.add(max); } return result; } private List<Object> iteratorString(String min, String max,boolean left, boolean right) { //由于字符串截断因素的影响,开始的位置都应该当做是闭区间。 StringIterator st = new StringIterator(min, max, maxLen, "0123456789".toCharArray(),true,right); List<Object> result = new ArrayList<Object>(); while (st.hasNext()) { result.add(st.next()); } return result; } public boolean acceptRegexp() { return true; } public Collection<Object> iterator(RegexpDimension regexp) { if (maxLen > 0 && regexp.getBaseExp().length() >= maxLen) { return Arrays.<Object> asList(regexp.getBaseExp()); } else { String baseExp = regexp.getBaseExp(); Collection<Object> list = new ArrayList<Object>(100); for (char c : CharUtils.ALPHA_NUM_UNDERLINE) { list.add(baseExp + c); } return list; } } }