package com.taobao.tddl.optimizer.core.datatype; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; 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 Time}类型 * * @author jianghang 2014-1-21 下午5:33:07 * @since 5.0.0 */ public class TimeType extends AbstractDataType<java.sql.Time> { private static final Time maxTime = Time.valueOf("23:59:59"); private static final Time minTime = Time.valueOf("00:00:00"); private Convertor longToDate = null; public TimeType(){ longToDate = this.getConvertor(Long.class); } @Override public ResultGetter getResultGetter() { return new ResultGetter() { @Override public Object get(ResultSet rs, int index) throws SQLException { return rs.getTime(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 { Time date = (Time) longToDate.convert(v, getDataClass()); return new DecodeResult(date, getLength(v)); } } catch (CorruptEncodingException e) { throw new TddlRuntimeException(e); } } @Override public Time incr(Object value) { return new Time(((Time) value).getTime() + 1l); } @Override public Time decr(Object value) { return new Time(((Time) value).getTime() - 1l); } @Override public Time getMaxValue() { return maxTime; } @Override public Time getMinValue() { return minTime; } @Override public int compare(Object o1, Object o2) { if (o1 == o2) { return 0; } if (o1 == null) { return -1; } if (o2 == null) { return 1; } Time d1 = convertFrom(o1); Time d2 = convertFrom(o2); return d1.compareTo(d2); } @Override public Calculator getCalculator() { throw new NotSupportException("时间类型不支持算术符操作"); } }