in crates/iceberg/src/transform/truncate.rs [71:151]
fn transform(&self, input: ArrayRef) -> crate::Result<ArrayRef> {
match input.data_type() {
DataType::Int32 => {
let width: i32 = self.width.try_into().map_err(|_| {
Error::new(
crate::ErrorKind::DataInvalid,
"width is failed to convert to i32 when truncate Int32Array",
)
})?;
let res: arrow_array::Int32Array = input
.as_any()
.downcast_ref::<arrow_array::Int32Array>()
.unwrap()
.unary(|v| Self::truncate_i32(v, width));
Ok(Arc::new(res))
}
DataType::Int64 => {
let width = self.width as i64;
let res: arrow_array::Int64Array = input
.as_any()
.downcast_ref::<arrow_array::Int64Array>()
.unwrap()
.unary(|v| Self::truncate_i64(v, width));
Ok(Arc::new(res))
}
DataType::Decimal128(precision, scale) => {
let width = self.width as i128;
let res: arrow_array::Decimal128Array = input
.as_any()
.downcast_ref::<arrow_array::Decimal128Array>()
.unwrap()
.unary(|v| Self::truncate_decimal_i128(v, width))
.with_precision_and_scale(*precision, *scale)
.map_err(|err| Error::new(crate::ErrorKind::Unexpected, format!("{err}")))?;
Ok(Arc::new(res))
}
DataType::Utf8 => {
let len = self.width as usize;
let res: arrow_array::StringArray = arrow_array::StringArray::from_iter(
input
.as_any()
.downcast_ref::<arrow_array::StringArray>()
.unwrap()
.iter()
.map(|v| v.map(|v| Self::truncate_str(v, len))),
);
Ok(Arc::new(res))
}
DataType::LargeUtf8 => {
let len = self.width as usize;
let res: arrow_array::LargeStringArray = arrow_array::LargeStringArray::from_iter(
input
.as_any()
.downcast_ref::<arrow_array::LargeStringArray>()
.unwrap()
.iter()
.map(|v| v.map(|v| Self::truncate_str(v, len))),
);
Ok(Arc::new(res))
}
DataType::Binary => {
let len = self.width as usize;
let res: arrow_array::BinaryArray = arrow_array::BinaryArray::from_iter(
input
.as_any()
.downcast_ref::<arrow_array::BinaryArray>()
.unwrap()
.iter()
.map(|v| v.map(|v| Self::truncate_binary(v, len))),
);
Ok(Arc::new(res))
}
_ => Err(crate::Error::new(
crate::ErrorKind::FeatureUnsupported,
format!(
"Unsupported data type for truncate transform: {:?}",
input.data_type()
),
)),
}
}