Skip to content

Commit a2a9ffe

Browse files
committed
Generalize OrcReader's ProjectLayout
Refactor needed for Iceberg projection pushdown. Iceberg uses field ids to specify columns rather than column names.
1 parent 568a291 commit a2a9ffe

File tree

8 files changed

+29
-18
lines changed

8 files changed

+29
-18
lines changed

lib/trino-orc/src/main/java/io/trino/orc/OrcReader.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public OrcRecordReader createRecordReader(
261261
return createRecordReader(
262262
readColumns,
263263
readTypes,
264-
Collections.nCopies(readColumns.size(), ProjectedLayout.fullyProjectedLayout()),
264+
Collections.nCopies(readColumns.size(), fullyProjectedLayout()),
265265
predicate,
266266
0,
267267
orcDataSource.getEstimatedSize(),
@@ -432,29 +432,40 @@ static void validateFile(
432432
}
433433
}
434434

435-
public static class ProjectedLayout
435+
public interface ProjectedLayout
436+
{
437+
ProjectedLayout getFieldLayout(OrcColumn orcColumn);
438+
}
439+
440+
/**
441+
* Constructs a ProjectedLayout where all subfields must be read
442+
*/
443+
public static ProjectedLayout fullyProjectedLayout()
444+
{
445+
return orcColumn -> fullyProjectedLayout();
446+
}
447+
448+
public static class NameBasedProjectedLayout
449+
implements ProjectedLayout
436450
{
437451
private final Optional<Map<String, ProjectedLayout>> fieldLayouts;
438452

439-
private ProjectedLayout(Optional<Map<String, ProjectedLayout>> fieldLayouts)
453+
private NameBasedProjectedLayout(Optional<Map<String, ProjectedLayout>> fieldLayouts)
440454
{
441455
this.fieldLayouts = requireNonNull(fieldLayouts, "fieldLayouts is null");
442456
}
443457

444-
public ProjectedLayout getFieldLayout(String name)
458+
@Override
459+
public ProjectedLayout getFieldLayout(OrcColumn orcColumn)
445460
{
461+
String name = orcColumn.getColumnName().toLowerCase(ENGLISH);
446462
if (fieldLayouts.isPresent()) {
447463
return fieldLayouts.get().get(name);
448464
}
449465

450466
return fullyProjectedLayout();
451467
}
452468

453-
public static ProjectedLayout fullyProjectedLayout()
454-
{
455-
return new ProjectedLayout(Optional.empty());
456-
}
457-
458469
public static ProjectedLayout createProjectedLayout(OrcColumn root, List<List<String>> dereferences)
459470
{
460471
if (dereferences.stream().map(List::size).anyMatch(Predicate.isEqual(0))) {
@@ -474,7 +485,7 @@ public static ProjectedLayout createProjectedLayout(OrcColumn root, List<List<St
474485
}
475486
}
476487

477-
return new ProjectedLayout(Optional.of(fieldLayouts.build()));
488+
return new NameBasedProjectedLayout(Optional.of(fieldLayouts.build()));
478489
}
479490
}
480491

lib/trino-orc/src/main/java/io/trino/orc/reader/ListColumnReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import java.util.Optional;
4040

4141
import static com.google.common.base.MoreObjects.toStringHelper;
42-
import static io.trino.orc.OrcReader.ProjectedLayout.fullyProjectedLayout;
42+
import static io.trino.orc.OrcReader.fullyProjectedLayout;
4343
import static io.trino.orc.metadata.Stream.StreamKind.LENGTH;
4444
import static io.trino.orc.metadata.Stream.StreamKind.PRESENT;
4545
import static io.trino.orc.reader.ColumnReaders.createColumnReader;

lib/trino-orc/src/main/java/io/trino/orc/reader/MapColumnReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import java.util.Optional;
4141

4242
import static com.google.common.base.MoreObjects.toStringHelper;
43-
import static io.trino.orc.OrcReader.ProjectedLayout.fullyProjectedLayout;
43+
import static io.trino.orc.OrcReader.fullyProjectedLayout;
4444
import static io.trino.orc.metadata.Stream.StreamKind.LENGTH;
4545
import static io.trino.orc.metadata.Stream.StreamKind.PRESENT;
4646
import static io.trino.orc.reader.ColumnReaders.createColumnReader;

lib/trino-orc/src/main/java/io/trino/orc/reader/StructColumnReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public class StructColumnReader
104104
OrcColumn fieldStream = fieldMapper.get(fieldName);
105105

106106
if (fieldStream != null) {
107-
OrcReader.ProjectedLayout fieldLayout = readLayout.getFieldLayout(fieldStream.getColumnName().toLowerCase(ENGLISH));
107+
OrcReader.ProjectedLayout fieldLayout = readLayout.getFieldLayout(fieldStream);
108108
if (fieldLayout != null) {
109109
structFields.put(
110110
fieldName,

lib/trino-orc/src/main/java/io/trino/orc/reader/UnionColumnReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
import static com.google.common.base.MoreObjects.toStringHelper;
5050
import static com.google.common.base.Preconditions.checkState;
5151
import static com.google.common.base.Verify.verify;
52-
import static io.trino.orc.OrcReader.ProjectedLayout.fullyProjectedLayout;
52+
import static io.trino.orc.OrcReader.fullyProjectedLayout;
5353
import static io.trino.orc.metadata.Stream.StreamKind.DATA;
5454
import static io.trino.orc.metadata.Stream.StreamKind.PRESENT;
5555
import static io.trino.orc.reader.ColumnReaders.createColumnReader;

plugin/trino-hive/src/main/java/io/trino/plugin/hive/orc/OrcDeleteDeltaPageSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848
import static com.google.common.collect.Maps.uniqueIndex;
4949
import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext;
5050
import static io.trino.orc.OrcReader.MAX_BATCH_SIZE;
51-
import static io.trino.orc.OrcReader.ProjectedLayout.fullyProjectedLayout;
5251
import static io.trino.orc.OrcReader.createOrcReader;
52+
import static io.trino.orc.OrcReader.fullyProjectedLayout;
5353
import static io.trino.plugin.hive.HiveErrorCode.HIVE_CANNOT_OPEN_SPLIT;
5454
import static io.trino.plugin.hive.HiveErrorCode.HIVE_MISSING_DATA;
5555
import static io.trino.plugin.hive.acid.AcidSchema.ACID_COLUMN_BUCKET;

plugin/trino-hive/src/main/java/io/trino/plugin/hive/orc/OrcPageSourceFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@
7777
import static com.google.common.collect.Maps.uniqueIndex;
7878
import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext;
7979
import static io.trino.orc.OrcReader.INITIAL_BATCH_SIZE;
80-
import static io.trino.orc.OrcReader.ProjectedLayout.createProjectedLayout;
81-
import static io.trino.orc.OrcReader.ProjectedLayout.fullyProjectedLayout;
80+
import static io.trino.orc.OrcReader.NameBasedProjectedLayout.createProjectedLayout;
81+
import static io.trino.orc.OrcReader.fullyProjectedLayout;
8282
import static io.trino.orc.metadata.OrcMetadataWriter.PRESTO_WRITER_ID;
8383
import static io.trino.orc.metadata.OrcMetadataWriter.TRINO_WRITER_ID;
8484
import static io.trino.orc.metadata.OrcType.OrcTypeKind.INT;

plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergPageSourceProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
import static com.google.common.collect.Maps.uniqueIndex;
9494
import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext;
9595
import static io.trino.orc.OrcReader.INITIAL_BATCH_SIZE;
96-
import static io.trino.orc.OrcReader.ProjectedLayout.fullyProjectedLayout;
96+
import static io.trino.orc.OrcReader.fullyProjectedLayout;
9797
import static io.trino.parquet.ParquetTypeUtils.getColumnIO;
9898
import static io.trino.parquet.ParquetTypeUtils.getDescriptors;
9999
import static io.trino.parquet.ParquetTypeUtils.getParquetTypeByName;

0 commit comments

Comments
 (0)