Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-compute/src/if_then_else/array.rs
6939 views
1
use arrow::array::builder::{ShareStrategy, StaticArrayBuilder, make_builder};
2
use arrow::array::{Array, ArrayCollectIterExt, FixedSizeListArray, FixedSizeListArrayBuilder};
3
use arrow::bitmap::Bitmap;
4
5
use super::{IfThenElseKernel, if_then_else_extend};
6
7
impl IfThenElseKernel for FixedSizeListArray {
8
type Scalar<'a> = Box<dyn Array>;
9
10
fn if_then_else(mask: &Bitmap, if_true: &Self, if_false: &Self) -> Self {
11
let inner_dt = if_true.dtype().inner_dtype().unwrap();
12
let mut builder =
13
FixedSizeListArrayBuilder::new(if_true.dtype().clone(), make_builder(inner_dt));
14
builder.reserve(mask.len());
15
if_then_else_extend(
16
&mut builder,
17
mask,
18
|b, off, len| b.subslice_extend(if_true, off, len, ShareStrategy::Always),
19
|b, off, len| b.subslice_extend(if_false, off, len, ShareStrategy::Always),
20
);
21
builder.freeze()
22
}
23
24
fn if_then_else_broadcast_true(
25
mask: &Bitmap,
26
if_true: Self::Scalar<'_>,
27
if_false: &Self,
28
) -> Self {
29
let if_true_list: FixedSizeListArray =
30
std::iter::once(if_true).collect_arr_trusted_with_dtype(if_false.dtype().clone());
31
let inner_dt = if_false.dtype().inner_dtype().unwrap();
32
let mut builder =
33
FixedSizeListArrayBuilder::new(if_false.dtype().clone(), make_builder(inner_dt));
34
builder.reserve(mask.len());
35
if_then_else_extend(
36
&mut builder,
37
mask,
38
|b, _, len| b.subslice_extend_repeated(&if_true_list, 0, 1, len, ShareStrategy::Always),
39
|b, off, len| b.subslice_extend(if_false, off, len, ShareStrategy::Always),
40
);
41
builder.freeze()
42
}
43
44
fn if_then_else_broadcast_false(
45
mask: &Bitmap,
46
if_true: &Self,
47
if_false: Self::Scalar<'_>,
48
) -> Self {
49
let if_false_list: FixedSizeListArray =
50
std::iter::once(if_false).collect_arr_trusted_with_dtype(if_true.dtype().clone());
51
let inner_dt = if_true.dtype().inner_dtype().unwrap();
52
let mut builder =
53
FixedSizeListArrayBuilder::new(if_true.dtype().clone(), make_builder(inner_dt));
54
builder.reserve(mask.len());
55
if_then_else_extend(
56
&mut builder,
57
mask,
58
|b, off, len| b.subslice_extend(if_true, off, len, ShareStrategy::Always),
59
|b, _, len| {
60
b.subslice_extend_repeated(&if_false_list, 0, 1, len, ShareStrategy::Always)
61
},
62
);
63
builder.freeze()
64
}
65
66
fn if_then_else_broadcast_both(
67
dtype: arrow::datatypes::ArrowDataType,
68
mask: &Bitmap,
69
if_true: Self::Scalar<'_>,
70
if_false: Self::Scalar<'_>,
71
) -> Self {
72
let if_true_list: FixedSizeListArray =
73
std::iter::once(if_true).collect_arr_trusted_with_dtype(dtype.clone());
74
let if_false_list: FixedSizeListArray =
75
std::iter::once(if_false).collect_arr_trusted_with_dtype(dtype.clone());
76
let inner_dt = dtype.inner_dtype().unwrap();
77
let mut builder = FixedSizeListArrayBuilder::new(dtype.clone(), make_builder(inner_dt));
78
builder.reserve(mask.len());
79
if_then_else_extend(
80
&mut builder,
81
mask,
82
|b, _, len| b.subslice_extend_repeated(&if_true_list, 0, 1, len, ShareStrategy::Always),
83
|b, _, len| {
84
b.subslice_extend_repeated(&if_false_list, 0, 1, len, ShareStrategy::Always)
85
},
86
);
87
builder.freeze()
88
}
89
}
90
91