return the size of the encoded buffer
| 935 | |
| 936 | // return the size of the encoded buffer |
| 937 | int64_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 | |
| 966 | void ColumnWriterImpl::AddDataPage() { |
| 967 | int64_t definition_levels_rle_size = 0; |