in server/pxf-hive/src/main/java/org/greenplum/pxf/plugins/hive/HiveResolver.java [560:668]
private void resolvePrimitive(Object o, PrimitiveObjectInspector oi,
List<OneField> record, boolean toFlatten) {
Object val;
switch (oi.getPrimitiveCategory()) {
case BOOLEAN: {
val = (o != null) ? ((BooleanObjectInspector) oi).get(o) : null;
addOneFieldToRecord(record, DataType.BOOLEAN, val);
break;
}
case SHORT: {
if (o == null) {
val = null;
} else if (o.getClass().getSimpleName().equals("ByteWritable")) {
val = (short) ((ByteWritable) o).get();
} else {
val = ((ShortObjectInspector) oi).get(o);
}
addOneFieldToRecord(record, DataType.SMALLINT, val);
break;
}
case INT: {
val = (o != null) ? ((IntObjectInspector) oi).get(o) : null;
addOneFieldToRecord(record, DataType.INTEGER, val);
break;
}
case LONG: {
val = (o != null) ? ((LongObjectInspector) oi).get(o) : null;
addOneFieldToRecord(record, DataType.BIGINT, val);
break;
}
case FLOAT: {
val = (o != null) ? ((FloatObjectInspector) oi).get(o) : null;
addOneFieldToRecord(record, DataType.REAL, val);
break;
}
case DOUBLE: {
val = (o != null) ? ((DoubleObjectInspector) oi).get(o) : null;
addOneFieldToRecord(record, DataType.FLOAT8, val);
break;
}
case DECIMAL: {
String sVal = null;
if (o != null) {
HiveDecimal hd = ((HiveDecimalObjectInspector) oi).getPrimitiveJavaObject(o);
if (hd != null) {
BigDecimal bd = hd.bigDecimalValue();
sVal = bd.toString();
}
}
addOneFieldToRecord(record, DataType.NUMERIC, sVal);
break;
}
case STRING: {
val = (o != null) ? ((StringObjectInspector) oi).getPrimitiveJavaObject(o)
: null;
// for more complex types, we need to properly handle special characters by escaping the val
val = toFlatten
? val != null ? String.format("\"%s\"", StringEscapeUtils.escapeJava(val.toString())) : "null"
: val;
addOneFieldToRecord(record, DataType.TEXT, val);
break;
}
case VARCHAR:
val = (o != null) ? ((HiveVarcharObjectInspector) oi).getPrimitiveJavaObject(o)
: null;
addOneFieldToRecord(record, DataType.VARCHAR,
toFlatten ? String.format("\"%s\"", val) : val);
break;
case CHAR:
val = (o != null) ? ((HiveCharObjectInspector) oi).getPrimitiveJavaObject(o)
: null;
addOneFieldToRecord(record, DataType.BPCHAR,
toFlatten ? String.format("\"%s\"", val) : val);
break;
case BINARY: {
byte[] toEncode = null;
if (o != null) {
BytesWritable bw = ((BinaryObjectInspector) oi).getPrimitiveWritableObject(o);
toEncode = new byte[bw.getLength()];
System.arraycopy(bw.getBytes(), 0, toEncode, 0,
bw.getLength());
}
addOneFieldToRecord(record, DataType.BYTEA, toEncode);
break;
}
case TIMESTAMP: {
val = (o != null) ? ((TimestampObjectInspector) oi).getPrimitiveJavaObject(o)
: null;
addOneFieldToRecord(record, DataType.TIMESTAMP, val);
break;
}
case DATE:
val = (o != null) ? ((DateObjectInspector) oi).getPrimitiveJavaObject(o)
: null;
addOneFieldToRecord(record, DataType.DATE, val);
break;
case BYTE: { /* TINYINT */
val = (o != null) ? (short) ((ByteObjectInspector) oi).get(o)
: null;
addOneFieldToRecord(record, DataType.SMALLINT, val);
break;
}
default: {
throw new UnsupportedTypeException(oi.getTypeName()
+ " conversion is not supported by "
+ getClass().getSimpleName());
}
}
}