in cpp/code/flight.cc [91:115]
arrow::Status DoGet(const arrow::flight::ServerCallContext&,
const arrow::flight::Ticket& request,
std::unique_ptr<arrow::flight::FlightDataStream>* stream) override {
ARROW_ASSIGN_OR_RAISE(auto input, root_->OpenInputFile(request.ticket));
ARROW_ASSIGN_OR_RAISE(
auto reader,
parquet::arrow::OpenFile(std::move(input), arrow::default_memory_pool()));
std::shared_ptr<arrow::Table> table;
ARROW_RETURN_NOT_OK(reader->ReadTable(&table));
// Note that we can't directly pass TableBatchReader to
// RecordBatchStream because TableBatchReader keeps a non-owning
// reference to the underlying Table, which would then get freed
// when we exit this function
std::vector<std::shared_ptr<arrow::RecordBatch>> batches;
arrow::TableBatchReader batch_reader(*table);
ARROW_ASSIGN_OR_RAISE(batches, batch_reader.ToRecordBatches());
ARROW_ASSIGN_OR_RAISE(auto owning_reader, arrow::RecordBatchReader::Make(
std::move(batches), table->schema()));
*stream = std::unique_ptr<arrow::flight::FlightDataStream>(
new arrow::flight::RecordBatchStream(owning_reader));
return arrow::Status::OK();
}