sample_arrow2/
datatypes.rs1use arrow2::datatypes::{DataType, Field};
4use sample_std::{sampler_choice, Always, Random, Sample, VecSampler};
5
6pub type DataTypeSampler = Box<dyn Sample<Output = DataType> + Send + Sync>;
7
8struct FieldSampler<N, V> {
9 names: N,
10 nullable: V,
11 inner: DataTypeSampler,
12}
13
14impl<N, V> Sample for FieldSampler<N, V>
15where
16 N: Sample<Output = String>,
17 V: Sample<Output = bool>,
18{
19 type Output = Field;
20
21 fn generate(&mut self, g: &mut Random) -> Self::Output {
22 Field::new(
23 self.names.generate(g),
24 self.inner.generate(g),
25 self.nullable.generate(g),
26 )
27 }
28}
29
30struct StructDataTypeSampler<S, F> {
31 size: S,
32 field: F,
33}
34
35impl<S, F> Sample for StructDataTypeSampler<S, F>
36where
37 S: Sample<Output = usize>,
38 F: Sample<Output = Field>,
39{
40 type Output = DataType;
41
42 fn generate(&mut self, g: &mut Random) -> Self::Output {
43 let size = self.size.generate(g);
44 DataType::Struct((0..size).map(|_| self.field.generate(g)).collect())
45 }
46}
47
48pub fn sample_flat() -> DataTypeSampler {
49 Box::new(sampler_choice([
50 Always(DataType::Float32),
51 Always(DataType::Float64),
52 Always(DataType::Int8),
53 Always(DataType::Int16),
54 Always(DataType::Int32),
55 Always(DataType::Int64),
56 Always(DataType::UInt8),
57 Always(DataType::UInt16),
58 Always(DataType::UInt32),
59 Always(DataType::UInt64),
60 ]))
61}
62
63pub struct ArbitraryDataType<N, V, B, F> {
64 pub names: N,
65 pub nullable: V,
66 pub struct_branch: B,
67 pub flat: F,
68}
69
70impl<N, V, B, F> ArbitraryDataType<N, V, B, F>
71where
72 N: Sample<Output = String> + Clone + Send + Sync + 'static,
73 V: Sample<Output = bool> + Clone + Send + Sync + 'static,
74 B: Sample<Output = usize> + Clone + Send + Sync + 'static,
75 F: Fn() -> DataTypeSampler,
76{
77 pub fn sample_nested<IF>(&self, inner: IF) -> DataTypeSampler
78 where
79 IF: Fn() -> DataTypeSampler,
80 {
81 let field = || FieldSampler {
82 names: self.names.clone(),
83 nullable: self.nullable.clone(),
84 inner: inner(),
85 };
86
87 Box::new(sampler_choice([
88 Box::new((self.flat)()) as DataTypeSampler,
89 Box::new(
90 VecSampler {
91 length: self.struct_branch.clone(),
92 el: field(),
93 }
94 .try_convert(DataType::Struct, |_| None),
95 ),
96 Box::new(field().try_convert(|f| DataType::List(Box::new(f)), |_| None)),
97 ]))
98 }
99
100 pub fn sample_depth(&self, depth: usize) -> DataTypeSampler {
101 let flats = (self.flat)();
102 if depth == 0 {
103 flats
104 } else {
105 let inner = || self.sample_depth(depth - 1);
106 Box::new(sampler_choice([self.sample_nested(inner), flats]))
107 }
108 }
109}