use arrow::{
array::{AsArray, Int64Builder},
datatypes::Decimal128Type,
};
use datafusion::common::{internal_err, Result as DataFusionResult, ScalarValue};
use datafusion::physical_plan::ColumnarValue;
use std::sync::Arc;
pub fn spark_unscaled_value(args: &[ColumnarValue]) -> DataFusionResult<ColumnarValue> {
match &args[0] {
ColumnarValue::Scalar(v) => match v {
ScalarValue::Decimal128(d, _, _) => Ok(ColumnarValue::Scalar(ScalarValue::Int64(
d.map(|n| n as i64),
))),
dt => internal_err!("Expected Decimal128 but found {dt:}"),
},
ColumnarValue::Array(a) => {
let arr = a.as_primitive::<Decimal128Type>();
let mut result = Int64Builder::new();
for v in arr.into_iter() {
result.append_option(v.map(|v| v as i64));
}
Ok(ColumnarValue::Array(Arc::new(result.finish())))
}
}
}