polars_arrow/legacy/kernels/
concatenate.rs

1use polars_error::{polars_bail, PolarsResult};
2
3use crate::array::growable::make_growable;
4use crate::array::ArrayRef;
5
6/// Concatenate multiple [`Array`][Array] of the same type into a single [`Array`][Array].
7/// This does not check the arrays types.
8///
9/// [Array]: arrow::array::Array
10pub fn concatenate_owned_unchecked(arrays: &[ArrayRef]) -> PolarsResult<ArrayRef> {
11    if arrays.is_empty() {
12        polars_bail!(InvalidOperation: "concat requires input of at least one array")
13    }
14    if arrays.len() == 1 {
15        return Ok(arrays[0].clone());
16    }
17    let mut arrays_ref = Vec::with_capacity(arrays.len());
18    let mut lengths = Vec::with_capacity(arrays.len());
19    let mut capacity = 0;
20    for array in arrays {
21        arrays_ref.push(&**array);
22        lengths.push(array.len());
23        capacity += array.len();
24    }
25
26    let mut mutable = make_growable(&arrays_ref, false, capacity);
27
28    for (i, len) in lengths.iter().enumerate() {
29        // SAFETY:
30        // len is within bounds
31        unsafe { mutable.extend(i, 0, *len) }
32    }
33
34    Ok(mutable.as_box())
35}