package org.hypergraphdb.type.javaprimitive; import java.util.Comparator; import java.util.TimeZone; public abstract class DateTypeBase<JavaType> extends PrimitiveTypeBase<JavaType> { public static final String INDEX_NAME = "hg_time_value_index"; protected abstract long toLong(JavaType x); protected abstract JavaType fromLong(long x); protected String getIndexName() { return INDEX_NAME; } protected JavaType readBytes(byte[] bytes, int offset) { return fromLong(bytesToLong(bytes,offset)); } private static long bytesToLong(byte[] bytes, int offset) { long x = (((long)bytes[offset] << 56) + ((long)(bytes[offset + 1] & 255) << 48) + ((long)(bytes[offset + 2] & 255) << 40) + ((long)(bytes[offset + 3] & 255) << 32) + ((long)(bytes[offset + 4] & 255) << 24) + ((bytes[offset + 5] & 255) << 16) + ((bytes[offset + 6] & 255) << 8) + ((bytes[offset + 7] & 255) << 0)); return x + TimeZone.getDefault().getRawOffset(); } protected byte[] writeBytes(JavaType value) { byte [] data = new byte[8]; long v = toLong(value) - TimeZone.getDefault().getRawOffset(); data[0] = (byte) ((v >>> 56)); data[1] = (byte) ((v >>> 48)); data[2] = (byte) ((v >>> 40)); data[3] = (byte) ((v >>> 32)); data[4] = (byte) ((v >>> 24)); data[5] = (byte) ((v >>> 16)); data[6] = (byte) ((v >>> 8)); data[7] = (byte) ((v >>> 0)); return data; } private Comparator<byte[]> comparator = null; public static class DateComparator<T> implements Comparator<byte[]>, java.io.Serializable { private static final long serialVersionUID = 1L; public int compare(byte [] left, byte [] right) { long l = bytesToLong(left, dataOffset); long r = bytesToLong(right, dataOffset); return Long.signum(l-r); } }; public Comparator<byte[]> getComparator() { if (comparator == null) comparator = new DateComparator<JavaType>(); return comparator; } }