@@ -438,8 +438,37 @@ class ORCFileReader::Impl {
438438 return Status::OK ();
439439 }
440440
441+ Status NextStripeReader (int64_t batch_size, const std::vector<std::string>& include_names,
442+ std::shared_ptr<RecordBatchReader>* out) {
443+ if (current_row_ >= NumberOfRows ()) {
444+ out->reset ();
445+ return Status::OK ();
446+ }
447+
448+ liborc::RowReaderOptions opts;
449+ if (!include_names.empty ()) {
450+ RETURN_NOT_OK (SelectNames (&opts, include_names));
451+ }
452+ StripeInformation stripe_info ({0 , 0 , 0 , 0 });
453+ RETURN_NOT_OK (SelectStripeWithRowNumber (&opts, current_row_, &stripe_info));
454+ std::shared_ptr<Schema> schema;
455+ RETURN_NOT_OK (ReadSchema (opts, &schema));
456+ std::unique_ptr<liborc::RowReader> row_reader;
457+
458+ ORC_BEGIN_CATCH_NOT_OK
459+ row_reader = reader_->createRowReader (opts);
460+ row_reader->seekToRow (current_row_);
461+ current_row_ = stripe_info.first_row_of_stripe + stripe_info.num_rows ;
462+ ORC_END_CATCH_NOT_OK
463+
464+ *out = std::shared_ptr<RecordBatchReader>(
465+ new OrcStripeReader (std::move (row_reader), schema, batch_size, pool_));
466+ return Status::OK ();
467+ }
468+
441469 Status NextStripeReader (int64_t batch_size, std::shared_ptr<RecordBatchReader>* out) {
442- return NextStripeReader (batch_size, {}, out);
470+ std::vector<int > empty_vec;
471+ return NextStripeReader (batch_size, empty_vec, out);
443472 }
444473
445474 private:
@@ -538,6 +567,12 @@ Status ORCFileReader::NextStripeReader(int64_t batch_size,
538567 return impl_->NextStripeReader (batch_size, include_indices, out);
539568}
540569
570+ Status ORCFileReader::NextStripeReader (int64_t batch_size,
571+ const std::vector<std::string>& include_names,
572+ std::shared_ptr<RecordBatchReader>* out) {
573+ return impl_->NextStripeReader (batch_size, include_names, out);
574+ }
575+
541576int64_t ORCFileReader::NumberOfStripes () { return impl_->NumberOfStripes (); }
542577
543578int64_t ORCFileReader::NumberOfRows () { return impl_->NumberOfRows (); }
0 commit comments