@@ -105,7 +105,7 @@ Result<std::unique_ptr<FileReaderWrapper>> FileReaderWrapper::Create(
105105 std::move (file_reader), all_row_group_ranges, num_rows, batch_size, pool));
106106 std::vector<TargetRowGroup> all_target_row_groups;
107107 for (int32_t i = 0 ; i < file_reader_wrapper->GetNumberOfRowGroups (); i++) {
108- all_target_row_groups.emplace_back (/* rg_index=*/ i, /* page_filtered =*/ false ,
108+ all_target_row_groups.emplace_back (/* rg_index=*/ i, /* is_partially_matched =*/ false ,
109109 /* ranges=*/ RowRanges ());
110110 }
111111 PAIMON_RETURN_NOT_OK (
@@ -144,7 +144,7 @@ FileReaderWrapper::FileReaderWrapper(
144144 int64_t batch_size, std::shared_ptr<::arrow::MemoryPool> pool)
145145 : file_reader_(std::move(file_reader)),
146146 all_row_group_ranges_ (all_row_group_ranges),
147- pool_(pool),
147+ pool_(std::move( pool) ),
148148 batch_size_(batch_size),
149149 num_rows_(num_rows) {}
150150
@@ -184,7 +184,7 @@ Status FileReaderWrapper::SeekToRow(uint64_t row_number) {
184184 if (target_row_groups_[i].excluded_by_read_range ) {
185185 continue ;
186186 }
187- uint32_t rg_id = target_row_groups_[i].row_group_index ;
187+ int32_t rg_id = target_row_groups_[i].row_group_index ;
188188 uint64_t rg_start = all_row_group_ranges_[rg_id].first ;
189189 uint64_t rg_end = all_row_group_ranges_[rg_id].second ;
190190 if (row_number > rg_start && row_number < rg_end) {
@@ -297,12 +297,13 @@ Result<std::shared_ptr<arrow::RecordBatch>> FileReaderWrapper::Next() {
297297 }
298298
299299 while (current_row_group_idx_ < target_row_groups_.size ()) {
300- bool is_page_filtered = target_row_groups_[current_row_group_idx_].is_partially_matched ;
300+ bool is_partially_matched =
301+ target_row_groups_[current_row_group_idx_].is_partially_matched ;
301302 PAIMON_ASSIGN_OR_RAISE (std::shared_ptr<arrow::RecordBatch> batch,
302- is_page_filtered ? NextPageFiltered () : NextFullyMatched ());
303+ is_partially_matched ? NextPageFiltered () : NextFullyMatched ());
303304 if (batch) {
304305 return batch;
305- } else if (!is_page_filtered ) {
306+ } else if (!is_partially_matched ) {
306307 // Null from fully-matched path means batch_reader_ is globally exhausted.
307308 break ;
308309 }
@@ -424,13 +425,18 @@ Status FileReaderWrapper::PrepareForReading(const std::vector<TargetRowGroup>& t
424425 }
425426 }
426427
427- bool has_page_filtered = fully_matched_row_groups.size () != active_count;
428- if (has_page_filtered ) {
428+ bool has_partially_matched = fully_matched_row_groups.size () != active_count;
429+ if (has_partially_matched ) {
429430 PAIMON_RETURN_NOT_OK (BuildPageFilteredSchema (column_indices));
430431 }
431432
432433 WaitForPendingPreBuffer ();
433434
435+ // TODO(Yonghao Fang): Neither Paimon nor Arrow manage the size and lifecycle of prebuffered
436+ // caches. So when a lot of row is needed, there is possibility of OOM due to too much
437+ // prebuffering. Also, DispatchPreBuffer will drop previous prebuffered ranges by
438+ // GetRecordBatchReader, which cause IO wastes.
439+
434440 // Create standard reader for fully-matched row groups.
435441 if (!fully_matched_row_groups.empty ()) {
436442 PAIMON_RETURN_NOT_OK_FROM_ARROW (file_reader_->GetRecordBatchReader (
@@ -441,7 +447,7 @@ Status FileReaderWrapper::PrepareForReading(const std::vector<TargetRowGroup>& t
441447
442448 // When page-filtered RGs exist, issue a single PreBuffer covering both kinds.
443449 // Otherwise GetRecordBatchReader already issued PreBuffer internally.
444- if (has_page_filtered ) {
450+ if (has_partially_matched ) {
445451 auto all_ranges = CollectPreBufferRanges (column_indices);
446452 DispatchPreBuffer (std::move (all_ranges));
447453 }
0 commit comments