| 467 | } |
| 468 | |
| 469 | Status TransferBool(RecordReader* reader, |
| 470 | std::unique_ptr<::parquet::ColumnChunkMetaData> metadata, |
| 471 | const ReaderContext* ctx, bool nullable, Datum* out) { |
| 472 | int64_t length = reader->values_written(); |
| 473 | |
| 474 | const int64_t buffer_size = bit_util::BytesForBits(length); |
| 475 | ARROW_ASSIGN_OR_RAISE(auto data, ::arrow::AllocateBuffer(buffer_size, ctx->pool)); |
| 476 | |
| 477 | // Transfer boolean values to packed bitmap |
| 478 | auto values = reinterpret_cast<const bool*>(reader->values()); |
| 479 | uint8_t* data_ptr = data->mutable_data(); |
| 480 | memset(data_ptr, 0, static_cast<size_t>(buffer_size)); |
| 481 | |
| 482 | for (int64_t i = 0; i < length; i++) { |
| 483 | if (values[i]) { |
| 484 | ::arrow::bit_util::SetBit(data_ptr, i); |
| 485 | } |
| 486 | } |
| 487 | |
| 488 | std::shared_ptr<::arrow::ArrayData> array_data; |
| 489 | if (nullable) { |
| 490 | array_data = ::arrow::ArrayData::Make(::arrow::boolean(), length, |
| 491 | {reader->ReleaseIsValid(), std::move(data)}, |
| 492 | reader->null_count()); |
| 493 | } else { |
| 494 | array_data = ::arrow::ArrayData::Make(::arrow::boolean(), length, |
| 495 | {/*null_bitmap=*/nullptr, std::move(data)}, |
| 496 | /*null_count=*/0); |
| 497 | } |
| 498 | AttachStatistics<::arrow::BooleanType, BooleanType>(array_data.get(), |
| 499 | std::move(metadata), ctx); |
| 500 | *out = std::make_shared<BooleanArray>(std::move(array_data)); |
| 501 | return Status::OK(); |
| 502 | } |
| 503 | |
| 504 | Status TransferInt96(RecordReader* reader, MemoryPool* pool, |
| 505 | const std::shared_ptr<Field>& field, Datum* out, |
no test coverage detected