MCPcopy Create free account
hub / github.com/apache/arrow-rs / binary_apply

Function binary_apply

arrow-string/src/binary_like.rs:59–107  ·  view source on GitHub ↗
(
    op: Op,
    l: T,
    l_s: bool,
    l_v: Option<&'a dyn AnyDictionaryArray>,
    r: T,
    r_s: bool,
    r_v: Option<&'a dyn AnyDictionaryArray>,
)

Source from the content-addressed store, hash-verified

57}
58
59pub(crate) fn binary_apply<'a, 'i, T: BinaryArrayType<'a> + 'a>(
60 op: Op,
61 l: T,
62 l_s: bool,
63 l_v: Option<&'a dyn AnyDictionaryArray>,
64 r: T,
65 r_s: bool,
66 r_v: Option<&'a dyn AnyDictionaryArray>,
67) -> Result<BooleanArray, ArrowError> {
68 let l_len = l_v.map(|l| l.len()).unwrap_or(l.len());
69 if r_s {
70 let idx = match r_v {
71 Some(dict) if dict.null_count() != 0 => return Ok(BooleanArray::new_null(l_len)),
72 Some(dict) => dict.normalized_keys()[0],
73 None => 0,
74 };
75 if r.is_null(idx) {
76 return Ok(BooleanArray::new_null(l_len));
77 }
78 op_scalar::<T>(op, l, l_v, r.value(idx))
79 } else {
80 match (l_s, l_v, r_v) {
81 (true, None, None) => {
82 let v = l.is_valid(0).then(|| l.value(0));
83 op_binary(op, std::iter::repeat(v), r.iter())
84 }
85 (true, Some(l_v), None) => {
86 let idx = l_v.is_valid(0).then(|| l_v.normalized_keys()[0]);
87 let v = idx.and_then(|idx| l.is_valid(idx).then(|| l.value(idx)));
88 op_binary(op, std::iter::repeat(v), r.iter())
89 }
90 (true, None, Some(r_v)) => {
91 let v = l.is_valid(0).then(|| l.value(0));
92 op_binary(op, std::iter::repeat(v), vectored_iter(r, r_v))
93 }
94 (true, Some(l_v), Some(r_v)) => {
95 let idx = l_v.is_valid(0).then(|| l_v.normalized_keys()[0]);
96 let v = idx.and_then(|idx| l.is_valid(idx).then(|| l.value(idx)));
97 op_binary(op, std::iter::repeat(v), vectored_iter(r, r_v))
98 }
99 (false, None, None) => op_binary(op, l.iter(), r.iter()),
100 (false, Some(l_v), None) => op_binary(op, vectored_iter(l, l_v), r.iter()),
101 (false, None, Some(r_v)) => op_binary(op, l.iter(), vectored_iter(r, r_v)),
102 (false, Some(l_v), Some(r_v)) => {
103 op_binary(op, vectored_iter(l, l_v), vectored_iter(r, r_v))
104 }
105 }
106 }
107}
108
109#[inline(never)]
110fn op_scalar<'a, T: BinaryArrayType<'a>>(

Callers

nothing calls this directly

Calls 10

normalized_keysMethod · 0.80
and_thenMethod · 0.80
op_binaryFunction · 0.70
vectored_iterFunction · 0.70
lenMethod · 0.45
null_countMethod · 0.45
is_nullMethod · 0.45
valueMethod · 0.45
is_validMethod · 0.45
iterMethod · 0.45

Tested by

no test coverage detected