`arrow-rs` style implementation of `regexp_count` function. This function `regexp_count` is responsible for counting the occurrences of a regular expression pattern within a string array. It supports optional start positions and flags for case insensitivity. The function accepts a variable number of arguments: - `values`: The array of strings to search within. - `regex_array`: The array of regula
(
values: &dyn Array,
regex_array: &dyn Datum,
start_array: Option<&dyn Datum>,
flags_array: Option<&dyn Datum>,
)
| 179 | /// # Errors |
| 180 | /// Returns an error if the input arrays have mismatched lengths or if the regular expression fails to compile. |
| 181 | fn regexp_count( |
| 182 | values: &dyn Array, |
| 183 | regex_array: &dyn Datum, |
| 184 | start_array: Option<&dyn Datum>, |
| 185 | flags_array: Option<&dyn Datum>, |
| 186 | ) -> Result<ArrayRef, ArrowError> { |
| 187 | let (regex_array, is_regex_scalar) = regex_array.get(); |
| 188 | let (start_array, is_start_scalar) = start_array.map_or((None, true), |start| { |
| 189 | let (start, is_start_scalar) = start.get(); |
| 190 | (Some(start), is_start_scalar) |
| 191 | }); |
| 192 | let (flags_array, is_flags_scalar) = flags_array.map_or((None, true), |flags| { |
| 193 | let (flags, is_flags_scalar) = flags.get(); |
| 194 | (Some(flags), is_flags_scalar) |
| 195 | }); |
| 196 | |
| 197 | match (values.data_type(), regex_array.data_type(), flags_array) { |
| 198 | (Utf8, Utf8, None) => regexp_count_inner( |
| 199 | &values.as_string::<i32>(), |
| 200 | ®ex_array.as_string::<i32>(), |
| 201 | is_regex_scalar, |
| 202 | start_array.map(|start| start.as_primitive::<Int64Type>()), |
| 203 | is_start_scalar, |
| 204 | None, |
| 205 | is_flags_scalar, |
| 206 | ), |
| 207 | (Utf8, Utf8, Some(flags_array)) if *flags_array.data_type() == Utf8 => regexp_count_inner( |
| 208 | &values.as_string::<i32>(), |
| 209 | ®ex_array.as_string::<i32>(), |
| 210 | is_regex_scalar, |
| 211 | start_array.map(|start| start.as_primitive::<Int64Type>()), |
| 212 | is_start_scalar, |
| 213 | Some(&flags_array.as_string::<i32>()), |
| 214 | is_flags_scalar, |
| 215 | ), |
| 216 | (LargeUtf8, LargeUtf8, None) => regexp_count_inner( |
| 217 | &values.as_string::<i64>(), |
| 218 | ®ex_array.as_string::<i64>(), |
| 219 | is_regex_scalar, |
| 220 | start_array.map(|start| start.as_primitive::<Int64Type>()), |
| 221 | is_start_scalar, |
| 222 | None, |
| 223 | is_flags_scalar, |
| 224 | ), |
| 225 | (LargeUtf8, LargeUtf8, Some(flags_array)) if *flags_array.data_type() == LargeUtf8 => regexp_count_inner( |
| 226 | &values.as_string::<i64>(), |
| 227 | ®ex_array.as_string::<i64>(), |
| 228 | is_regex_scalar, |
| 229 | start_array.map(|start| start.as_primitive::<Int64Type>()), |
| 230 | is_start_scalar, |
| 231 | Some(&flags_array.as_string::<i64>()), |
| 232 | is_flags_scalar, |
| 233 | ), |
| 234 | (Utf8View, Utf8View, None) => regexp_count_inner( |
| 235 | &values.as_string_view(), |
| 236 | ®ex_array.as_string_view(), |
| 237 | is_regex_scalar, |
| 238 | start_array.map(|start| start.as_primitive::<Int64Type>()), |
no test coverage detected
searching dependent graphs…