Skip to content

Commit 8c5bda0

Browse files
committed
address review
1 parent ab74095 commit 8c5bda0

4 files changed

Lines changed: 97 additions & 46 deletions

File tree

cpp/src/parquet/file_rewriter.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ class SingleFileRewriter {
470470
if (current_row_group_index_ >= metadata_->num_row_groups()) {
471471
throw ParquetException("Trying to read row group ", current_row_group_index_,
472472
" but file only has ", metadata_->num_row_groups(),
473-
" row group");
473+
" row groups");
474474
}
475475
auto row_group_reader = parquet_file_reader_->RowGroup(current_row_group_index_);
476476
auto page_index_reader = page_index_reader_
@@ -771,7 +771,7 @@ class GeneratedFile : public ParquetFileRewriter::Contents {
771771
};
772772

773773
// ----------------------------------------------------------------------
774-
// ParquetFilesRewriter public API
774+
// ParquetFileRewriter public API
775775

776776
ParquetFileRewriter::ParquetFileRewriter() = default;
777777

cpp/src/parquet/metadata.cc

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include "parquet/metadata.h"
1919

2020
#include <algorithm>
21-
#include <cinttypes>
2221
#include <memory>
2322
#include <ostream>
2423
#include <random>
@@ -29,7 +28,6 @@
2928
#include <vector>
3029

3130
#include "arrow/io/memory.h"
32-
#include "arrow/util/key_value_metadata.h"
3331
#include "arrow/util/logging_internal.h"
3432
#include "arrow/util/pcg_random.h"
3533
#include "parquet/encryption/encryption_internal.h"
@@ -165,40 +163,6 @@ std::shared_ptr<Statistics> MakeColumnStats(const format::ColumnMetaData& meta_d
165163
}
166164
throw ParquetException("Can't decode page statistics for selected column type");
167165
}
168-
169-
// Get KeyValueMetadata from parquet Thrift RowGroup or ColumnChunk metadata.
170-
//
171-
// Returns nullptr if the metadata is not set.
172-
template <typename Metadata>
173-
std::shared_ptr<KeyValueMetadata> FromThriftKeyValueMetadata(const Metadata& source) {
174-
std::shared_ptr<KeyValueMetadata> metadata = nullptr;
175-
if (source.__isset.key_value_metadata) {
176-
std::vector<std::string> keys;
177-
std::vector<std::string> values;
178-
keys.reserve(source.key_value_metadata.size());
179-
values.reserve(source.key_value_metadata.size());
180-
for (const auto& it : source.key_value_metadata) {
181-
keys.push_back(it.key);
182-
values.push_back(it.value);
183-
}
184-
metadata = std::make_shared<KeyValueMetadata>(std::move(keys), std::move(values));
185-
}
186-
return metadata;
187-
}
188-
189-
template <typename Metadata>
190-
void ToThriftKeyValueMetadata(const KeyValueMetadata& source, Metadata* metadata) {
191-
std::vector<format::KeyValue> key_value_metadata;
192-
key_value_metadata.reserve(static_cast<size_t>(source.size()));
193-
for (int64_t i = 0; i < source.size(); ++i) {
194-
format::KeyValue kv_pair;
195-
kv_pair.__set_key(source.key(i));
196-
kv_pair.__set_value(source.value(i));
197-
key_value_metadata.emplace_back(std::move(kv_pair));
198-
}
199-
metadata->__set_key_value_metadata(std::move(key_value_metadata));
200-
}
201-
202166
} // namespace
203167

204168
// MetaData Accessor
@@ -460,8 +424,6 @@ class ColumnChunkMetaData::ColumnChunkMetaDataImpl {
460424
return key_value_metadata_;
461425
}
462426

463-
const void* to_thrift() const { return column_metadata_; }
464-
465427
private:
466428
void InitKeyValueMetadata() {
467429
key_value_metadata_ = FromThriftKeyValueMetadata(*column_metadata_);
@@ -613,8 +575,6 @@ const std::shared_ptr<const KeyValueMetadata>& ColumnChunkMetaData::key_value_me
613575
return impl_->key_value_metadata();
614576
}
615577

616-
const void* ColumnChunkMetaData::to_thrift() const { return impl_->to_thrift(); }
617-
618578
// row-group metadata
619579
class RowGroupMetaData::RowGroupMetaDataImpl {
620580
public:
@@ -1948,8 +1908,7 @@ class RowGroupMetaDataBuilder::RowGroupMetaDataBuilderImpl {
19481908
auto* column_chunk = &row_group_->columns[next_column_++];
19491909
column_chunk->__set_file_offset(0);
19501910
column_chunk->__isset.meta_data = true;
1951-
column_chunk->meta_data =
1952-
*static_cast<const format::ColumnMetaData*>(cc_metadata->to_thrift());
1911+
column_chunk->meta_data = ToThrift(*cc_metadata);
19531912

19541913
auto& meta_data = column_chunk->meta_data;
19551914
meta_data.__set_data_page_offset(meta_data.data_page_offset + shift);

cpp/src/parquet/metadata.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,6 @@ class PARQUET_EXPORT ColumnChunkMetaData {
162162
std::optional<IndexLocation> GetOffsetIndexLocation() const;
163163
const std::shared_ptr<const KeyValueMetadata>& key_value_metadata() const;
164164

165-
const void* to_thrift() const;
166-
167165
private:
168166
explicit ColumnChunkMetaData(
169167
const void* metadata, const ColumnDescriptor* descr, int16_t row_group_ordinal,

cpp/src/parquet/thrift_internal.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@
3636
#include <thrift/protocol/TCompactProtocol.h>
3737
#include <thrift/transport/TBufferTransports.h>
3838

39+
#include "arrow/util/key_value_metadata.h" // IWYU pragma: keep
3940
#include "arrow/util/logging.h"
4041

4142
#include "parquet/encryption/internal_file_decryptor.h"
4243
#include "parquet/encryption/internal_file_encryptor.h"
4344
#include "parquet/exception.h"
4445
#include "parquet/geospatial/statistics.h"
46+
#include "parquet/metadata.h"
4547
#include "parquet/page_index.h"
4648
#include "parquet/platform.h"
4749
#include "parquet/properties.h"
@@ -431,6 +433,19 @@ constexpr format::BoundaryOrder::type ToThrift(BoundaryOrder::type type) {
431433
}
432434
}
433435

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+
434449
static inline format::SortingColumn ToThrift(SortingColumn sorting_column) {
435450
format::SortingColumn thrift_sorting_column;
436451
thrift_sorting_column.column_idx = sorting_column.column_idx;
@@ -545,6 +560,85 @@ static inline format::SizeStatistics ToThrift(const SizeStatistics& size_stats)
545560
return size_statistics;
546561
}
547562

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+
548642
static inline format::PageLocation ToThrift(const PageLocation& page_location) {
549643
format::PageLocation thrift_page_location;
550644
thrift_page_location.__set_offset(page_location.offset);

0 commit comments

Comments
 (0)