(
op: Op,
l: T,
l_s: bool,
l_v: Option<&'a dyn AnyDictionaryArray>,
r: T,
r_s: bool,
r_v: Option<&'a dyn AnyDictionaryArray>,
)
| 57 | } |
| 58 | |
| 59 | pub(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)] |
| 110 | fn op_scalar<'a, T: BinaryArrayType<'a>>( |
nothing calls this directly
no test coverage detected