Returns the elementwise concatenation of [`Array`]s. # Errors This function errors if the arrays are of different types.
(left: &dyn Array, right: &dyn Array)
| 309 | /// |
| 310 | /// This function errors if the arrays are of different types. |
| 311 | pub fn concat_elements_dyn(left: &dyn Array, right: &dyn Array) -> Result<ArrayRef, ArrowError> { |
| 312 | if left.data_type() != right.data_type() { |
| 313 | return Err(ArrowError::ComputeError(format!( |
| 314 | "Cannot concat arrays of different types: {} != {}", |
| 315 | left.data_type(), |
| 316 | right.data_type() |
| 317 | ))); |
| 318 | } |
| 319 | match (left.data_type(), right.data_type()) { |
| 320 | (DataType::Utf8, DataType::Utf8) => { |
| 321 | let left = left.as_any().downcast_ref::<StringArray>().unwrap(); |
| 322 | let right = right.as_any().downcast_ref::<StringArray>().unwrap(); |
| 323 | Ok(Arc::new(concat_elements_utf8(left, right)?)) |
| 324 | } |
| 325 | (DataType::LargeUtf8, DataType::LargeUtf8) => { |
| 326 | let left = left.as_any().downcast_ref::<LargeStringArray>().unwrap(); |
| 327 | let right = right.as_any().downcast_ref::<LargeStringArray>().unwrap(); |
| 328 | Ok(Arc::new(concat_elements_utf8(left, right)?)) |
| 329 | } |
| 330 | (DataType::Binary, DataType::Binary) => { |
| 331 | let left = left.as_any().downcast_ref::<BinaryArray>().unwrap(); |
| 332 | let right = right.as_any().downcast_ref::<BinaryArray>().unwrap(); |
| 333 | Ok(Arc::new(concat_element_binary(left, right)?)) |
| 334 | } |
| 335 | (DataType::LargeBinary, DataType::LargeBinary) => { |
| 336 | let left = left.as_any().downcast_ref::<LargeBinaryArray>().unwrap(); |
| 337 | let right = right.as_any().downcast_ref::<LargeBinaryArray>().unwrap(); |
| 338 | Ok(Arc::new(concat_element_binary(left, right)?)) |
| 339 | } |
| 340 | (DataType::BinaryView, DataType::BinaryView) => { |
| 341 | let left = left.as_any().downcast_ref::<BinaryViewArray>().unwrap(); |
| 342 | let right = right.as_any().downcast_ref::<BinaryViewArray>().unwrap(); |
| 343 | Ok(Arc::new(concat_elements_binary_view_array(left, right)?)) |
| 344 | } |
| 345 | (DataType::Utf8View, DataType::Utf8View) => { |
| 346 | let left = left.as_any().downcast_ref::<StringViewArray>().unwrap(); |
| 347 | let right = right.as_any().downcast_ref::<StringViewArray>().unwrap(); |
| 348 | Ok(Arc::new(concat_elements_string_view_array(left, right)?)) |
| 349 | } |
| 350 | (DataType::FixedSizeBinary(_), DataType::FixedSizeBinary(_)) => { |
| 351 | let left = left |
| 352 | .as_any() |
| 353 | .downcast_ref::<FixedSizeBinaryArray>() |
| 354 | .unwrap(); |
| 355 | let right = right |
| 356 | .as_any() |
| 357 | .downcast_ref::<FixedSizeBinaryArray>() |
| 358 | .unwrap(); |
| 359 | Ok(Arc::new(concat_elements_fixed_size_binary(left, right)?)) |
| 360 | } |
| 361 | // unimplemented |
| 362 | _ => Err(ArrowError::NotYetImplemented(format!( |
| 363 | "concat not supported for {}", |
| 364 | left.data_type() |
| 365 | ))), |
| 366 | } |
| 367 | } |
| 368 |