package com.taobao.tddl.executor.function.scalar;
import com.taobao.tddl.executor.function.ScalarFunction;
import com.taobao.tddl.optimizer.core.datatype.DataType;
import com.taobao.tddl.optimizer.core.datatype.DataTypeUtil;
import com.taobao.tddl.optimizer.core.expression.ISelectable;
/**
* @since 5.0.0
*/
public class Not extends ScalarFunction {
@Override
public void compute(Object[] args) {
result = this.computeInner(args);
}
@Override
public DataType getReturnType() {
Object[] args = function.getArgs().toArray();
DataType type = null;
if (args[0] instanceof ISelectable) {
type = ((ISelectable) args[0]).getDataType();
}
if (type == null) {
type = DataTypeUtil.getTypeOfObject(args[0]);
}
if (type == DataType.BooleanType) {
return DataType.BooleanType;
} else {
return DataType.IntegerType;
}
}
private Object computeInner(Object[] args) {
DataType type = getReturnType();
Object obj = type.convertFrom(args[0]);
if (obj instanceof Number) {
return ((Number) args[0]).longValue() == 0 ? 1 : 0;
} else if (obj instanceof Boolean) {
return obj;
} else {
// 非数字类型全为false,一般不会走到这逻辑
return false;
}
}
}