Repository: carbondata
Updated Branches:
  refs/heads/master 1be0778a8 -> 8eef8fe30


[CARBONDATA-1392] Fixed bug for fetching the error value of decimal type in 
presto

This closes #1236


Project: http://git-wip-us.apache.org/repos/asf/carbondata/repo
Commit: http://git-wip-us.apache.org/repos/asf/carbondata/commit/8eef8fe3
Tree: http://git-wip-us.apache.org/repos/asf/carbondata/tree/8eef8fe3
Diff: http://git-wip-us.apache.org/repos/asf/carbondata/diff/8eef8fe3

Branch: refs/heads/master
Commit: 8eef8fe30231165d23fede64059aebe11b5ccd03
Parents: 1be0778
Author: steven-qin <[email protected]>
Authored: Sat Aug 19 15:23:28 2017 +0800
Committer: chenliang613 <[email protected]>
Committed: Sat Aug 19 15:29:55 2017 +0800

----------------------------------------------------------------------
 .../carbondata/presto/CarbondataErrorCode.java  | 38 +++++++++++++++
 .../presto/CarbondataRecordCursor.java          | 34 ++++++++------
 .../carbondata/presto/CarbondataUtil.java       | 49 ++++++++++++++++++++
 3 files changed, 107 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/carbondata/blob/8eef8fe3/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataErrorCode.java
----------------------------------------------------------------------
diff --git 
a/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataErrorCode.java
 
b/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataErrorCode.java
new file mode 100644
index 0000000..45971d0
--- /dev/null
+++ 
b/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataErrorCode.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.carbondata.presto;
+
+import com.facebook.presto.spi.ErrorCode;
+import com.facebook.presto.spi.ErrorCodeSupplier;
+import com.facebook.presto.spi.ErrorType;
+
+import static com.facebook.presto.spi.ErrorType.EXTERNAL;
+import static com.facebook.presto.spi.ErrorType.INTERNAL_ERROR;
+
+public enum CarbondataErrorCode implements ErrorCodeSupplier {
+  CARBON_NOT_SUPPORT_TYPE(1, INTERNAL_ERROR), CARBON_INVALID_TYPE_VALUE(2, 
EXTERNAL);
+
+  private final ErrorCode errorCode;
+
+  CarbondataErrorCode(int code, ErrorType type) {
+    errorCode = new ErrorCode(code + 0x0100_0000, name(), type);
+  }
+
+  @Override public ErrorCode toErrorCode() {
+    return errorCode;
+  }
+}

http://git-wip-us.apache.org/repos/asf/carbondata/blob/8eef8fe3/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataRecordCursor.java
----------------------------------------------------------------------
diff --git 
a/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataRecordCursor.java
 
b/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataRecordCursor.java
index d6b1422..001392e 100755
--- 
a/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataRecordCursor.java
+++ 
b/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataRecordCursor.java
@@ -44,6 +44,7 @@ import static 
com.facebook.presto.spi.type.VarcharType.VARCHAR;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static io.airlift.slice.Slices.utf8Slice;
+import static 
org.apache.carbondata.presto.CarbondataUtil.shortDecimalPartitionKey;
 
 public class CarbondataRecordCursor implements RecordCursor {
 
@@ -54,7 +55,7 @@ public class CarbondataRecordCursor implements RecordCursor {
   private CarbondataSplit split;
   private CarbonIterator<Object[]> rowCursor;
   private CarbonDictionaryDecodeReaderSupport readSupport;
-  private Tuple3<DataType,Dictionary,Int>[] dictionary;
+  private Tuple3<DataType, Dictionary, Int>[] dictionary;
 
   private long totalBytes;
   private long nanoStart;
@@ -62,7 +63,7 @@ public class CarbondataRecordCursor implements RecordCursor {
 
   public CarbondataRecordCursor(CarbonDictionaryDecodeReaderSupport 
readSupport,
       CarbonIterator<Object[]> carbonIterator, List<CarbondataColumnHandle> 
columnHandles,
-      CarbondataSplit split, Tuple3<DataType,Dictionary,Int>[] dictionaries ) {
+      CarbondataSplit split, Tuple3<DataType, Dictionary, Int>[] dictionaries) 
{
     this.rowCursor = carbonIterator;
     this.columnHandles = columnHandles;
     this.readSupport = readSupport;
@@ -98,8 +99,8 @@ public class CarbondataRecordCursor implements RecordCursor {
     }
 
     if (rowCursor.hasNext()) {
-       fields = readSupport.readRow(rowCursor.next(),dictionary);
-       totalBytes += fields.length;
+      fields = readSupport.readRow(rowCursor.next(), dictionary);
+      totalBytes += fields.length;
       return true;
     }
     return false;
@@ -107,22 +108,26 @@ public class CarbondataRecordCursor implements 
RecordCursor {
 
   @Override public boolean getBoolean(int field) {
     checkFieldType(field, BOOLEAN);
-    return (Boolean)getFieldValue(field);
+    return (Boolean) getFieldValue(field);
   }
 
   @Override public long getLong(int field) {
     Object obj = getFieldValue(field);
     Long timeStr = 0L;
-    if( obj instanceof  Integer ){
-      timeStr = ((Integer)obj).longValue();
-    } else if( obj instanceof Long ) {
-      timeStr = (Long)obj;
+    if (obj instanceof Integer) {
+      timeStr = ((Integer) obj).longValue();
+    } else if (obj instanceof Long) {
+      timeStr = (Long) obj;
     } else {
       timeStr = Math.round(Double.parseDouble(obj.toString()));
     }
     Type actual = getType(field);
-    if(actual instanceof TimestampType){
-      return new Timestamp(timeStr).getTime()/1000;
+
+    if (actual instanceof TimestampType) {
+      return new Timestamp(timeStr).getTime() / 1000;
+    } else if (isShortDecimal(actual)) {
+      return shortDecimalPartitionKey(obj.toString(), (DecimalType) actual,
+          columnHandles.get(field).getColumnName());
     }
     //suppose the
     return timeStr;
@@ -130,7 +135,7 @@ public class CarbondataRecordCursor implements RecordCursor 
{
 
   @Override public double getDouble(int field) {
     checkFieldType(field, DOUBLE);
-    return (Double)getFieldValue(field);
+    return (Double) getFieldValue(field);
   }
 
   @Override public Slice getSlice(int field) {
@@ -138,8 +143,9 @@ public class CarbondataRecordCursor implements RecordCursor 
{
     if (decimalType instanceof DecimalType) {
       DecimalType actual = (DecimalType) decimalType;
       CarbondataColumnHandle carbondataColumnHandle = columnHandles.get(field);
-      if(carbondataColumnHandle.getPrecision() > 0 ) {
-        checkFieldType(field, 
DecimalType.createDecimalType(carbondataColumnHandle.getPrecision(), 
carbondataColumnHandle.getScale()));
+      if (carbondataColumnHandle.getPrecision() > 0) {
+        checkFieldType(field, 
DecimalType.createDecimalType(carbondataColumnHandle.getPrecision(),
+            carbondataColumnHandle.getScale()));
       } else {
         checkFieldType(field, DecimalType.createDecimalType());
       }

http://git-wip-us.apache.org/repos/asf/carbondata/blob/8eef8fe3/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataUtil.java
----------------------------------------------------------------------
diff --git 
a/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataUtil.java
 
b/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataUtil.java
new file mode 100644
index 0000000..52c8920
--- /dev/null
+++ 
b/integration/presto/src/main/java/org/apache/carbondata/presto/CarbondataUtil.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.carbondata.presto;
+
+import java.math.BigDecimal;
+
+import com.facebook.presto.spi.PrestoException;
+import com.facebook.presto.spi.type.DecimalType;
+
+import static java.lang.String.format;
+import static java.math.BigDecimal.ROUND_UNNECESSARY;
+import static 
org.apache.carbondata.presto.CarbondataErrorCode.CARBON_INVALID_TYPE_VALUE;
+
+public class CarbondataUtil {
+
+  public static long shortDecimalPartitionKey(String value, DecimalType type, 
String name) {
+    return decimalPartitionKey(value, type, name).unscaledValue().longValue();
+  }
+
+  private static BigDecimal decimalPartitionKey(String value, DecimalType 
type, String name) {
+    try {
+      BigDecimal decimal = new BigDecimal(value);
+      decimal = decimal.setScale(type.getScale(), ROUND_UNNECESSARY);
+      if (decimal.precision() > type.getPrecision()) {
+        throw new PrestoException(CARBON_INVALID_TYPE_VALUE,
+            format("Invalid type value '%s' for %s type key: %s", value, 
type.toString(), name));
+      }
+      return decimal;
+    } catch (NumberFormatException e) {
+      throw new PrestoException(CARBON_INVALID_TYPE_VALUE,
+          format("Invalid type value '%s' for %s type key: %s", value, 
type.toString(), name));
+    }
+  }
+}

Reply via email to