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)]
18pub fn to_arrow_date32(value: TPCHDate) -> i32 {
19 value.into_inner() + TPCHDATE_TO_DATE32_OFFSET
20}
21
22pub fn decimal128_array_from_iter<I>(values: I) -> arrow::array::Decimal128Array
24where
25 I: Iterator<Item = TPCHDecimal>,
26{
27 let values = values.map(to_arrow_decimal);
28 arrow::array::Decimal128Array::from_iter_values(values)
29 .with_precision_and_scale(15, 2)
30 .unwrap()
32}
33
34pub fn string_view_array_from_display_iter<I>(values: I) -> StringViewArray
38where
39 I: Iterator<Item: std::fmt::Display>,
40{
41 let mut buffer = String::new();
42 let values = values.into_iter();
43 let size_hint = values.size_hint().0;
44 let mut builder = StringViewBuilder::with_capacity(size_hint);
45 for v in values {
46 buffer.clear();
47 write!(&mut buffer, "{v}").unwrap();
48 builder.append_value(&buffer);
49 }
50 builder.finish()
51}
52
53pub const TPCHDATE_TO_DATE32_OFFSET: i32 = 8035;
70
71#[cfg(test)]
73mod tests {
74 use super::*;
75 use tpchgen::dates::MIN_GENERATE_DATE;
76
77 #[test]
78 fn test_to_arrow_decimal() {
79 let value = TPCHDecimal::new(123456789);
80 assert_eq!(to_arrow_decimal(value), 123456789);
81 }
82
83 #[test]
84 fn test_to_arrow_date32() {
85 let value = TPCHDate::new(MIN_GENERATE_DATE);
86 assert_eq!(to_arrow_date32(value), 8035);
87
88 let value = TPCHDate::new(MIN_GENERATE_DATE + 100);
89 assert_eq!(to_arrow_date32(value), 8135);
90
91 let value = TPCHDate::new(MIN_GENERATE_DATE + 1234);
92 assert_eq!(to_arrow_date32(value), 9269);
93 }
94}