vortex_vector/
datum.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_dtype::{NativeDecimalType, NativePType};
5
6use crate::binaryview::{BinaryViewScalar, BinaryViewType, BinaryViewVector};
7use crate::bool::{BoolScalar, BoolVector};
8use crate::decimal::{DScalar, DVector, DecimalScalar, DecimalVector};
9use crate::fixed_size_list::{FixedSizeListScalar, FixedSizeListVector};
10use crate::listview::{ListViewScalar, ListViewVector};
11use crate::null::{NullScalar, NullVector};
12use crate::primitive::{PScalar, PVector, PrimitiveScalar, PrimitiveVector};
13use crate::struct_::{StructScalar, StructVector};
14use crate::{Scalar, Vector};
15
16/// Represents either a scalar or vector value.
17pub enum Datum {
18    /// A scalar value.
19    Scalar(Scalar),
20    /// A vector value.
21    Vector(Vector),
22}
23
24impl Datum {
25    /// Converts the `Datum` into a `NullDatum`.
26    pub fn into_null(self) -> NullDatum {
27        match self {
28            Datum::Scalar(scalar) => NullDatum::Scalar(scalar.into_null()),
29            Datum::Vector(vector) => NullDatum::Vector(vector.into_null()),
30        }
31    }
32
33    /// Converts the `Datum` into a `BoolDatum`.
34    pub fn into_bool(self) -> BoolDatum {
35        match self {
36            Datum::Scalar(scalar) => BoolDatum::Scalar(scalar.into_bool()),
37            Datum::Vector(vector) => BoolDatum::Vector(vector.into_bool()),
38        }
39    }
40
41    /// Converts the `Datum` into a `PrimitiveDatum`.
42    pub fn into_primitive(self) -> PrimitiveDatum {
43        match self {
44            Datum::Scalar(scalar) => PrimitiveDatum::Scalar(scalar.into_primitive()),
45            Datum::Vector(vector) => PrimitiveDatum::Vector(vector.into_primitive()),
46        }
47    }
48
49    /// Converts the `Datum` into a `DecimalDatum`.
50    pub fn into_decimal(self) -> DecimalDatum {
51        match self {
52            Datum::Scalar(scalar) => DecimalDatum::Scalar(scalar.into_decimal()),
53            Datum::Vector(vector) => DecimalDatum::Vector(vector.into_decimal()),
54        }
55    }
56
57    /// Converts the `Datum` into a `ListViewDatum`.
58    pub fn into_list(self) -> ListViewDatum {
59        match self {
60            Datum::Scalar(scalar) => ListViewDatum::Scalar(scalar.into_list()),
61            Datum::Vector(vector) => ListViewDatum::Vector(vector.into_list()),
62        }
63    }
64
65    /// Converts the `Datum` into a `FixedSizeListDatum`.
66    pub fn into_fixed_size_list(self) -> FixedSizeListDatum {
67        match self {
68            Datum::Scalar(scalar) => FixedSizeListDatum::Scalar(scalar.into_fixed_size_list()),
69            Datum::Vector(vector) => FixedSizeListDatum::Vector(vector.into_fixed_size_list()),
70        }
71    }
72
73    /// Converts the `Datum` into a `StructDatum`.
74    pub fn into_struct(self) -> StructDatum {
75        match self {
76            Datum::Scalar(scalar) => StructDatum::Scalar(scalar.into_struct()),
77            Datum::Vector(vector) => StructDatum::Vector(vector.into_struct()),
78        }
79    }
80}
81
82macro_rules! datum {
83    // Non-generic version
84    ($Name:ident) => {
85        paste::paste! {
86            pub enum [<$Name Datum>] {
87                Scalar([<$Name Scalar>]),
88                Vector([<$Name Vector>]),
89            }
90
91            impl From<[<$Name Datum>]> for Datum {
92                fn from(val: [<$Name Datum>]) -> Self {
93                    match val {
94                        [<$Name Datum>]::Scalar(scalar) => Datum::Scalar(Scalar::from(scalar)),
95                        [<$Name Datum>]::Vector(vector) => Datum::Vector(Vector::from(vector)),
96                    }
97                }
98            }
99
100            impl From<[<$Name Scalar>]> for Datum {
101                fn from(val: [<$Name Scalar>]) -> Self {
102                    Datum::Scalar(Scalar::from(val))
103                }
104            }
105
106            impl From<[<$Name Scalar>]> for [<$Name Datum>] {
107                fn from(val: [<$Name Scalar>]) -> Self {
108                    [<$Name Datum>]::Scalar(val)
109                }
110            }
111
112            impl From<[<$Name Vector>]> for [<$Name Datum>] {
113                fn from(val: [<$Name Vector>]) -> Self {
114                    [<$Name Datum>]::Vector(val)
115                }
116            }
117        }
118    };
119
120    // Generic version with trait bound
121    ($Name:ident < $T:ident : $Bound:path >) => {
122        paste::paste! {
123            pub enum [<$Name Datum>]<$T: $Bound> {
124                Scalar([<$Name Scalar>]<$T>),
125                Vector([<$Name Vector>]<$T>),
126            }
127
128            impl<$T: $Bound> From<[<$Name Datum>]<$T>> for Datum {
129                fn from(val: [<$Name Datum>]<$T>) -> Self {
130                    match val {
131                        [<$Name Datum>]::Scalar(scalar) => Datum::Scalar(Scalar::from(scalar)),
132                        [<$Name Datum>]::Vector(vector) => Datum::Vector(Vector::from(vector)),
133                    }
134                }
135            }
136
137            impl<$T: $Bound> From<[<$Name Scalar>]<$T>> for Datum {
138                fn from(val: [<$Name Scalar>]<$T>) -> Self {
139                    Datum::Scalar(Scalar::from(val))
140                }
141            }
142
143            impl<$T: $Bound> From<[<$Name Scalar>]<$T>> for [<$Name Datum>]<$T> {
144                fn from(val: [<$Name Scalar>]<$T>) -> Self {
145                    [<$Name Datum>]::Scalar(val)
146                }
147            }
148
149            impl<$T: $Bound> From<[<$Name Vector>]<$T>> for [<$Name Datum>]<$T> {
150                fn from(val: [<$Name Vector>]<$T>) -> Self {
151                    [<$Name Datum>]::Vector(val)
152                }
153            }
154        }
155    };
156}
157
158datum!(Null);
159datum!(Bool);
160datum!(Primitive);
161datum!(P<T: NativePType>);
162datum!(Decimal);
163datum!(D<D: NativeDecimalType>);
164datum!(BinaryView<T: BinaryViewType>);
165datum!(ListView);
166datum!(FixedSizeList);
167datum!(Struct);