be/src/format/parquet/vparquet_page_reader.h
Line | Count | Source |
1 | | // Licensed to the Apache Software Foundation (ASF) under one |
2 | | // or more contributor license agreements. See the NOTICE file |
3 | | // distributed with this work for additional information |
4 | | // regarding copyright ownership. The ASF licenses this file |
5 | | // to you under the Apache License, Version 2.0 (the |
6 | | // "License"); you may not use this file except in compliance |
7 | | // with the License. You may obtain a copy of the License at |
8 | | // |
9 | | // http://www.apache.org/licenses/LICENSE-2.0 |
10 | | // |
11 | | // Unless required by applicable law or agreed to in writing, |
12 | | // software distributed under the License is distributed on an |
13 | | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
14 | | // KIND, either express or implied. See the License for the |
15 | | // specific language governing permissions and limitations |
16 | | // under the License. |
17 | | |
18 | | #pragma once |
19 | | |
20 | | #include <gen_cpp/parquet_types.h> |
21 | | #include <stdint.h> |
22 | | |
23 | | #include <memory> |
24 | | #include <string> |
25 | | |
26 | | #include "common/cast_set.h" |
27 | | #include "common/config.h" |
28 | | #include "common/status.h" |
29 | | #include "format/parquet/parquet_common.h" |
30 | | #include "storage/cache/page_cache.h" |
31 | | #include "util/block_compression.h" |
32 | | namespace doris { |
33 | | class BlockCompressionCodec; |
34 | | |
35 | | namespace io { |
36 | | class BufferedStreamReader; |
37 | | struct IOContext; |
38 | | } // namespace io |
39 | | |
40 | | } // namespace doris |
41 | | |
42 | | namespace doris { |
43 | | namespace io { |
44 | | class BufferedStreamReader; |
45 | | struct IOContext; |
46 | | } // namespace io |
47 | | struct Slice; |
48 | | } // namespace doris |
49 | | |
50 | | namespace doris { |
51 | | #include "common/compile_check_begin.h" |
52 | | /** |
53 | | * Use to deserialize parquet page header, and get the page data in iterator interface. |
54 | | */ |
55 | | |
56 | | // Session-level options for parquet page reading/caching. |
57 | | struct ParquetPageReadContext { |
58 | | bool enable_parquet_file_page_cache = true; |
59 | 42 | ParquetPageReadContext() = default; |
60 | | ParquetPageReadContext(bool enable_parquet_file_page_cache) |
61 | 110 | : enable_parquet_file_page_cache(enable_parquet_file_page_cache) {} |
62 | | }; |
63 | | |
64 | | inline bool should_cache_decompressed(const tparquet::PageHeader* header, |
65 | 186 | const tparquet::ColumnMetaData& metadata) { |
66 | 186 | if (header->compressed_page_size <= 0) return true; |
67 | 182 | if (metadata.codec == tparquet::CompressionCodec::UNCOMPRESSED) return true; |
68 | 175 | if (header->uncompressed_page_size == 0) return true; |
69 | | |
70 | 167 | double ratio = static_cast<double>(header->uncompressed_page_size) / |
71 | 167 | static_cast<double>(header->compressed_page_size); |
72 | 167 | return ratio <= config::parquet_page_cache_decompress_threshold; |
73 | 175 | } |
74 | | |
75 | | class ParquetPageCacheKeyBuilder { |
76 | | public: |
77 | | void init(const std::string& path, int64_t mtime); |
78 | 245 | StoragePageCache::CacheKey make_key(uint64_t end_offset, int64_t offset) const { |
79 | 245 | return StoragePageCache::CacheKey(_file_key_prefix, end_offset, offset); |
80 | 245 | } |
81 | | |
82 | | private: |
83 | | std::string _file_key_prefix; |
84 | | }; |
85 | | |
86 | | template <bool IN_COLLECTION, bool OFFSET_INDEX> |
87 | | class PageReader { |
88 | | public: |
89 | | struct PageStatistics { |
90 | | int64_t decode_header_time = 0; |
91 | | int64_t skip_page_header_num = 0; |
92 | | int64_t parse_page_header_num = 0; |
93 | | int64_t read_page_header_time = 0; |
94 | | int64_t page_cache_hit_counter = 0; |
95 | | int64_t page_cache_missing_counter = 0; |
96 | | int64_t page_cache_compressed_hit_counter = 0; |
97 | | int64_t page_cache_decompressed_hit_counter = 0; |
98 | | int64_t page_cache_write_counter = 0; |
99 | | int64_t page_cache_compressed_write_counter = 0; |
100 | | int64_t page_cache_decompressed_write_counter = 0; |
101 | | int64_t page_read_counter = 0; |
102 | | }; |
103 | | |
104 | | PageReader(io::BufferedStreamReader* reader, io::IOContext* io_ctx, uint64_t offset, |
105 | | uint64_t length, size_t total_rows, const tparquet::ColumnMetaData& metadata, |
106 | | const ParquetPageReadContext& page_read_ctx, |
107 | | const tparquet::OffsetIndex* offset_index = nullptr); |
108 | 163 | ~PageReader() = default; _ZN5doris10PageReaderILb0ELb0EED2Ev Line | Count | Source | 108 | 161 | ~PageReader() = default; |
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EED2Ev _ZN5doris10PageReaderILb1ELb0EED2Ev Line | Count | Source | 108 | 2 | ~PageReader() = default; |
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EED2Ev |
109 | | |
110 | 0 | bool has_next_page() const { |
111 | 0 | if constexpr (OFFSET_INDEX) { |
112 | 0 | return _page_index + 1 != _offset_index->page_locations.size(); |
113 | 0 | } else { |
114 | | // Deprecated |
115 | | // Parquet file may not be standardized, |
116 | | // _end_offset may exceed the actual data area. |
117 | | // ColumnChunkReader::has_next_page() use the number of parsed values for judgment |
118 | | // ref:https://github.com/duckdb/duckdb/issues/10829 |
119 | | // [[deprecated]] |
120 | 0 | LOG(FATAL) << "has_next_page should not be called when no offset index"; |
121 | 0 | return _offset < _end_offset; |
122 | 0 | } |
123 | 0 | } Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE13has_next_pageEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE13has_next_pageEv Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE13has_next_pageEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb0EE13has_next_pageEv |
124 | | |
125 | | Status parse_page_header(); |
126 | | |
127 | 31 | Status next_page() { |
128 | 31 | _page_statistics.skip_page_header_num += _state == INITIALIZED; |
129 | 31 | if constexpr (OFFSET_INDEX) { |
130 | 0 | _page_index++; |
131 | 0 | _start_row = _offset_index->page_locations[_page_index].first_row_index; |
132 | 0 | if (_page_index + 1 < _offset_index->page_locations.size()) { |
133 | 0 | _end_row = _offset_index->page_locations[_page_index + 1].first_row_index; |
134 | 0 | } else { |
135 | 0 | _end_row = _total_rows; |
136 | 0 | } |
137 | 0 | int64_t next_page_offset = _offset_index->page_locations[_page_index].offset; |
138 | 0 | _offset = next_page_offset; |
139 | 0 | _next_header_offset = next_page_offset; |
140 | 0 | _state = INITIALIZED; |
141 | 31 | } else { |
142 | 31 | if (UNLIKELY(_offset == _start_offset)) { |
143 | 0 | return Status::Corruption("should parse first page."); |
144 | 0 | } |
145 | | |
146 | 31 | if (is_header_v2()) { |
147 | 0 | _start_row += _cur_page_header.data_page_header_v2.num_rows; |
148 | 31 | } else if constexpr (!IN_COLLECTION) { |
149 | 31 | _start_row += _cur_page_header.data_page_header.num_values; |
150 | 31 | } |
151 | | |
152 | 31 | _offset = _next_header_offset; |
153 | 31 | _state = INITIALIZED; |
154 | 31 | } |
155 | | |
156 | 0 | return Status::OK(); |
157 | 31 | } Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE9next_pageEv Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb0EE9next_pageEv Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE9next_pageEv _ZN5doris10PageReaderILb0ELb0EE9next_pageEv Line | Count | Source | 127 | 31 | Status next_page() { | 128 | 31 | _page_statistics.skip_page_header_num += _state == INITIALIZED; | 129 | | if constexpr (OFFSET_INDEX) { | 130 | | _page_index++; | 131 | | _start_row = _offset_index->page_locations[_page_index].first_row_index; | 132 | | if (_page_index + 1 < _offset_index->page_locations.size()) { | 133 | | _end_row = _offset_index->page_locations[_page_index + 1].first_row_index; | 134 | | } else { | 135 | | _end_row = _total_rows; | 136 | | } | 137 | | int64_t next_page_offset = _offset_index->page_locations[_page_index].offset; | 138 | | _offset = next_page_offset; | 139 | | _next_header_offset = next_page_offset; | 140 | | _state = INITIALIZED; | 141 | 31 | } else { | 142 | 31 | if (UNLIKELY(_offset == _start_offset)) { | 143 | 0 | return Status::Corruption("should parse first page."); | 144 | 0 | } | 145 | | | 146 | 31 | if (is_header_v2()) { | 147 | 0 | _start_row += _cur_page_header.data_page_header_v2.num_rows; | 148 | 31 | } else if constexpr (!IN_COLLECTION) { | 149 | 31 | _start_row += _cur_page_header.data_page_header.num_values; | 150 | 31 | } | 151 | | | 152 | 31 | _offset = _next_header_offset; | 153 | 31 | _state = INITIALIZED; | 154 | 31 | } | 155 | | | 156 | 0 | return Status::OK(); | 157 | 31 | } |
|
158 | | |
159 | 31 | Status dict_next_page() { |
160 | 31 | if constexpr (OFFSET_INDEX) { |
161 | 0 | _state = INITIALIZED; |
162 | 0 | return Status::OK(); |
163 | 31 | } else { |
164 | 31 | return next_page(); |
165 | 31 | } |
166 | 31 | } Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE14dict_next_pageEv Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb0EE14dict_next_pageEv Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE14dict_next_pageEv _ZN5doris10PageReaderILb0ELb0EE14dict_next_pageEv Line | Count | Source | 159 | 31 | Status dict_next_page() { | 160 | | if constexpr (OFFSET_INDEX) { | 161 | | _state = INITIALIZED; | 162 | | return Status::OK(); | 163 | 31 | } else { | 164 | 31 | return next_page(); | 165 | 31 | } | 166 | 31 | } |
|
167 | | |
168 | 541 | Status get_page_header(const tparquet::PageHeader** page_header) { |
169 | 541 | if (UNLIKELY(_state != HEADER_PARSED)) { |
170 | 0 | return Status::InternalError("Page header not parsed"); |
171 | 0 | } |
172 | 541 | *page_header = &_cur_page_header; |
173 | 541 | return Status::OK(); |
174 | 541 | } Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE15get_page_headerEPPKN8tparquet10PageHeaderE _ZN5doris10PageReaderILb1ELb0EE15get_page_headerEPPKN8tparquet10PageHeaderE Line | Count | Source | 168 | 6 | Status get_page_header(const tparquet::PageHeader** page_header) { | 169 | 6 | if (UNLIKELY(_state != HEADER_PARSED)) { | 170 | 0 | return Status::InternalError("Page header not parsed"); | 171 | 0 | } | 172 | 6 | *page_header = &_cur_page_header; | 173 | 6 | return Status::OK(); | 174 | 6 | } |
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE15get_page_headerEPPKN8tparquet10PageHeaderE _ZN5doris10PageReaderILb0ELb0EE15get_page_headerEPPKN8tparquet10PageHeaderE Line | Count | Source | 168 | 535 | Status get_page_header(const tparquet::PageHeader** page_header) { | 169 | 535 | if (UNLIKELY(_state != HEADER_PARSED)) { | 170 | 0 | return Status::InternalError("Page header not parsed"); | 171 | 0 | } | 172 | 535 | *page_header = &_cur_page_header; | 173 | 535 | return Status::OK(); | 174 | 535 | } |
|
175 | | |
176 | | Status get_page_data(Slice& slice); |
177 | | |
178 | | // Skip page data and update offset (used when data is loaded from cache) |
179 | 17 | void skip_page_data() { |
180 | 17 | if (_state == HEADER_PARSED) { |
181 | 17 | _offset += _cur_page_header.compressed_page_size; |
182 | 17 | _state = DATA_LOADED; |
183 | 17 | } |
184 | 17 | } Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE14skip_page_dataEv Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb0EE14skip_page_dataEv Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE14skip_page_dataEv _ZN5doris10PageReaderILb0ELb0EE14skip_page_dataEv Line | Count | Source | 179 | 17 | void skip_page_data() { | 180 | 17 | if (_state == HEADER_PARSED) { | 181 | 17 | _offset += _cur_page_header.compressed_page_size; | 182 | 17 | _state = DATA_LOADED; | 183 | 17 | } | 184 | 17 | } |
|
185 | | |
186 | 242 | const std::vector<uint8_t>& header_bytes() const { return _header_buf; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE12header_bytesEv _ZNK5doris10PageReaderILb1ELb0EE12header_bytesEv Line | Count | Source | 186 | 3 | const std::vector<uint8_t>& header_bytes() const { return _header_buf; } |
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE12header_bytesEv _ZNK5doris10PageReaderILb0ELb0EE12header_bytesEv Line | Count | Source | 186 | 239 | const std::vector<uint8_t>& header_bytes() const { return _header_buf; } |
|
187 | | // header start offset for current page |
188 | 56 | int64_t header_start_offset() const { |
189 | 56 | return static_cast<int64_t>(_next_header_offset) - static_cast<int64_t>(_last_header_size) - |
190 | 56 | static_cast<int64_t>(_cur_page_header.compressed_page_size); |
191 | 56 | } Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE19header_start_offsetEv _ZNK5doris10PageReaderILb1ELb0EE19header_start_offsetEv Line | Count | Source | 188 | 1 | int64_t header_start_offset() const { | 189 | 1 | return static_cast<int64_t>(_next_header_offset) - static_cast<int64_t>(_last_header_size) - | 190 | 1 | static_cast<int64_t>(_cur_page_header.compressed_page_size); | 191 | 1 | } |
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE19header_start_offsetEv _ZNK5doris10PageReaderILb0ELb0EE19header_start_offsetEv Line | Count | Source | 188 | 55 | int64_t header_start_offset() const { | 189 | 55 | return static_cast<int64_t>(_next_header_offset) - static_cast<int64_t>(_last_header_size) - | 190 | 55 | static_cast<int64_t>(_cur_page_header.compressed_page_size); | 191 | 55 | } |
|
192 | 0 | uint64_t file_end_offset() const { return _end_offset; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE15file_end_offsetEv Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE15file_end_offsetEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE15file_end_offsetEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb0EE15file_end_offsetEv |
193 | 0 | bool cached_decompressed() const { |
194 | 0 | return should_cache_decompressed(&_cur_page_header, _metadata); |
195 | 0 | } Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE19cached_decompressedEv Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE19cached_decompressedEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE19cached_decompressedEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb0EE19cached_decompressedEv |
196 | | |
197 | 1.46k | PageStatistics& page_statistics() { return _page_statistics; }_ZN5doris10PageReaderILb0ELb0EE15page_statisticsEv Line | Count | Source | 197 | 1.44k | PageStatistics& page_statistics() { return _page_statistics; } |
Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE15page_statisticsEv _ZN5doris10PageReaderILb1ELb0EE15page_statisticsEv Line | Count | Source | 197 | 24 | PageStatistics& page_statistics() { return _page_statistics; } |
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE15page_statisticsEv |
198 | | |
199 | 419 | bool is_header_v2() { return _cur_page_header.__isset.data_page_header_v2; }Unexecuted instantiation: _ZN5doris10PageReaderILb1ELb1EE12is_header_v2Ev _ZN5doris10PageReaderILb1ELb0EE12is_header_v2Ev Line | Count | Source | 199 | 8 | bool is_header_v2() { return _cur_page_header.__isset.data_page_header_v2; } |
Unexecuted instantiation: _ZN5doris10PageReaderILb0ELb1EE12is_header_v2Ev _ZN5doris10PageReaderILb0ELb0EE12is_header_v2Ev Line | Count | Source | 199 | 411 | bool is_header_v2() { return _cur_page_header.__isset.data_page_header_v2; } |
|
200 | | |
201 | | // Returns whether the current page's cache payload is decompressed |
202 | 121 | bool is_cache_payload_decompressed() const { return _is_cache_payload_decompressed; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE29is_cache_payload_decompressedEv _ZNK5doris10PageReaderILb1ELb0EE29is_cache_payload_decompressedEv Line | Count | Source | 202 | 1 | bool is_cache_payload_decompressed() const { return _is_cache_payload_decompressed; } |
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE29is_cache_payload_decompressedEv _ZNK5doris10PageReaderILb0ELb0EE29is_cache_payload_decompressedEv Line | Count | Source | 202 | 120 | bool is_cache_payload_decompressed() const { return _is_cache_payload_decompressed; } |
|
203 | | |
204 | 6 | size_t start_row() const { return _start_row; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE9start_rowEv Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE9start_rowEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE9start_rowEv _ZNK5doris10PageReaderILb0ELb0EE9start_rowEv Line | Count | Source | 204 | 6 | size_t start_row() const { return _start_row; } |
|
205 | | |
206 | 188 | size_t end_row() const { return _end_row; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE7end_rowEv Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb0EE7end_rowEv Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE7end_rowEv _ZNK5doris10PageReaderILb0ELb0EE7end_rowEv Line | Count | Source | 206 | 188 | size_t end_row() const { return _end_row; } |
|
207 | | |
208 | | // Accessors for cache handle |
209 | 189 | bool has_page_cache_handle() const { return _page_cache_handle.cache() != nullptr; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE21has_page_cache_handleEv _ZNK5doris10PageReaderILb1ELb0EE21has_page_cache_handleEv Line | Count | Source | 209 | 2 | bool has_page_cache_handle() const { return _page_cache_handle.cache() != nullptr; } |
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE21has_page_cache_handleEv _ZNK5doris10PageReaderILb0ELb0EE21has_page_cache_handleEv Line | Count | Source | 209 | 187 | bool has_page_cache_handle() const { return _page_cache_handle.cache() != nullptr; } |
|
210 | 121 | const doris::PageCacheHandle& page_cache_handle() const { return _page_cache_handle; }Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE17page_cache_handleEv _ZNK5doris10PageReaderILb1ELb0EE17page_cache_handleEv Line | Count | Source | 210 | 1 | const doris::PageCacheHandle& page_cache_handle() const { return _page_cache_handle; } |
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE17page_cache_handleEv _ZNK5doris10PageReaderILb0ELb0EE17page_cache_handleEv Line | Count | Source | 210 | 120 | const doris::PageCacheHandle& page_cache_handle() const { return _page_cache_handle; } |
|
211 | 245 | StoragePageCache::CacheKey make_page_cache_key(int64_t offset) const { |
212 | 245 | return _page_cache_key_builder.make_key(_end_offset, offset); |
213 | 245 | } Unexecuted instantiation: _ZNK5doris10PageReaderILb1ELb1EE19make_page_cache_keyEl _ZNK5doris10PageReaderILb1ELb0EE19make_page_cache_keyEl Line | Count | Source | 211 | 3 | StoragePageCache::CacheKey make_page_cache_key(int64_t offset) const { | 212 | 3 | return _page_cache_key_builder.make_key(_end_offset, offset); | 213 | 3 | } |
Unexecuted instantiation: _ZNK5doris10PageReaderILb0ELb1EE19make_page_cache_keyEl _ZNK5doris10PageReaderILb0ELb0EE19make_page_cache_keyEl Line | Count | Source | 211 | 242 | StoragePageCache::CacheKey make_page_cache_key(int64_t offset) const { | 212 | 242 | return _page_cache_key_builder.make_key(_end_offset, offset); | 213 | 242 | } |
|
214 | | |
215 | | private: |
216 | | enum PageReaderState { INITIALIZED, HEADER_PARSED, DATA_LOADED }; |
217 | | PageReaderState _state = INITIALIZED; |
218 | | PageStatistics _page_statistics; |
219 | | |
220 | | io::BufferedStreamReader* _reader = nullptr; |
221 | | io::IOContext* _io_ctx = nullptr; |
222 | | // current reader offset in file location. |
223 | | uint64_t _offset = 0; |
224 | | // this page offset in file location. |
225 | | uint64_t _start_offset = 0; |
226 | | uint64_t _end_offset = 0; |
227 | | uint64_t _next_header_offset = 0; |
228 | | // current page row range |
229 | | size_t _start_row = 0; |
230 | | size_t _end_row = 0; |
231 | | // total rows in this column chunk |
232 | | size_t _total_rows = 0; |
233 | | // Column metadata for this column chunk |
234 | | const tparquet::ColumnMetaData& _metadata; |
235 | | // Session-level parquet page cache options |
236 | | ParquetPageReadContext _page_read_ctx; |
237 | | // for page index |
238 | | size_t _page_index = 0; |
239 | | const tparquet::OffsetIndex* _offset_index; |
240 | | |
241 | | tparquet::PageHeader _cur_page_header; |
242 | | bool _is_cache_payload_decompressed = true; |
243 | | |
244 | | // Page cache members |
245 | | ParquetPageCacheKeyBuilder _page_cache_key_builder; |
246 | | doris::PageCacheHandle _page_cache_handle; |
247 | | // stored header bytes when cache miss so we can insert header+payload into cache |
248 | | std::vector<uint8_t> _header_buf; |
249 | | // last parsed header size in bytes |
250 | | uint32_t _last_header_size = 0; |
251 | | }; |
252 | | |
253 | | template <bool IN_COLLECTION, bool OFFSET_INDEX> |
254 | | std::unique_ptr<PageReader<IN_COLLECTION, OFFSET_INDEX>> create_page_reader( |
255 | | io::BufferedStreamReader* reader, io::IOContext* io_ctx, uint64_t offset, uint64_t length, |
256 | | size_t total_rows, const tparquet::ColumnMetaData& metadata, |
257 | 163 | const ParquetPageReadContext& ctx, const tparquet::OffsetIndex* offset_index = nullptr) { |
258 | 163 | return std::make_unique<PageReader<IN_COLLECTION, OFFSET_INDEX>>( |
259 | 163 | reader, io_ctx, offset, length, total_rows, metadata, ctx, offset_index); |
260 | 163 | } Unexecuted instantiation: _ZN5doris18create_page_readerILb1ELb1EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE _ZN5doris18create_page_readerILb1ELb0EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE Line | Count | Source | 257 | 2 | const ParquetPageReadContext& ctx, const tparquet::OffsetIndex* offset_index = nullptr) { | 258 | 2 | return std::make_unique<PageReader<IN_COLLECTION, OFFSET_INDEX>>( | 259 | 2 | reader, io_ctx, offset, length, total_rows, metadata, ctx, offset_index); | 260 | 2 | } |
Unexecuted instantiation: _ZN5doris18create_page_readerILb0ELb1EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE _ZN5doris18create_page_readerILb0ELb0EEESt10unique_ptrINS_10PageReaderIXT_EXT0_EEESt14default_deleteIS3_EEPNS_2io20BufferedStreamReaderEPNS7_9IOContextEmmmRKN8tparquet14ColumnMetaDataERKNS_22ParquetPageReadContextEPKNSC_11OffsetIndexE Line | Count | Source | 257 | 161 | const ParquetPageReadContext& ctx, const tparquet::OffsetIndex* offset_index = nullptr) { | 258 | 161 | return std::make_unique<PageReader<IN_COLLECTION, OFFSET_INDEX>>( | 259 | 161 | reader, io_ctx, offset, length, total_rows, metadata, ctx, offset_index); | 260 | 161 | } |
|
261 | | #include "common/compile_check_end.h" |
262 | | |
263 | | } // namespace doris |