in src/main/java/org/apache/paimon/trino/TrinoPageSourceProvider.java [367:431]
private ConnectorPageSource createOrcDataPageSource(
TrinoInputFile inputFile,
OrcReaderOptions options,
List<String> columns,
List<Type> types,
List<Domain> domains) {
try {
OrcDataSource orcDataSource = new TrinoOrcDataSource(inputFile, options);
OrcReader reader =
OrcReader.createOrcReader(orcDataSource, options)
.orElseThrow(() -> new RuntimeException("ORC file is zero length"));
List<OrcColumn> fileColumns = reader.getRootColumn().getNestedColumns();
Map<String, OrcColumn> fieldsMap = new HashMap<>();
fileColumns.forEach(column -> fieldsMap.put(column.getColumnName(), column));
TupleDomainOrcPredicate.TupleDomainOrcPredicateBuilder predicateBuilder =
TupleDomainOrcPredicate.builder();
List<OrcPageSource.ColumnAdaptation> columnAdaptations = new ArrayList<>();
List<OrcColumn> fileReadColumns = new ArrayList<>(columns.size());
List<Type> fileReadTypes = new ArrayList<>(columns.size());
for (int i = 0; i < columns.size(); i++) {
if (columns.get(i) != null) {
// column exists
columnAdaptations.add(
OrcPageSource.ColumnAdaptation.sourceColumn(fileReadColumns.size()));
OrcColumn orcColumn = fieldsMap.get(columns.get(i));
if (orcColumn == null) {
throw new RuntimeException(
"Column " + columns.get(i) + " does not exist in orc file.");
}
fileReadColumns.add(orcColumn);
fileReadTypes.add(types.get(i));
if (domains.get(i) != null) {
predicateBuilder.addColumn(orcColumn.getColumnId(), domains.get(i));
}
} else {
columnAdaptations.add(OrcPageSource.ColumnAdaptation.nullColumn(types.get(i)));
}
}
AggregatedMemoryContext memoryUsage = newSimpleAggregatedMemoryContext();
OrcRecordReader recordReader =
reader.createRecordReader(
fileReadColumns,
fileReadTypes,
predicateBuilder.build(),
DateTimeZone.UTC,
memoryUsage,
INITIAL_BATCH_SIZE,
RuntimeException::new);
return new OrcPageSource(
recordReader,
columnAdaptations,
orcDataSource,
Optional.empty(),
Optional.empty(),
memoryUsage,
new FileFormatDataSourceStats(),
reader.getCompressionKind());
} catch (Exception e) {
throw new RuntimeException(e);
}
}