iceberg/transform/
void.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18use 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}