1use arrow_array::{ArrayRef, new_null_array};
19
20use super::TransformFunction;
21use crate::Result;
22
23#[derive(Debug)]
24pub struct Void {}
25
26impl TransformFunction for Void {
27 fn transform(&self, input: ArrayRef) -> Result<ArrayRef> {
28 Ok(new_null_array(input.data_type(), input.len()))
29 }
30
31 fn transform_literal(&self, _input: &crate::spec::Datum) -> Result<Option<crate::spec::Datum>> {
32 Ok(None)
33 }
34}
35
36#[cfg(test)]
37mod test {
38 use crate::spec::PrimitiveType::{
39 Binary, Date, Decimal, Fixed, Int, Long, String as StringType, Time, Timestamp,
40 TimestampNs, Timestamptz, TimestamptzNs, Uuid,
41 };
42 use crate::spec::Type::{Primitive, Struct};
43 use crate::spec::{NestedField, StructType, Transform};
44 use crate::transform::test::TestTransformFixture;
45
46 #[test]
47 fn test_void_transform() {
48 let trans = Transform::Void;
49
50 let fixture = TestTransformFixture {
51 display: "void".to_string(),
52 json: r#""void""#.to_string(),
53 dedup_name: "void".to_string(),
54 preserves_order: false,
55 satisfies_order_of: vec![
56 (Transform::Year, false),
57 (Transform::Month, false),
58 (Transform::Day, false),
59 (Transform::Hour, false),
60 (Transform::Void, true),
61 (Transform::Identity, false),
62 ],
63 trans_types: vec![
64 (Primitive(Binary), Some(Primitive(Binary))),
65 (Primitive(Date), Some(Primitive(Date))),
66 (
67 Primitive(Decimal {
68 precision: 8,
69 scale: 5,
70 }),
71 Some(Primitive(Decimal {
72 precision: 8,
73 scale: 5,
74 })),
75 ),
76 (Primitive(Fixed(8)), Some(Primitive(Fixed(8)))),
77 (Primitive(Int), Some(Primitive(Int))),
78 (Primitive(Long), Some(Primitive(Long))),
79 (Primitive(StringType), Some(Primitive(StringType))),
80 (Primitive(Uuid), Some(Primitive(Uuid))),
81 (Primitive(Time), Some(Primitive(Time))),
82 (Primitive(Timestamp), Some(Primitive(Timestamp))),
83 (Primitive(Timestamptz), Some(Primitive(Timestamptz))),
84 (Primitive(TimestampNs), Some(Primitive(TimestampNs))),
85 (Primitive(TimestamptzNs), Some(Primitive(TimestamptzNs))),
86 (
87 Struct(StructType::new(vec![
88 NestedField::optional(1, "a", Primitive(Timestamp)).into(),
89 ])),
90 Some(Struct(StructType::new(vec![
91 NestedField::optional(1, "a", Primitive(Timestamp)).into(),
92 ]))),
93 ),
94 ],
95 };
96
97 fixture.assert_transform(trans);
98 }
99
100 #[test]
101 fn test_known_transform() {
102 let trans = Transform::Unknown;
103
104 let fixture = TestTransformFixture {
105 display: "unknown".to_string(),
106 json: r#""unknown""#.to_string(),
107 dedup_name: "unknown".to_string(),
108 preserves_order: false,
109 satisfies_order_of: vec![
110 (Transform::Year, false),
111 (Transform::Month, false),
112 (Transform::Day, false),
113 (Transform::Hour, false),
114 (Transform::Void, false),
115 (Transform::Identity, false),
116 (Transform::Unknown, true),
117 ],
118 trans_types: vec![
119 (Primitive(Binary), Some(Primitive(StringType))),
120 (Primitive(Date), Some(Primitive(StringType))),
121 (
122 Primitive(Decimal {
123 precision: 8,
124 scale: 5,
125 }),
126 Some(Primitive(StringType)),
127 ),
128 (Primitive(Fixed(8)), Some(Primitive(StringType))),
129 (Primitive(Int), Some(Primitive(StringType))),
130 (Primitive(Long), Some(Primitive(StringType))),
131 (Primitive(StringType), Some(Primitive(StringType))),
132 (Primitive(Uuid), Some(Primitive(StringType))),
133 (Primitive(Time), Some(Primitive(StringType))),
134 (Primitive(Timestamp), Some(Primitive(StringType))),
135 (Primitive(Timestamptz), Some(Primitive(StringType))),
136 (
137 Struct(StructType::new(vec![
138 NestedField::optional(1, "a", Primitive(Timestamp)).into(),
139 ])),
140 Some(Primitive(StringType)),
141 ),
142 ],
143 };
144
145 fixture.assert_transform(trans);
146 }
147}