use arrow::array::{StringViewArray, StringViewBuilder};
use std::fmt::Write;
use tpchgen::dates::TPCHDate;
use tpchgen::decimal::TPCHDecimal;
#[inline(always)]
pub fn to_arrow_decimal(value: TPCHDecimal) -> i128 {
value.into_inner() as i128
}
#[inline(always)]
pub fn to_arrow_date32(value: TPCHDate) -> i32 {
value.to_unix_epoch()
}
pub fn decimal128_array_from_iter<I>(values: I) -> arrow::array::Decimal128Array
where
I: Iterator<Item = TPCHDecimal>,
{
let values = values.map(to_arrow_decimal);
arrow::array::Decimal128Array::from_iter_values(values)
.with_precision_and_scale(15, 2)
.unwrap()
}
pub fn string_view_array_from_display_iter<I>(values: I) -> StringViewArray
where
I: Iterator<Item: std::fmt::Display>,
{
let mut buffer = String::new();
let values = values.into_iter();
let size_hint = values.size_hint().0;
let mut builder = StringViewBuilder::with_capacity(size_hint);
for v in values {
buffer.clear();
write!(&mut buffer, "{v}").unwrap();
builder.append_value(&buffer);
}
builder.finish()
}
#[cfg(test)]
mod tests {
use super::*;
use tpchgen::dates::MIN_GENERATE_DATE;
#[test]
fn test_to_arrow_decimal() {
let value = TPCHDecimal::new(123456789);
assert_eq!(to_arrow_decimal(value), 123456789);
}
#[test]
fn test_to_arrow_date32() {
let value = TPCHDate::new(MIN_GENERATE_DATE);
assert_eq!(to_arrow_date32(value), 8035);
let value = TPCHDate::new(MIN_GENERATE_DATE + 100);
assert_eq!(to_arrow_date32(value), 8135);
let value = TPCHDate::new(MIN_GENERATE_DATE + 1234);
assert_eq!(to_arrow_date32(value), 9269);
}
}