package com.taobao.tddl.optimizer.core.datatype;
import com.taobao.tddl.common.exception.NotSupportException;
import com.taobao.tddl.common.exception.TddlRuntimeException;
public class BooleanType extends CommonType<Boolean> {
private final Calculator calculator = new Calculator() {
@Override
public Object add(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return (i1 ? 1 : 0) + (i2 ? 1 : 0);
}
@Override
public Object sub(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return (i1 ? 1 : 0) - (i2 ? 1 : 0);
}
@Override
public Object multiply(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return (i1 ? 1 : 0) * (i2 ? 1 : 0);
}
@Override
public Object divide(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
if (!i2) {
throw new TddlRuntimeException("false不能作为除数");
}
return (i1 ? 1 : 0) / (i2 ? 1 : 0);
}
@Override
public Object mod(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return (i1 ? 1 : 0) % (i2 ? 1 : 0);
}
@Override
public Object and(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return (i1) && (i2);
}
@Override
public Object or(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return (i1) || (i2);
}
@Override
public Object not(Object v1) {
Boolean i1 = convertFrom(v1);
return !i1;
}
@Override
public Object bitAnd(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return i1 & i2;
}
@Override
public Object bitOr(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return i1 | i2;
}
@Override
public Object bitNot(Object v1) {
Boolean i1 = convertFrom(v1);
return !i1;
}
@Override
public Object xor(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return i1 ^ i2;
}
@Override
public Object bitXor(Object v1, Object v2) {
Boolean i1 = convertFrom(v1);
Boolean i2 = convertFrom(v2);
return i1 ^ i2;
}
};
@Override
public int encodeToBytes(Object value, byte[] dst, int offset) {
DataEncoder.encode(this.convertFrom(value), dst, offset);
return getLength(null);
}
@Override
public int getLength(Object value) {
return 1;
}
@Override
public DecodeResult decodeFromBytes(byte[] bytes, int offset) {
try {
Boolean v = DataDecoder.decodeBooleanObj(bytes, offset);
return new DecodeResult(v, getLength(v));
} catch (CorruptEncodingException e) {
throw new TddlRuntimeException(e);
}
}
@Override
public Boolean incr(Object value) {
throw new NotSupportException("boolean类型不支持incr操作");
}
@Override
public Boolean decr(Object value) {
throw new NotSupportException("boolean类型不支持decr操作");
}
@Override
public Boolean getMaxValue() {
return Boolean.TRUE; // 1代表true
}
@Override
public Boolean getMinValue() {
return Boolean.FALSE; // 0代表false
}
@Override
public Calculator getCalculator() {
return calculator;
}
}