MCPcopy Create free account
hub / github.com/apache/arrow / RleEncodeLevels

Method RleEncodeLevels

cpp/src/parquet/column_writer.cc:937–964  ·  view source on GitHub ↗

return the size of the encoded buffer

Source from the content-addressed store, hash-verified

935
936// return the size of the encoded buffer
937int64_t ColumnWriterImpl::RleEncodeLevels(const void* src_buffer,
938 ResizableBuffer* dest_buffer, int16_t max_level,
939 bool include_length_prefix) {
940 // V1 DataPage includes the length of the RLE level as a prefix.
941 int32_t prefix_size = include_length_prefix ? sizeof(int32_t) : 0;
942
943 // TODO: This only works with due to some RLE specifics
944 int64_t rle_size = LevelEncoder::MaxBufferSize(Encoding::RLE, max_level,
945 static_cast<int>(num_buffered_values_)) +
946 prefix_size;
947
948 // Use Arrow::Buffer::shrink_to_fit = false
949 // underlying buffer only keeps growing. Resize to a smaller size does not reallocate.
950 PARQUET_THROW_NOT_OK(dest_buffer->Resize(rle_size, false));
951
952 level_encoder_.Init(Encoding::RLE, max_level, static_cast<int>(num_buffered_values_),
953 dest_buffer->mutable_data() + prefix_size,
954 static_cast<int>(dest_buffer->size() - prefix_size));
955 int encoded = level_encoder_.Encode(static_cast<int>(num_buffered_values_),
956 reinterpret_cast<const int16_t*>(src_buffer));
957 DCHECK_EQ(encoded, num_buffered_values_);
958
959 if (include_length_prefix) {
960 reinterpret_cast<int32_t*>(dest_buffer->mutable_data())[0] = level_encoder_.len();
961 }
962
963 return level_encoder_.len() + prefix_size;
964}
965
966void ColumnWriterImpl::AddDataPage() {
967 int64_t definition_levels_rle_size = 0;

Callers

nothing calls this directly

Calls 6

ResizeMethod · 0.45
InitMethod · 0.45
mutable_dataMethod · 0.45
sizeMethod · 0.45
EncodeMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected