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