tpchgen_arrow/
conversions.rs1use arrow::array::{StringViewArray, StringViewBuilder};
4use std::fmt::Write;
5use tpchgen::dates::TPCHDate;
6use tpchgen::decimal::TPCHDecimal;
7
8#[inline(always)]
10pub fn to_arrow_decimal(value: TPCHDecimal) -> i128 {
11 value.into_inner() as i128
14}
15
16#[inline(always)]
32pub fn to_arrow_date32(value: TPCHDate) -> i32 {
33 value.to_unix_epoch()
34}
35
36pub fn decimal128_array_from_iter<I>(values: I) -> arrow::array::Decimal128Array
38where
39 I: Iterator<Item = TPCHDecimal>,
40{
41 let values = values.map(to_arrow_decimal);
42 arrow::array::Decimal128Array::from_iter_values(values)
43 .with_precision_and_scale(15, 2)
44 .unwrap()
46}
47
48pub fn string_view_array_from_display_iter<I>(values: I) -> StringViewArray
52where
53 I: Iterator<Item: std::fmt::Display>,
54{
55 let mut buffer = String::new();
56 let values = values.into_iter();
57 let size_hint = values.size_hint().0;
58 let mut builder = StringViewBuilder::with_capacity(size_hint);
59 for v in values {
60 buffer.clear();
61 write!(&mut buffer, "{v}").unwrap();
62 builder.append_value(&buffer);
63 }
64 builder.finish()
65}
66
67#[cfg(test)]
69mod tests {
70 use super::*;
71 use tpchgen::dates::MIN_GENERATE_DATE;
72
73 #[test]
74 fn test_to_arrow_decimal() {
75 let value = TPCHDecimal::new(123456789);
76 assert_eq!(to_arrow_decimal(value), 123456789);
77 }
78
79 #[test]
80 fn test_to_arrow_date32() {
81 let value = TPCHDate::new(MIN_GENERATE_DATE);
82 assert_eq!(to_arrow_date32(value), 8035);
83
84 let value = TPCHDate::new(MIN_GENERATE_DATE + 100);
85 assert_eq!(to_arrow_date32(value), 8135);
86
87 let value = TPCHDate::new(MIN_GENERATE_DATE + 1234);
88 assert_eq!(to_arrow_date32(value), 9269);
89 }
90}