package com.taobao.tddl.optimizer.core.datatype; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; import com.taobao.tddl.common.exception.TddlRuntimeException; import com.taobao.tddl.common.model.BaseRowSet; public class StringType extends AbstractDataType<String> { private final Calculator calculator = new Calculator() { public BigDecimal convertToBigDecimal(Object v) { return DataType.BigDecimalType.convertFrom(v); } @Override public Object xor(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().xor(d1, d2); } @Override public Object sub(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().sub(d1, d2); } @Override public Object or(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().or(d1, d2); } @Override public Object not(Object v1) { BigDecimal d1 = convertToBigDecimal(v1); return DataType.BigDecimalType.getCalculator().not(d1); } @Override public Object multiply(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().multiply(d1, d2); } @Override public Object mod(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().mod(d1, d2); } @Override public Object divide(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().divide(d1, d2); } @Override public Object bitXor(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().bitXor(d1, d2); } @Override public Object bitOr(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().bitOr(d1, d2); } @Override public Object bitNot(Object v1) { BigDecimal d1 = convertToBigDecimal(v1); return DataType.BigDecimalType.getCalculator().bitNot(d1); } @Override public Object bitAnd(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().bitAnd(d1, d2); } @Override public Object and(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().and(d1, d2); } @Override public Object add(Object v1, Object v2) { BigDecimal d1 = convertToBigDecimal(v1); BigDecimal d2 = convertToBigDecimal(v2); return DataType.BigDecimalType.getCalculator().add(d1, d2); } }; @Override public ResultGetter getResultGetter() { return new ResultGetter() { @Override public Object get(ResultSet rs, int index) throws SQLException { return rs.getString(index); } @Override public Object get(BaseRowSet rs, int index) { Object val = rs.getObject(index); return convertFrom(val); } }; } @Override public int encodeToBytes(Object value, byte[] dst, int offset) { return DataEncoder.encode(this.convertFrom(value), dst, offset); } @Override public int getLength(Object value) { if (value == null) { return 1; } else { return KeyEncoder.calculateEncodedStringLength(this.convertFrom(value)); } } @Override public DecodeResult decodeFromBytes(byte[] bytes, int offset) { try { String[] vs = new String[1]; int lenght = DataDecoder.decodeString(bytes, offset, vs); return new DecodeResult(vs[0], lenght); } catch (CorruptEncodingException e) { throw new TddlRuntimeException(e); } } @Override public String incr(Object value) { String c = convertFrom(value); StringBuilder newStr = new StringBuilder(c); newStr.setCharAt(newStr.length() - 1, (char) (newStr.charAt(newStr.length() - 1) + 1)); return newStr.toString(); } @Override public String decr(Object value) { String c = convertFrom(value); StringBuilder newStr = new StringBuilder(c); newStr.setCharAt(newStr.length() - 1, (char) (newStr.charAt(newStr.length() - 1) - 1)); return newStr.toString(); } @Override public String getMaxValue() { return new String(new char[] { Character.MAX_VALUE }); } @Override public String getMinValue() { return null; // 返回null值 } @Override public int compare(Object o1, Object o2) { if (o1 == o2) { return 0; } if (o1 == null) { return -1; } if (o2 == null) { return 1; } String no1 = convertFrom(o1); String no2 = convertFrom(o2); /** * mysql 默认不区分大小写,这里可能是个坑 */ return no1.compareToIgnoreCase(no2); } @Override public Calculator getCalculator() { return calculator; } }