From c1f710584ade784de2232a7ceb090956307efdea Mon Sep 17 00:00:00 2001 From: Albert Shift Date: Sat, 12 Sep 2015 20:35:24 -0700 Subject: [PATCH] refactor Timeuuid, add minOf and maxOf methods for Timeuuid --- .../core/operation/SelectOperation.java | 2 +- ...rter.java => DateToTimeuuidConverter.java} | 6 ++- ...rter.java => TimeuuidToDateConverter.java} | 6 ++- .../casser/mapping/javatype/DateJavaType.java | 8 ++-- .../Timeuuid.java} | 40 +++++++++++++------ .../UuidBuilder.java} | 28 +++++++++---- 6 files changed, 61 insertions(+), 29 deletions(-) rename src/main/java/com/noorq/casser/mapping/convert/{DateToTimeUUIDConverter.java => DateToTimeuuidConverter.java} (86%) rename src/main/java/com/noorq/casser/mapping/convert/{TimeUUIDToDateConverter.java => TimeuuidToDateConverter.java} (83%) rename src/main/java/com/noorq/casser/{mapping/convert/TimeUUIDUtil.java => support/Timeuuid.java} (52%) rename src/main/java/com/noorq/casser/{mapping/convert/UUIDBuilder.java => support/UuidBuilder.java} (71%) diff --git a/src/main/java/com/noorq/casser/core/operation/SelectOperation.java b/src/main/java/com/noorq/casser/core/operation/SelectOperation.java index 8754811..7a18777 100644 --- a/src/main/java/com/noorq/casser/core/operation/SelectOperation.java +++ b/src/main/java/com/noorq/casser/core/operation/SelectOperation.java @@ -225,7 +225,7 @@ public final class SelectOperation extends AbstractFilterStreamOperation { +public enum DateToTimeuuidConverter implements Function { INSTANCE; @Override public UUID apply(Date source) { long milliseconds = source.getTime(); - return TimeUUIDUtil.createTimeUUID(milliseconds); + return Timeuuid.of(milliseconds); } } diff --git a/src/main/java/com/noorq/casser/mapping/convert/TimeUUIDToDateConverter.java b/src/main/java/com/noorq/casser/mapping/convert/TimeuuidToDateConverter.java similarity index 83% rename from src/main/java/com/noorq/casser/mapping/convert/TimeUUIDToDateConverter.java rename to src/main/java/com/noorq/casser/mapping/convert/TimeuuidToDateConverter.java index 8a34f29..68bfd6d 100644 --- a/src/main/java/com/noorq/casser/mapping/convert/TimeUUIDToDateConverter.java +++ b/src/main/java/com/noorq/casser/mapping/convert/TimeuuidToDateConverter.java @@ -19,13 +19,15 @@ import java.util.Date; import java.util.UUID; import java.util.function.Function; -public enum TimeUUIDToDateConverter implements Function { +import com.noorq.casser.support.Timeuuid; + +public enum TimeuuidToDateConverter implements Function { INSTANCE; @Override public Date apply(UUID source) { - return new Date(TimeUUIDUtil.getTimestampMillis(source)); + return new Date(Timeuuid.getTimestampMillis(source)); } } diff --git a/src/main/java/com/noorq/casser/mapping/javatype/DateJavaType.java b/src/main/java/com/noorq/casser/mapping/javatype/DateJavaType.java index 2ba5c4e..8656b25 100644 --- a/src/main/java/com/noorq/casser/mapping/javatype/DateJavaType.java +++ b/src/main/java/com/noorq/casser/mapping/javatype/DateJavaType.java @@ -26,8 +26,8 @@ import com.datastax.driver.core.DataType; import com.noorq.casser.core.SessionRepository; import com.noorq.casser.mapping.ColumnType; import com.noorq.casser.mapping.annotation.Types; -import com.noorq.casser.mapping.convert.DateToTimeUUIDConverter; -import com.noorq.casser.mapping.convert.TimeUUIDToDateConverter; +import com.noorq.casser.mapping.convert.DateToTimeuuidConverter; +import com.noorq.casser.mapping.convert.TimeuuidToDateConverter; import com.noorq.casser.mapping.convert.TypedConverter; import com.noorq.casser.mapping.type.AbstractDataType; import com.noorq.casser.mapping.type.DTDataType; @@ -63,7 +63,7 @@ public final class DateJavaType extends AbstractJavaType { return Optional.of(TypedConverter.create( UUID.class, Date.class, - TimeUUIDToDateConverter.INSTANCE)); + TimeuuidToDateConverter.INSTANCE)); } return Optional.empty(); @@ -79,7 +79,7 @@ public final class DateJavaType extends AbstractJavaType { return Optional.of(TypedConverter.create( Date.class, UUID.class, - DateToTimeUUIDConverter.INSTANCE)); + DateToTimeuuidConverter.INSTANCE)); } return Optional.empty(); diff --git a/src/main/java/com/noorq/casser/mapping/convert/TimeUUIDUtil.java b/src/main/java/com/noorq/casser/support/Timeuuid.java similarity index 52% rename from src/main/java/com/noorq/casser/mapping/convert/TimeUUIDUtil.java rename to src/main/java/com/noorq/casser/support/Timeuuid.java index 84f84a7..6157f21 100644 --- a/src/main/java/com/noorq/casser/mapping/convert/TimeUUIDUtil.java +++ b/src/main/java/com/noorq/casser/support/Timeuuid.java @@ -13,36 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.noorq.casser.mapping.convert; +package com.noorq.casser.support; import java.security.SecureRandom; import java.util.Date; import java.util.UUID; -public final class TimeUUIDUtil { +public final class Timeuuid { private static class Holder { static final SecureRandom numberGenerator = new SecureRandom(); } - private TimeUUIDUtil() { + private Timeuuid() { } - public static UUID createTimeUUID(long timestampMillis, int clockSequence, long node) { - return new UUIDBuilder().addVersion(1).addTimestampMillis(timestampMillis).addClockSequence(clockSequence) + public static UUID of(long timestampMillis, int clockSequence, long node) { + return new UuidBuilder().addVersion(1).addTimestampMillis(timestampMillis).addClockSequence(clockSequence) .addNode(node).build(); } - public static UUID createTimeUUID(Date date, int clockSequence, long node) { - return createTimeUUID(date.getTime(), clockSequence, node); + public static UUID of(Date date, int clockSequence, long node) { + return of(date.getTime(), clockSequence, node); } - public static UUID createTimeUUID(long timestampMillis) { - return createTimeUUID(timestampMillis, randomClockSequence(), randomNode()); + public static UUID of(long timestampMillis) { + return of(timestampMillis, randomClockSequence(), randomNode()); } - public static UUID createTimeUUID(Date date) { - return createTimeUUID(date.getTime()); + public static UUID of(Date date) { + return of(date.getTime()); + } + + public static UUID minOf(long timestampMillis) { + return new UuidBuilder().addVersion(1).addTimestampMillis(timestampMillis).setMinClockSeqAndNode().build(); + } + + public static UUID minOf(Date date) { + return minOf(date.getTime()); + } + + public static UUID maxOf(long timestampMillis) { + return new UuidBuilder().addVersion(1).addTimestampMillis(timestampMillis).setMaxClockSeqAndNode().build(); + } + + public static UUID maxOf(Date date) { + return maxOf(date.getTime()); } public static int randomClockSequence() { @@ -54,6 +70,6 @@ public final class TimeUUIDUtil { } public static long getTimestampMillis(UUID uuid) { - return UUIDBuilder.getTimestampMillis(uuid); + return UuidBuilder.getTimestampMillis(uuid); } } diff --git a/src/main/java/com/noorq/casser/mapping/convert/UUIDBuilder.java b/src/main/java/com/noorq/casser/support/UuidBuilder.java similarity index 71% rename from src/main/java/com/noorq/casser/mapping/convert/UUIDBuilder.java rename to src/main/java/com/noorq/casser/support/UuidBuilder.java index 5c4a80d..5deff63 100644 --- a/src/main/java/com/noorq/casser/mapping/convert/UUIDBuilder.java +++ b/src/main/java/com/noorq/casser/support/UuidBuilder.java @@ -13,17 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.noorq.casser.mapping.convert; +package com.noorq.casser.support; import java.util.UUID; -public final class UUIDBuilder { +public final class UuidBuilder { public static final long NUM_100NS_IN_MILLISECOND = 10000L; public static final long NUM_100NS_SINCE_UUID_EPOCH = 0x01b21dd213814000L; + private static final long MIN_CLOCK_SEQ_AND_NODE = 0x8080808080808080L; + private static final long MAX_CLOCK_SEQ_AND_NODE = 0x7f7f7f7f7f7f7f7fL; private long leastSigBits = 0x8000000000000000L; @@ -41,7 +43,7 @@ public final class UUIDBuilder { return new UUID(mostSigBits, leastSigBits); } - public UUIDBuilder addVersion(int version) { + public UuidBuilder addVersion(int version) { if (version < 1 || version > 4) { throw new IllegalArgumentException("unsupported version " + version); } @@ -51,7 +53,7 @@ public final class UUIDBuilder { return this; } - public UUIDBuilder addTimestamp(long uuid100Nanos) { + public UuidBuilder addTimestamp100Nanos(long uuid100Nanos) { long timeLow = uuid100Nanos & 0xffffffffL; long timeMid = uuid100Nanos & 0xffff00000000L; @@ -62,21 +64,31 @@ public final class UUIDBuilder { return this; } - public UUIDBuilder addTimestampMillis(long milliseconds) { + public UuidBuilder addTimestampMillis(long milliseconds) { long uuid100Nanos = milliseconds * NUM_100NS_IN_MILLISECOND + NUM_100NS_SINCE_UUID_EPOCH; - return addTimestamp(uuid100Nanos); + return addTimestamp100Nanos(uuid100Nanos); } - public UUIDBuilder addClockSequence(int clockSequence) { + public UuidBuilder addClockSequence(int clockSequence) { leastSigBits |= ((long) (clockSequence & 0x3fff)) << 48; return this; } - public UUIDBuilder addNode(long node) { + public UuidBuilder addNode(long node) { leastSigBits |= node & 0xffffffffffffL; return this; } + public UuidBuilder setMinClockSeqAndNode() { + this.leastSigBits = MIN_CLOCK_SEQ_AND_NODE; + return this; + } + + public UuidBuilder setMaxClockSeqAndNode() { + this.leastSigBits = MAX_CLOCK_SEQ_AND_NODE; + return this; + } + public static long getTimestampMillis(UUID uuid) { return (uuid.timestamp() - NUM_100NS_SINCE_UUID_EPOCH) / NUM_100NS_IN_MILLISECOND; }