From 7398ce07f8381dc352456191b4a39b9414b00f66 Mon Sep 17 00:00:00 2001 From: Peter Lin Date: Sat, 3 Nov 2012 00:21:26 -0400 Subject: [PATCH] Adding serializer for BigDecimal. based the implementation on what cassandra does. --- .../serializers/BigDecimalSerializer.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 core/src/main/java/me/prettyprint/cassandra/serializers/BigDecimalSerializer.java diff --git a/core/src/main/java/me/prettyprint/cassandra/serializers/BigDecimalSerializer.java b/core/src/main/java/me/prettyprint/cassandra/serializers/BigDecimalSerializer.java new file mode 100644 index 000000000..b1b60f96a --- /dev/null +++ b/core/src/main/java/me/prettyprint/cassandra/serializers/BigDecimalSerializer.java @@ -0,0 +1,65 @@ +package me.prettyprint.cassandra.serializers; + +import static me.prettyprint.hector.api.ddl.ComparatorType.DECIMALTYPE; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; + +import me.prettyprint.hector.api.ddl.ComparatorType; + +/** + * Serializer implementation for BigDecimal + * + * @author peter lin + */ +public final class BigDecimalSerializer extends AbstractSerializer { + + private static final BigDecimalSerializer INSTANCE = new BigDecimalSerializer(); + + public static BigDecimalSerializer get() { + return INSTANCE; + } + + @Override + public byte[] toBytes(BigDecimal obj) { + return this.toByteArray(obj); + } + + @Override + public BigDecimal fromByteBuffer(ByteBuffer byteBuffer) { + if (byteBuffer == null) { + return null; + } + int scale = byteBuffer.getInt(); + byte[] bibytes = new byte[byteBuffer.remaining()]; + byteBuffer.get(bibytes, 0, byteBuffer.remaining()); + BigInteger bi = new BigInteger(bibytes); + // now we create an instance of BigDecimal with BigInteger and scale + BigDecimal value = new BigDecimal(bi, scale); + return value; + } + + @Override + public ByteBuffer toByteBuffer(BigDecimal obj) { + if (obj == null) { + return null; + } + return ByteBuffer.wrap(toByteArray(obj)); + } + + public byte[] toByteArray(BigDecimal bigDecimal) { + byte[] bigIntBytes = bigDecimal.unscaledValue().toByteArray(); + byte[] scaleBytes = IntegerSerializer.get().toBytes(bigDecimal.scale()); + byte[] bytes = new byte[scaleBytes.length + bigIntBytes.length]; + System.arraycopy(scaleBytes, 0, bytes, 0, scaleBytes.length); + System.arraycopy(bigIntBytes, 0, bytes, scaleBytes.length, bigIntBytes.length); + return bytes; + } + + @Override + public ComparatorType getComparatorType() { + return DECIMALTYPE; + } + +}