in java/core/src/java/org/apache/orc/impl/TreeReaderFactory.java [2976:3043]
public static TypeReader createTreeReader(TypeDescription readerType,
Context context) throws IOException {
OrcFile.Version version = context.getFileFormat();
final SchemaEvolution evolution = context.getSchemaEvolution();
TypeDescription fileType = evolution.getFileType(readerType);
if (fileType == null || !evolution.includeReaderColumn(readerType.getId())){
return new NullTreeReader(-1, context);
}
TypeDescription.Category readerTypeCategory = readerType.getCategory();
// We skip attribute checks when comparing types since they are not used to
// create the ConvertTreeReaders
if (!fileType.equals(readerType, false) &&
(readerTypeCategory != TypeDescription.Category.STRUCT &&
readerTypeCategory != TypeDescription.Category.MAP &&
readerTypeCategory != TypeDescription.Category.LIST &&
readerTypeCategory != TypeDescription.Category.UNION)) {
// We only convert complex children.
return ConvertTreeReaderFactory.createConvertTreeReader(readerType, context);
}
switch (readerTypeCategory) {
case BOOLEAN:
return new BooleanTreeReader(fileType.getId(), context);
case BYTE:
return new ByteTreeReader(fileType.getId(), context);
case DOUBLE:
return new DoubleTreeReader(fileType.getId(), context);
case FLOAT:
return new FloatTreeReader(fileType.getId(), context);
case SHORT:
return new ShortTreeReader(fileType.getId(), context);
case INT:
return new IntTreeReader(fileType.getId(), context);
case LONG:
return new LongTreeReader(fileType.getId(), context);
case STRING:
return new StringTreeReader(fileType.getId(), context);
case CHAR:
return new CharTreeReader(fileType.getId(), readerType.getMaxLength(), context);
case VARCHAR:
return new VarcharTreeReader(fileType.getId(), readerType.getMaxLength(), context);
case BINARY:
return new BinaryTreeReader(fileType.getId(), context);
case TIMESTAMP:
return new TimestampTreeReader(fileType.getId(), context, false);
case TIMESTAMP_INSTANT:
return new TimestampTreeReader(fileType.getId(), context, true);
case DATE:
return new DateTreeReader(fileType.getId(), context);
case DECIMAL:
if (isDecimalAsLong(version, fileType.getPrecision())){
return new Decimal64TreeReader(fileType.getId(), fileType.getPrecision(),
fileType.getScale(), context);
}
return new DecimalTreeReader(fileType.getId(), fileType.getPrecision(),
fileType.getScale(), context);
case STRUCT:
return new StructTreeReader(fileType.getId(), readerType, context);
case LIST:
return new ListTreeReader(fileType.getId(), readerType, context);
case MAP:
return new MapTreeReader(fileType.getId(), readerType, context);
case UNION:
return new UnionTreeReader(fileType.getId(), readerType, context);
default:
throw new IllegalArgumentException("Unsupported type " +
readerTypeCategory);
}
}