(
records: &[Value],
name: &str,
element_type: &DataType,
num_rows: usize,
)
| 388 | } |
| 389 | |
| 390 | fn build_array_column( |
| 391 | records: &[Value], |
| 392 | name: &str, |
| 393 | element_type: &DataType, |
| 394 | num_rows: usize, |
| 395 | ) -> crate::Result<Arc<dyn arrow_array::Array>> { |
| 396 | let arrow_element_type = crate::arrow::paimon_type_to_arrow(element_type)?; |
| 397 | let arrow_element_field = |
| 398 | arrow_schema::Field::new("element", arrow_element_type, element_type.is_nullable()); |
| 399 | |
| 400 | let idx = field_index(records, name); |
| 401 | let mut offsets = vec![0i32]; |
| 402 | let mut element_records: Vec<Value> = Vec::new(); |
| 403 | |
| 404 | for record in records.iter().take(num_rows) { |
| 405 | match get_field_at(record, idx) { |
| 406 | Some(Value::Array(arr)) => { |
| 407 | for elem in arr { |
| 408 | element_records |
| 409 | .push(Value::Record(vec![("element".to_string(), elem.clone())])); |
| 410 | } |
| 411 | offsets.push(offsets.last().unwrap() + arr.len() as i32); |
| 412 | } |
| 413 | _ => { |
| 414 | offsets.push(*offsets.last().unwrap()); |
| 415 | } |
| 416 | } |
| 417 | } |
| 418 | |
| 419 | let element_col = build_column( |
| 420 | &element_records, |
| 421 | "element", |
| 422 | element_type, |
| 423 | element_records.len(), |
| 424 | )?; |
| 425 | |
| 426 | let offsets_buf = OffsetBuffer::new(ScalarBuffer::from(offsets)); |
| 427 | let nulls = NullBuffer::new(BooleanBuffer::from( |
| 428 | (0..num_rows) |
| 429 | .map(|i| get_field_at(&records[i], idx).is_some()) |
| 430 | .collect::<Vec<_>>(), |
| 431 | )); |
| 432 | |
| 433 | let list_arr = ListArray::try_new( |
| 434 | Arc::new(arrow_element_field), |
| 435 | offsets_buf, |
| 436 | element_col, |
| 437 | Some(nulls), |
| 438 | ) |
| 439 | .map_err(|e| Error::UnexpectedError { |
| 440 | message: format!("Failed to build ListArray: {e}"), |
| 441 | source: Some(Box::new(e)), |
| 442 | })?; |
| 443 | Ok(Arc::new(list_arr)) |
| 444 | } |
| 445 | |
| 446 | fn build_map_column( |
| 447 | records: &[Value], |
no test coverage detected