You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2015/05/15 05:06:56 UTC

[44/50] [abbrv] incubator-kylin git commit: KYLIN-766

KYLIN-766


Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/69240574
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/69240574
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/69240574

Branch: refs/heads/streaming-localdict
Commit: 69240574c874a830ea406edeab881a38b3e32040
Parents: fc056fd
Author: qianhao.zhou <qi...@ebay.com>
Authored: Thu May 14 16:38:09 2015 +0800
Committer: qianhao.zhou <qi...@ebay.com>
Committed: Thu May 14 16:38:09 2015 +0800

----------------------------------------------------------------------
 .../serializer/BigDecimalSerializer.java        | 20 ++++++--
 .../serializer/BigDecimalSerializerTest.java    | 52 ++++++++++++++++++++
 2 files changed, 67 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/69240574/metadata/src/main/java/org/apache/kylin/metadata/serializer/BigDecimalSerializer.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/serializer/BigDecimalSerializer.java b/metadata/src/main/java/org/apache/kylin/metadata/serializer/BigDecimalSerializer.java
index 671d249..cf146fb 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/serializer/BigDecimalSerializer.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/serializer/BigDecimalSerializer.java
@@ -18,19 +18,23 @@
 
 package org.apache.kylin.metadata.serializer;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-
 import org.apache.kylin.common.util.Bytes;
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.metadata.model.DataType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
 
 /**
  * @author yangli9
  * 
  */
 public class BigDecimalSerializer extends DataTypeSerializer<BigDecimal> {
+
+    private static final Logger logger = LoggerFactory.getLogger(BigDecimalSerializer.class);
     
     final DataType type;
     final int maxLength;
@@ -43,9 +47,14 @@ public class BigDecimalSerializer extends DataTypeSerializer<BigDecimal> {
 
     @Override
     public void serialize(BigDecimal value, ByteBuffer out) {
+        if (value.scale() > type.getScale()) {
+            logger.warn("value's scale has exceeded the " + type.getScale() +", cut it off, to ensure encoded value do not exceed maxLength " + maxLength);
+            value = value.setScale(type.getScale(), BigDecimal.ROUND_HALF_EVEN);
+        }
         byte[] bytes = value.unscaledValue().toByteArray();
-        if (bytes.length + 2 > maxLength)
+        if (bytes.length + 2 > maxLength) {
             throw new IllegalArgumentException("'" + value + "' exceeds the expected length for type " + type);
+        }
 
         BytesUtil.writeVInt(value.scale(), out);
         BytesUtil.writeVInt(bytes.length, out);
@@ -89,4 +98,5 @@ public class BigDecimalSerializer extends DataTypeSerializer<BigDecimal> {
         else
             return new BigDecimal(Bytes.toString(value));
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/69240574/metadata/src/test/java/org/apache/kylin/metadata/serializer/BigDecimalSerializerTest.java
----------------------------------------------------------------------
diff --git a/metadata/src/test/java/org/apache/kylin/metadata/serializer/BigDecimalSerializerTest.java b/metadata/src/test/java/org/apache/kylin/metadata/serializer/BigDecimalSerializerTest.java
new file mode 100644
index 0000000..e7b7916
--- /dev/null
+++ b/metadata/src/test/java/org/apache/kylin/metadata/serializer/BigDecimalSerializerTest.java
@@ -0,0 +1,52 @@
+package org.apache.kylin.metadata.serializer;
+
+import org.apache.kylin.metadata.model.DataType;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ */
+public class BigDecimalSerializerTest {
+
+    private static BigDecimalSerializer bigDecimalSerializer;
+
+    @BeforeClass
+    public static void beforeClass() {
+        bigDecimalSerializer = new BigDecimalSerializer(DataType.getInstance("decimal"));
+    }
+
+    @Test
+    public void testNormal() {
+        BigDecimal input = new BigDecimal("1234.1234");
+        ByteBuffer buffer = ByteBuffer.allocate(256);
+        buffer.mark();
+        bigDecimalSerializer.serialize(input, buffer);
+        buffer.reset();
+        BigDecimal output = bigDecimalSerializer.deserialize(buffer);
+        assertEquals(input, output);
+    }
+
+    @Test
+    public void testScaleOutOfRange() {
+        BigDecimal input = new BigDecimal("1234.1234567890");
+        ByteBuffer buffer = ByteBuffer.allocate(256);
+        buffer.mark();
+        bigDecimalSerializer.serialize(input, buffer);
+        buffer.reset();
+        BigDecimal output = bigDecimalSerializer.deserialize(buffer);
+        assertEquals(input.setScale(bigDecimalSerializer.type.getScale(), BigDecimal.ROUND_HALF_EVEN), output);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testOutOfPrecision() {
+        BigDecimal input = new BigDecimal("66855344214907231736.4924");
+        ByteBuffer buffer = ByteBuffer.allocate(256);
+        bigDecimalSerializer.serialize(input, buffer);
+    }
+
+}