Fast path for `array_has_any` when exactly one argument is a scalar.
(
columnar_arg: &ColumnarValue,
scalar_arg: &ScalarValue,
)
| 565 | |
| 566 | /// Fast path for `array_has_any` when exactly one argument is a scalar. |
| 567 | fn array_has_any_with_scalar( |
| 568 | columnar_arg: &ColumnarValue, |
| 569 | scalar_arg: &ScalarValue, |
| 570 | ) -> Result<ColumnarValue> { |
| 571 | if scalar_arg.is_null() { |
| 572 | return Ok(ColumnarValue::Scalar(ScalarValue::Boolean(None))); |
| 573 | } |
| 574 | |
| 575 | // Convert the scalar to a 1-element ListArray, then extract the inner values |
| 576 | let scalar_array = scalar_arg.to_array_of_size(1)?; |
| 577 | let scalar_list: ArrayWrapper = scalar_array.as_ref().try_into()?; |
| 578 | let offsets: Vec<usize> = scalar_list.offsets().collect(); |
| 579 | let scalar_values = scalar_list |
| 580 | .values() |
| 581 | .slice(offsets[0], offsets[1] - offsets[0]); |
| 582 | |
| 583 | // If scalar list is empty, result is always false |
| 584 | if scalar_values.is_empty() { |
| 585 | return Ok(ColumnarValue::Scalar(ScalarValue::Boolean(Some(false)))); |
| 586 | } |
| 587 | |
| 588 | match scalar_values.data_type() { |
| 589 | DataType::Utf8 | DataType::LargeUtf8 | DataType::Utf8View => { |
| 590 | array_has_any_with_scalar_string(columnar_arg, &scalar_values) |
| 591 | } |
| 592 | _ => array_has_any_with_scalar_general(columnar_arg, &scalar_values), |
| 593 | } |
| 594 | } |
| 595 | |
| 596 | /// When the scalar argument has more elements than this, the scalar fast path |
| 597 | /// builds a HashSet for O(1) lookups. At or below this threshold, it falls |
no test coverage detected
searching dependent graphs…