You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by pa...@apache.org on 2015/03/04 02:43:32 UTC
drill git commit: DRILL-2118: inform user with a user friendly error
message if kvgen fails due to heterogenous types
Repository: drill
Updated Branches:
refs/heads/master 767a97648 -> a66b6cc0d
DRILL-2118: inform user with a user friendly error message if kvgen fails due to heterogenous types
Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/a66b6cc0
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/a66b6cc0
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/a66b6cc0
Branch: refs/heads/master
Commit: a66b6cc0d7d3de0fbe8aa0715233235aee18f71b
Parents: 767a976
Author: Hanifi Gunes <hg...@maprtech.com>
Authored: Tue Mar 3 16:37:24 2015 -0800
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Tue Mar 3 17:43:01 2015 -0800
----------------------------------------------------------------------
.../src/main/codegen/templates/BaseReader.java | 5 +-
.../main/codegen/templates/ComplexReaders.java | 6 +-
.../drill/exec/vector/complex/MapUtility.java | 369 ++++++++++---------
.../vector/complex/impl/AbstractBaseReader.java | 7 +
4 files changed, 203 insertions(+), 184 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/drill/blob/a66b6cc0/exec/java-exec/src/main/codegen/templates/BaseReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/BaseReader.java b/exec/java-exec/src/main/codegen/templates/BaseReader.java
index 327e618..9281d3c 100644
--- a/exec/java-exec/src/main/codegen/templates/BaseReader.java
+++ b/exec/java-exec/src/main/codegen/templates/BaseReader.java
@@ -30,8 +30,9 @@ package org.apache.drill.exec.vector.complex.reader;
@SuppressWarnings("unused")
public interface BaseReader extends Positionable{
- public MajorType getType();
-
+ MajorType getType();
+ MaterializedField getField();
+
public interface MapReader extends BaseReader, Iterable<String>{
FieldReader reader(String name);
}
http://git-wip-us.apache.org/repos/asf/drill/blob/a66b6cc0/exec/java-exec/src/main/codegen/templates/ComplexReaders.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/ComplexReaders.java b/exec/java-exec/src/main/codegen/templates/ComplexReaders.java
index 9d05934..cd69d0d 100644
--- a/exec/java-exec/src/main/codegen/templates/ComplexReaders.java
+++ b/exec/java-exec/src/main/codegen/templates/ComplexReaders.java
@@ -56,10 +56,14 @@ public class ${nullMode}${name}ReaderImpl extends AbstractFieldReader {
super();
this.vector = vector;
}
-
+
public MajorType getType(){
return vector.getField().getType();
}
+
+ public MaterializedField getField(){
+ return vector.getField();
+ }
public boolean isSet(){
<#if nullMode == "Nullable">
http://git-wip-us.apache.org/repos/asf/drill/blob/a66b6cc0/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapUtility.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapUtility.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapUtility.java
index 93f0de9..7a5863a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapUtility.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapUtility.java
@@ -23,199 +23,206 @@ import org.apache.drill.common.types.TypeProtos.MinorType;
import org.apache.drill.common.types.TypeProtos.MajorType;
import org.apache.drill.exec.expr.fn.impl.MappifyUtility;
+import org.apache.drill.exec.record.MaterializedField;
import org.apache.drill.exec.vector.complex.reader.FieldReader;
import org.apache.drill.exec.vector.complex.writer.BaseWriter;
public class MapUtility {
+ private final static String TYPE_MISMATCH_ERROR = "Mappify/kvgen does not support heterogeneous value types. All values in the input map must be of the same type. The field [%s] has a differing type [%s].";
+
/*
* Function to read a value from the field reader, detect the type, construct the appropriate value holder
* and use the value holder to write to the Map.
*/
// TODO : This should be templatized and generated using freemarker
public static void writeToMapFromReader(FieldReader fieldReader, BaseWriter.MapWriter mapWriter) {
+ try {
+ MajorType valueMajorType = fieldReader.getType();
+ MinorType valueMinorType = valueMajorType.getMinorType();
+ boolean repeated = false;
- MajorType valueMajorType = fieldReader.getType();
- MinorType valueMinorType = valueMajorType.getMinorType();
- boolean repeated = false;
-
- if (valueMajorType.getMode() == TypeProtos.DataMode.REPEATED) {
- repeated = true;
- }
+ if (valueMajorType.getMode() == TypeProtos.DataMode.REPEATED) {
+ repeated = true;
+ }
- switch (valueMinorType) {
- case TINYINT:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).tinyInt());
- } else {
- fieldReader.copyAsValue(mapWriter.tinyInt(MappifyUtility.fieldValue));
- }
- break;
- case SMALLINT:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).smallInt());
- } else {
- fieldReader.copyAsValue(mapWriter.smallInt(MappifyUtility.fieldValue));
- }
- break;
- case BIGINT:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).bigInt());
- } else {
- fieldReader.copyAsValue(mapWriter.bigInt(MappifyUtility.fieldValue));
- }
- break;
- case INT:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).integer());
- } else {
- fieldReader.copyAsValue(mapWriter.integer(MappifyUtility.fieldValue));
- }
- break;
- case UINT1:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt1());
- } else {
- fieldReader.copyAsValue(mapWriter.uInt1(MappifyUtility.fieldValue));
- }
- break;
- case UINT2:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt2());
- } else {
- fieldReader.copyAsValue(mapWriter.uInt2(MappifyUtility.fieldValue));
- }
- break;
- case UINT4:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt4());
- } else {
- fieldReader.copyAsValue(mapWriter.uInt4(MappifyUtility.fieldValue));
- }
- break;
- case UINT8:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt8());
- } else {
- fieldReader.copyAsValue(mapWriter.uInt8(MappifyUtility.fieldValue));
- }
- break;
- case DECIMAL9:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal9());
- } else {
- fieldReader.copyAsValue(mapWriter.decimal9(MappifyUtility.fieldValue));
- }
- break;
- case DECIMAL18:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal18());
- } else {
- fieldReader.copyAsValue(mapWriter.decimal18(MappifyUtility.fieldValue));
- }
- break;
- case DECIMAL28SPARSE:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal28Sparse());
- } else {
- fieldReader.copyAsValue(mapWriter.decimal28Sparse(MappifyUtility.fieldValue));
- }
- break;
- case DECIMAL38SPARSE:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal38Sparse());
- } else {
- fieldReader.copyAsValue(mapWriter.decimal38Sparse(MappifyUtility.fieldValue));
- }
- break;
- case DATE:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).date());
- } else {
- fieldReader.copyAsValue(mapWriter.date(MappifyUtility.fieldValue));
- }
- break;
- case TIME:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).time());
- } else {
- fieldReader.copyAsValue(mapWriter.time(MappifyUtility.fieldValue));
- }
- break;
- case TIMESTAMP:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).timeStamp());
- } else {
- fieldReader.copyAsValue(mapWriter.timeStamp(MappifyUtility.fieldValue));
- }
- break;
- case INTERVAL:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).interval());
- } else {
- fieldReader.copyAsValue(mapWriter.interval(MappifyUtility.fieldValue));
- }
- break;
- case INTERVALDAY:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).intervalDay());
- } else {
- fieldReader.copyAsValue(mapWriter.intervalDay(MappifyUtility.fieldValue));
- }
- break;
- case INTERVALYEAR:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).intervalYear());
- } else {
- fieldReader.copyAsValue(mapWriter.intervalYear(MappifyUtility.fieldValue));
- }
- break;
- case FLOAT4:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).float4());
- } else {
- fieldReader.copyAsValue(mapWriter.float4(MappifyUtility.fieldValue));
- }
- break;
- case FLOAT8:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).float8());
- } else {
- fieldReader.copyAsValue(mapWriter.float8(MappifyUtility.fieldValue));
- }
- break;
- case BIT:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).bit());
- } else {
- fieldReader.copyAsValue(mapWriter.bit(MappifyUtility.fieldValue));
- }
- break;
- case VARCHAR:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).varChar());
- } else {
- fieldReader.copyAsValue(mapWriter.varChar(MappifyUtility.fieldValue));
- }
- break;
- case VARBINARY:
- if (repeated) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).varBinary());
- } else {
- fieldReader.copyAsValue(mapWriter.varBinary(MappifyUtility.fieldValue));
- }
- break;
- case MAP:
- if (valueMajorType.getMode() == TypeProtos.DataMode.REPEATED) {
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).map());
- } else {
- fieldReader.copyAsValue(mapWriter.map(MappifyUtility.fieldValue));
- }
- break;
- case LIST:
- fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).list());
- break;
- default:
- throw new DrillRuntimeException(String.format("kvgen does not support input of type: %s", valueMinorType));
+ switch (valueMinorType) {
+ case TINYINT:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).tinyInt());
+ } else {
+ fieldReader.copyAsValue(mapWriter.tinyInt(MappifyUtility.fieldValue));
+ }
+ break;
+ case SMALLINT:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).smallInt());
+ } else {
+ fieldReader.copyAsValue(mapWriter.smallInt(MappifyUtility.fieldValue));
+ }
+ break;
+ case BIGINT:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).bigInt());
+ } else {
+ fieldReader.copyAsValue(mapWriter.bigInt(MappifyUtility.fieldValue));
+ }
+ break;
+ case INT:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).integer());
+ } else {
+ fieldReader.copyAsValue(mapWriter.integer(MappifyUtility.fieldValue));
+ }
+ break;
+ case UINT1:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt1());
+ } else {
+ fieldReader.copyAsValue(mapWriter.uInt1(MappifyUtility.fieldValue));
+ }
+ break;
+ case UINT2:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt2());
+ } else {
+ fieldReader.copyAsValue(mapWriter.uInt2(MappifyUtility.fieldValue));
+ }
+ break;
+ case UINT4:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt4());
+ } else {
+ fieldReader.copyAsValue(mapWriter.uInt4(MappifyUtility.fieldValue));
+ }
+ break;
+ case UINT8:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).uInt8());
+ } else {
+ fieldReader.copyAsValue(mapWriter.uInt8(MappifyUtility.fieldValue));
+ }
+ break;
+ case DECIMAL9:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal9());
+ } else {
+ fieldReader.copyAsValue(mapWriter.decimal9(MappifyUtility.fieldValue));
+ }
+ break;
+ case DECIMAL18:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal18());
+ } else {
+ fieldReader.copyAsValue(mapWriter.decimal18(MappifyUtility.fieldValue));
+ }
+ break;
+ case DECIMAL28SPARSE:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal28Sparse());
+ } else {
+ fieldReader.copyAsValue(mapWriter.decimal28Sparse(MappifyUtility.fieldValue));
+ }
+ break;
+ case DECIMAL38SPARSE:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).decimal38Sparse());
+ } else {
+ fieldReader.copyAsValue(mapWriter.decimal38Sparse(MappifyUtility.fieldValue));
+ }
+ break;
+ case DATE:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).date());
+ } else {
+ fieldReader.copyAsValue(mapWriter.date(MappifyUtility.fieldValue));
+ }
+ break;
+ case TIME:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).time());
+ } else {
+ fieldReader.copyAsValue(mapWriter.time(MappifyUtility.fieldValue));
+ }
+ break;
+ case TIMESTAMP:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).timeStamp());
+ } else {
+ fieldReader.copyAsValue(mapWriter.timeStamp(MappifyUtility.fieldValue));
+ }
+ break;
+ case INTERVAL:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).interval());
+ } else {
+ fieldReader.copyAsValue(mapWriter.interval(MappifyUtility.fieldValue));
+ }
+ break;
+ case INTERVALDAY:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).intervalDay());
+ } else {
+ fieldReader.copyAsValue(mapWriter.intervalDay(MappifyUtility.fieldValue));
+ }
+ break;
+ case INTERVALYEAR:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).intervalYear());
+ } else {
+ fieldReader.copyAsValue(mapWriter.intervalYear(MappifyUtility.fieldValue));
+ }
+ break;
+ case FLOAT4:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).float4());
+ } else {
+ fieldReader.copyAsValue(mapWriter.float4(MappifyUtility.fieldValue));
+ }
+ break;
+ case FLOAT8:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).float8());
+ } else {
+ fieldReader.copyAsValue(mapWriter.float8(MappifyUtility.fieldValue));
+ }
+ break;
+ case BIT:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).bit());
+ } else {
+ fieldReader.copyAsValue(mapWriter.bit(MappifyUtility.fieldValue));
+ }
+ break;
+ case VARCHAR:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).varChar());
+ } else {
+ fieldReader.copyAsValue(mapWriter.varChar(MappifyUtility.fieldValue));
+ }
+ break;
+ case VARBINARY:
+ if (repeated) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).varBinary());
+ } else {
+ fieldReader.copyAsValue(mapWriter.varBinary(MappifyUtility.fieldValue));
+ }
+ break;
+ case MAP:
+ if (valueMajorType.getMode() == TypeProtos.DataMode.REPEATED) {
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).map());
+ } else {
+ fieldReader.copyAsValue(mapWriter.map(MappifyUtility.fieldValue));
+ }
+ break;
+ case LIST:
+ fieldReader.copyAsValue(mapWriter.list(MappifyUtility.fieldValue).list());
+ break;
+ default:
+ throw new DrillRuntimeException(String.format("kvgen does not support input of type: %s", valueMinorType));
+ }
+ } catch (ClassCastException e) {
+ final MaterializedField field = fieldReader.getField();
+ throw new DrillRuntimeException(String.format(TYPE_MISMATCH_ERROR, field.getPath(), field.getType()));
}
}
}
http://git-wip-us.apache.org/repos/asf/drill/blob/a66b6cc0/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/AbstractBaseReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/AbstractBaseReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/AbstractBaseReader.java
index 468ea0f..04235fa 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/AbstractBaseReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/AbstractBaseReader.java
@@ -20,6 +20,8 @@ package org.apache.drill.exec.vector.complex.impl;
import java.util.Iterator;
import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.Types;
+import org.apache.drill.exec.record.MaterializedField;
import org.apache.drill.exec.vector.complex.reader.FieldReader;
@@ -51,6 +53,11 @@ abstract class AbstractBaseReader implements FieldReader{
}
@Override
+ public MaterializedField getField() {
+ return MaterializedField.create("unknown", Types.LATE_BIND_TYPE);
+ }
+
+ @Override
public boolean next() {
throw new IllegalStateException("The current reader doesn't support getting next information.");
}