|
36 | 36 | #include <thrift/protocol/TCompactProtocol.h> |
37 | 37 | #include <thrift/transport/TBufferTransports.h> |
38 | 38 |
|
| 39 | +#include "arrow/util/key_value_metadata.h" // IWYU pragma: keep |
39 | 40 | #include "arrow/util/logging.h" |
40 | 41 |
|
41 | 42 | #include "parquet/encryption/internal_file_decryptor.h" |
42 | 43 | #include "parquet/encryption/internal_file_encryptor.h" |
43 | 44 | #include "parquet/exception.h" |
44 | 45 | #include "parquet/geospatial/statistics.h" |
| 46 | +#include "parquet/metadata.h" |
45 | 47 | #include "parquet/page_index.h" |
46 | 48 | #include "parquet/platform.h" |
47 | 49 | #include "parquet/properties.h" |
@@ -431,6 +433,19 @@ constexpr format::BoundaryOrder::type ToThrift(BoundaryOrder::type type) { |
431 | 433 | } |
432 | 434 | } |
433 | 435 |
|
| 436 | +constexpr format::PageType::type ToThrift(PageType::type type) { |
| 437 | + switch (type) { |
| 438 | + case PageType::DATA_PAGE: |
| 439 | + case PageType::INDEX_PAGE: |
| 440 | + case PageType::DICTIONARY_PAGE: |
| 441 | + case PageType::DATA_PAGE_V2: |
| 442 | + return static_cast<format::PageType::type>(type); |
| 443 | + default: |
| 444 | + ARROW_DCHECK(false) << "Cannot reach here"; |
| 445 | + return format::PageType::DATA_PAGE; |
| 446 | + } |
| 447 | +} |
| 448 | + |
434 | 449 | static inline format::SortingColumn ToThrift(SortingColumn sorting_column) { |
435 | 450 | format::SortingColumn thrift_sorting_column; |
436 | 451 | thrift_sorting_column.column_idx = sorting_column.column_idx; |
@@ -545,6 +560,85 @@ static inline format::SizeStatistics ToThrift(const SizeStatistics& size_stats) |
545 | 560 | return size_statistics; |
546 | 561 | } |
547 | 562 |
|
| 563 | +// Get KeyValueMetadata from parquet Thrift RowGroup or ColumnChunk metadata. |
| 564 | +// |
| 565 | +// Returns nullptr if the metadata is not set. |
| 566 | +template <typename Metadata> |
| 567 | +std::shared_ptr<KeyValueMetadata> FromThriftKeyValueMetadata(const Metadata& source) { |
| 568 | + std::shared_ptr<KeyValueMetadata> metadata = nullptr; |
| 569 | + if (source.__isset.key_value_metadata) { |
| 570 | + std::vector<std::string> keys; |
| 571 | + std::vector<std::string> values; |
| 572 | + keys.reserve(source.key_value_metadata.size()); |
| 573 | + values.reserve(source.key_value_metadata.size()); |
| 574 | + for (const auto& it : source.key_value_metadata) { |
| 575 | + keys.push_back(it.key); |
| 576 | + values.push_back(it.value); |
| 577 | + } |
| 578 | + metadata = std::make_shared<KeyValueMetadata>(std::move(keys), std::move(values)); |
| 579 | + } |
| 580 | + return metadata; |
| 581 | +} |
| 582 | + |
| 583 | +template <typename Metadata> |
| 584 | +void ToThriftKeyValueMetadata(const KeyValueMetadata& source, Metadata* metadata) { |
| 585 | + std::vector<format::KeyValue> key_value_metadata; |
| 586 | + key_value_metadata.reserve(static_cast<size_t>(source.size())); |
| 587 | + for (int64_t i = 0; i < source.size(); ++i) { |
| 588 | + format::KeyValue kv_pair; |
| 589 | + kv_pair.__set_key(source.key(i)); |
| 590 | + kv_pair.__set_value(source.value(i)); |
| 591 | + key_value_metadata.emplace_back(std::move(kv_pair)); |
| 592 | + } |
| 593 | + metadata->__set_key_value_metadata(std::move(key_value_metadata)); |
| 594 | +} |
| 595 | + |
| 596 | +static inline format::ColumnMetaData ToThrift(const ColumnChunkMetaData& cc_metadata) { |
| 597 | + format::ColumnMetaData column_meta_data; |
| 598 | + column_meta_data.__set_type(ToThrift(cc_metadata.type())); |
| 599 | + std::vector<format::Encoding::type> thrift_encodings; |
| 600 | + thrift_encodings.reserve(cc_metadata.encodings().size()); |
| 601 | + for (const auto& encoding : cc_metadata.encodings()) { |
| 602 | + thrift_encodings.push_back(ToThrift(encoding)); |
| 603 | + } |
| 604 | + column_meta_data.__set_encodings(std::move(thrift_encodings)); |
| 605 | + column_meta_data.__set_path_in_schema(cc_metadata.path_in_schema()->ToDotVector()); |
| 606 | + column_meta_data.__set_codec(ToThrift(cc_metadata.compression())); |
| 607 | + column_meta_data.__set_num_values(cc_metadata.num_values()); |
| 608 | + column_meta_data.__set_total_uncompressed_size(cc_metadata.total_uncompressed_size()); |
| 609 | + column_meta_data.__set_total_compressed_size(cc_metadata.total_compressed_size()); |
| 610 | + ToThriftKeyValueMetadata(*cc_metadata.key_value_metadata(), &column_meta_data); |
| 611 | + column_meta_data.__set_data_page_offset(cc_metadata.data_page_offset()); |
| 612 | + if (cc_metadata.has_index_page()) { |
| 613 | + column_meta_data.__set_index_page_offset(cc_metadata.index_page_offset()); |
| 614 | + } |
| 615 | + if (cc_metadata.has_dictionary_page()) { |
| 616 | + column_meta_data.__set_dictionary_page_offset(cc_metadata.dictionary_page_offset()); |
| 617 | + } |
| 618 | + if (cc_metadata.is_stats_set()) { |
| 619 | + column_meta_data.__set_statistics(ToThrift(*cc_metadata.encoded_statistics())); |
| 620 | + } |
| 621 | + std::vector<format::PageEncodingStats> thrift_encoding_stats; |
| 622 | + thrift_encoding_stats.reserve(cc_metadata.encoding_stats().size()); |
| 623 | + for (const auto& encoding_stat : cc_metadata.encoding_stats()) { |
| 624 | + format::PageEncodingStats enc_stat; |
| 625 | + enc_stat.__set_page_type(ToThrift(encoding_stat.page_type)); |
| 626 | + enc_stat.__set_encoding(ToThrift(encoding_stat.encoding)); |
| 627 | + enc_stat.__set_count(encoding_stat.count); |
| 628 | + thrift_encoding_stats.push_back(enc_stat); |
| 629 | + } |
| 630 | + column_meta_data.__set_encoding_stats(std::move(thrift_encoding_stats)); |
| 631 | + if (auto size_stats = cc_metadata.size_statistics(); size_stats != nullptr) { |
| 632 | + column_meta_data.__set_size_statistics(ToThrift(*size_stats)); |
| 633 | + } |
| 634 | + if (auto geo_stats = cc_metadata.geo_statistics(); geo_stats != nullptr) { |
| 635 | + if (auto encoded_geo_stats = geo_stats->Encode(); encoded_geo_stats.has_value()) { |
| 636 | + column_meta_data.__set_geospatial_statistics(ToThrift(*encoded_geo_stats)); |
| 637 | + } |
| 638 | + } |
| 639 | + return column_meta_data; |
| 640 | +} |
| 641 | + |
548 | 642 | static inline format::PageLocation ToThrift(const PageLocation& page_location) { |
549 | 643 | format::PageLocation thrift_page_location; |
550 | 644 | thrift_page_location.__set_offset(page_location.offset); |
|
0 commit comments