(
op: Op,
l: T,
l_s: bool,
l_v: Option<&'a dyn AnyDictionaryArray>,
r: T,
r_s: bool,
r_v: Option<&'a dyn AnyDictionaryArray>,
)
| 296 | } |
| 297 | |
| 298 | fn string_apply<'a, T: StringArrayType<'a> + 'a>( |
| 299 | op: Op, |
| 300 | l: T, |
| 301 | l_s: bool, |
| 302 | l_v: Option<&'a dyn AnyDictionaryArray>, |
| 303 | r: T, |
| 304 | r_s: bool, |
| 305 | r_v: Option<&'a dyn AnyDictionaryArray>, |
| 306 | ) -> Result<BooleanArray, ArrowError> { |
| 307 | let l_len = l_v.map(|l| l.len()).unwrap_or(l.len()); |
| 308 | if r_s { |
| 309 | let idx = match r_v { |
| 310 | Some(dict) if dict.null_count() != 0 => return Ok(BooleanArray::new_null(l_len)), |
| 311 | Some(dict) => dict.normalized_keys()[0], |
| 312 | None => 0, |
| 313 | }; |
| 314 | if r.is_null(idx) { |
| 315 | return Ok(BooleanArray::new_null(l_len)); |
| 316 | } |
| 317 | op_scalar::<T>(op, l, l_v, r.value(idx)) |
| 318 | } else { |
| 319 | match (l_s, l_v, r_v) { |
| 320 | (true, None, None) => { |
| 321 | let v = l.is_valid(0).then(|| l.value(0)); |
| 322 | op_binary(op, std::iter::repeat(v), r.iter()) |
| 323 | } |
| 324 | (true, Some(l_v), None) => { |
| 325 | let idx = l_v.is_valid(0).then(|| l_v.normalized_keys()[0]); |
| 326 | let v = idx.and_then(|idx| l.is_valid(idx).then(|| l.value(idx))); |
| 327 | op_binary(op, std::iter::repeat(v), r.iter()) |
| 328 | } |
| 329 | (true, None, Some(r_v)) => { |
| 330 | let v = l.is_valid(0).then(|| l.value(0)); |
| 331 | op_binary(op, std::iter::repeat(v), vectored_iter(r, r_v)) |
| 332 | } |
| 333 | (true, Some(l_v), Some(r_v)) => { |
| 334 | let idx = l_v.is_valid(0).then(|| l_v.normalized_keys()[0]); |
| 335 | let v = idx.and_then(|idx| l.is_valid(idx).then(|| l.value(idx))); |
| 336 | op_binary(op, std::iter::repeat(v), vectored_iter(r, r_v)) |
| 337 | } |
| 338 | (false, None, None) => op_binary(op, l.iter(), r.iter()), |
| 339 | (false, Some(l_v), None) => op_binary(op, vectored_iter(l, l_v), r.iter()), |
| 340 | (false, None, Some(r_v)) => op_binary(op, l.iter(), vectored_iter(r, r_v)), |
| 341 | (false, Some(l_v), Some(r_v)) => { |
| 342 | op_binary(op, vectored_iter(l, l_v), vectored_iter(r, r_v)) |
| 343 | } |
| 344 | } |
| 345 | } |
| 346 | } |
| 347 | |
| 348 | #[inline(never)] |
| 349 | fn op_scalar<'a, T: StringArrayType<'a>>( |
nothing calls this directly
no test coverage detected