package com.taobao.tddl.optimizer.core.datatype;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.taobao.tddl.common.exception.NotSupportException;
import com.taobao.tddl.common.exception.TddlRuntimeException;
import com.taobao.tddl.common.model.BaseRowSet;
import com.taobao.tddl.common.utils.convertor.Convertor;
/**
* {@link Date}类型
*
* @author jianghang 2014-1-21 下午5:20:32
* @since 5.0.0
*/
public class DateType extends AbstractDataType<java.sql.Date> {
private static final Date maxDate = Date.valueOf("9999-12-31");
private static final Date minDate = Date.valueOf("1900-01-01");
private Convertor longToDate = null;
public DateType(){
longToDate = this.getConvertor(Long.class);
}
@Override
public ResultGetter getResultGetter() {
return new ResultGetter() {
@Override
public Object get(ResultSet rs, int index) throws SQLException {
return rs.getDate(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(DataType.LongType.convertFrom(value), dst, offset);
}
@Override
public int getLength(Object value) {
if (value == null) {
return 1;
} else {
return 9;
}
}
@Override
public DecodeResult decodeFromBytes(byte[] bytes, int offset) {
try {
Long v = DataDecoder.decodeLongObj(bytes, offset);
if (v == null) {
return new DecodeResult(null, getLength(v));
} else {
Date date = (Date) longToDate.convert(v, getDataClass());
return new DecodeResult(date, getLength(v));
}
} catch (CorruptEncodingException e) {
throw new TddlRuntimeException(e);
}
}
@Override
public Date incr(Object value) {
return new Date(((Date) value).getTime() + 1l);
}
@Override
public Date decr(Object value) {
return new Date(((Date) value).getTime() - 1l);
}
@Override
public Date getMaxValue() {
return maxDate;
}
@Override
public Date getMinValue() {
return minDate;
}
@Override
public int compare(Object o1, Object o2) {
if (o1 == o2) {
return 0;
}
if (o1 == null) {
return -1;
}
if (o2 == null) {
return 1;
}
Date d1 = convertFrom(o1);
Date d2 = convertFrom(o2);
return d1.compareTo(d2);
}
@Override
public Calculator getCalculator() {
throw new NotSupportException("时间类型不支持算术符操作");
}
}