presto-parquet/src/main/java/io/prestosql/parquet/reader/ParquetReader.java/ParquetReader/ParquetReader
class ParquetReader:    public ParquetReader(
            Optional<String> fileCreatedBy,
            MessageColumnIO messageColumnIO,
            List<BlockMetaData> blocks,
            ParquetDataSource dataSource,
            AggregatedMemoryContext systemMemoryContext,
            ParquetReaderOptions options)
            throws IOException
    {
        this.fileCreatedBy = requireNonNull(fileCreatedBy, "fileCreatedBy is null");
        this.blocks = blocks;
        this.dataSource = requireNonNull(dataSource, "dataSource is null");
        this.systemMemoryContext = requireNonNull(systemMemoryContext, "systemMemoryContext is null");
        this.currentRowGroupMemoryContext = systemMemoryContext.newAggregatedMemoryContext();
        columns = messageColumnIO.getLeaves();
        this.options = requireNonNull(options, "options is null");
        columnReaders = new PrimitiveColumnReader[columns.size()];
        maxBytesPerCell = new long[columns.size()];

        Map<ChunkKey, DiskRange> ranges = new HashMap<>();
        for (int rowGroup = 0; rowGroup < blocks.size(); rowGroup++) {
            BlockMetaData metadata = blocks.get(rowGroup);
            for (PrimitiveColumnIO column : columns) {
                int columnId = column.getId();
                ColumnChunkMetaData chunkMetadata = getColumnChunkMetaData(metadata, column.getColumnDescriptor());
                DiskRange range = new DiskRange(chunkMetadata.getStartingPos(), toIntExact(chunkMetadata.getTotalSize()));
                ranges.put(new ChunkKey(columnId, rowGroup), range);
            }
        }

        chunkReaders = dataSource.planRead(ranges);
    }