simd_kernels/kernels/arithmetic/
string_ops.rs1use crate::enums::error::KernelError;
18use crate::traits::type_unions::Integer;
19use crate::{MaskedArray, StringArray, Vec64};
20use num_traits::NumCast;
21
22pub fn apply_str_str<T: Integer>(
24 lhs: &std::sync::Arc<StringArray<T>>,
25 rhs: &std::sync::Arc<StringArray<T>>,
26) -> Result<StringArray<T>, KernelError> {
27 if lhs.len() != rhs.len() {
28 return Err(KernelError::LengthMismatch(format!(
29 "String concatenation length mismatch: {} vs {}",
30 lhs.len(),
31 rhs.len()
32 )));
33 }
34
35 let mut result_data = Vec64::new();
36 let mut result_offsets = Vec64::with_capacity(lhs.len() + 1);
37 result_offsets.push(NumCast::from(0).unwrap());
38
39 let mut current_offset = NumCast::from(0).unwrap();
40
41 for i in 0..lhs.len() {
42 let left_str = lhs.get_str(i).unwrap_or("");
44 let right_str = rhs.get_str(i).unwrap_or("");
45
46 let concatenated = format!("{}{}", left_str, right_str);
48 let bytes = concatenated.as_bytes();
49
50 result_data.extend_from_slice(bytes);
52 current_offset = current_offset + NumCast::from(bytes.len()).unwrap();
53 result_offsets.push(current_offset);
54 }
55
56 Ok(StringArray {
57 data: result_data.into(),
58 offsets: result_offsets.into(),
59 null_mask: None, })
61}