in pinot-plugins/pinot-input-format/pinot-orc/src/main/java/org/apache/pinot/plugin/inputformat/orc/ORCRecordReader.java [288:381]
private static Object extractSingleValue(String field, ColumnVector columnVector, int rowId,
TypeDescription.Category category) {
if (columnVector.isRepeating) {
rowId = 0;
}
switch (category) {
case BOOLEAN:
// Extract to String
LongColumnVector longColumnVector = (LongColumnVector) columnVector;
if (longColumnVector.noNulls || !longColumnVector.isNull[rowId]) {
return Boolean.toString(longColumnVector.vector[rowId] == 1);
} else {
return null;
}
case BYTE:
case SHORT:
case INT:
// Extract to Integer
longColumnVector = (LongColumnVector) columnVector;
if (longColumnVector.noNulls || !longColumnVector.isNull[rowId]) {
return (int) longColumnVector.vector[rowId];
} else {
return null;
}
case LONG:
case DATE:
// Extract to Long
longColumnVector = (LongColumnVector) columnVector;
if (longColumnVector.noNulls || !longColumnVector.isNull[rowId]) {
return longColumnVector.vector[rowId];
} else {
return null;
}
case TIMESTAMP:
// Extract to Long
TimestampColumnVector timestampColumnVector = (TimestampColumnVector) columnVector;
if (timestampColumnVector.noNulls || !timestampColumnVector.isNull[rowId]) {
return timestampColumnVector.time[rowId];
} else {
return null;
}
case FLOAT:
// Extract to Float
DoubleColumnVector doubleColumnVector = (DoubleColumnVector) columnVector;
if (doubleColumnVector.noNulls || !doubleColumnVector.isNull[rowId]) {
return (float) doubleColumnVector.vector[rowId];
} else {
return null;
}
case DOUBLE:
// Extract to Double
doubleColumnVector = (DoubleColumnVector) columnVector;
if (doubleColumnVector.noNulls || !doubleColumnVector.isNull[rowId]) {
return doubleColumnVector.vector[rowId];
} else {
return null;
}
case STRING:
case VARCHAR:
case CHAR:
// Extract to String
BytesColumnVector bytesColumnVector = (BytesColumnVector) columnVector;
if (bytesColumnVector.noNulls || !bytesColumnVector.isNull[rowId]) {
int length = bytesColumnVector.length[rowId];
return new String(bytesColumnVector.vector[rowId], bytesColumnVector.start[rowId], length, UTF_8);
} else {
return null;
}
case BINARY:
// Extract to byte[]
bytesColumnVector = (BytesColumnVector) columnVector;
if (bytesColumnVector.noNulls || !bytesColumnVector.isNull[rowId]) {
int length = bytesColumnVector.length[rowId];
byte[] bytes = new byte[length];
System.arraycopy(bytesColumnVector.vector[rowId], bytesColumnVector.start[rowId], bytes, 0, length);
return bytes;
} else {
return null;
}
case DECIMAL:
// Extract to string
DecimalColumnVector decimalColumnVector = (DecimalColumnVector) columnVector;
if (decimalColumnVector.noNulls || !decimalColumnVector.isNull[rowId]) {
StringBuilder stringBuilder = new StringBuilder();
decimalColumnVector.stringifyValue(stringBuilder, rowId);
return stringBuilder.toString();
} else {
return null;
}
default:
// Unsupported types
throw new IllegalStateException("Unsupported field type: " + category + " for field: " + field);
}
}