package com.taobao.tddl.optimizer.core.datatype; import java.math.BigDecimal; import com.taobao.tddl.common.exception.TddlRuntimeException; /** * {@link BigDecimal}类型 * * @author jianghang 2014-1-21 下午1:54:11 * @since 5.0.0 */ public class BigDecimalType extends CommonType<BigDecimal> { private static final BigDecimal maxValue = BigDecimal.valueOf(Long.MAX_VALUE); private static final BigDecimal minValue = BigDecimal.valueOf(Long.MIN_VALUE); private static final BigDecimal zeroValue = BigDecimal.valueOf(0); private final Calculator calculator = new Calculator() { @Override public Object add(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.add(i2); } @Override public Object sub(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.subtract(i2); } @Override public Object multiply(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.multiply(i2); } @Override public Object divide(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.divide(i2, 6, BigDecimal.ROUND_HALF_UP); } @Override public Object mod(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.remainder(i2); } @Override public Object and(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return (i1.compareTo(zeroValue) != 0) && (i2.compareTo(zeroValue) != 0); } @Override public Object or(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return (i1.compareTo(zeroValue) != 0) || (i2.compareTo(zeroValue) != 0); } @Override public Object not(Object v1) { BigDecimal i1 = convertFrom(v1); return (i1.compareTo(zeroValue) == 0); } @Override public Object bitAnd(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.toBigInteger().and(i2.toBigInteger()); } @Override public Object bitOr(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.toBigInteger().or(i2.toBigInteger()); } @Override public Object bitNot(Object v1) { BigDecimal i1 = convertFrom(v1); return i1.toBigInteger().not(); } @Override public Object xor(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return (i1.compareTo(zeroValue) != 0) ^ (i2.compareTo(zeroValue) != 0); } @Override public Object bitXor(Object v1, Object v2) { BigDecimal i1 = convertFrom(v1); BigDecimal i2 = convertFrom(v2); return i1.toBigInteger().xor(i2.toBigInteger()); } }; @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.calculateEncodedLength(convertFrom(value)); } } @Override public DecodeResult decodeFromBytes(byte[] bytes, int offset) { try { BigDecimal[] vs = new BigDecimal[1]; int lenght = DataDecoder.decode(bytes, offset, vs); return new DecodeResult(vs[0], lenght); } catch (CorruptEncodingException e) { throw new TddlRuntimeException(e); } } @Override public BigDecimal incr(Object value) { return convertFrom(value).add(BigDecimal.ONE); } @Override public BigDecimal decr(Object value) { return convertFrom(value).subtract(BigDecimal.ONE); } @Override public BigDecimal getMaxValue() { return maxValue; } @Override public BigDecimal getMinValue() { return minValue; } @Override public Calculator getCalculator() { return calculator; } }