| 239 | use std::sync::Arc; |
| 240 | |
| 241 | fn create_run_array_data(run_ends: Vec<i32>, values: ArrayData) -> ArrayData { |
| 242 | let run_ends_field = Arc::new(Field::new("run_ends", DataType::Int32, false)); |
| 243 | let values_field = Arc::new(Field::new("values", values.data_type().clone(), true)); |
| 244 | let data_type = DataType::RunEndEncoded(run_ends_field, values_field); |
| 245 | |
| 246 | let last_run_end = if run_ends.is_empty() { |
| 247 | 0 |
| 248 | } else { |
| 249 | run_ends[run_ends.len() - 1] as usize |
| 250 | }; |
| 251 | |
| 252 | let run_ends_buffer = Buffer::from_vec(run_ends); |
| 253 | let run_ends_data = ArrayDataBuilder::new(DataType::Int32) |
| 254 | .len(run_ends_buffer.len() / std::mem::size_of::<i32>()) |
| 255 | .add_buffer(run_ends_buffer) |
| 256 | .build() |
| 257 | .unwrap(); |
| 258 | |
| 259 | ArrayDataBuilder::new(data_type) |
| 260 | .len(last_run_end) |
| 261 | .add_child_data(run_ends_data) |
| 262 | .add_child_data(values) |
| 263 | .build() |
| 264 | .unwrap() |
| 265 | } |
| 266 | |
| 267 | fn create_run_array_data_int16(run_ends: Vec<i16>, values: ArrayData) -> ArrayData { |
| 268 | let run_ends_field = Arc::new(Field::new("run_ends", DataType::Int16, false)); |