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)); + } + } +}
