Skip to content

Commit 0bf4070

Browse files
committed
Add datums
Signed-off-by: Nicholas Gates <[email protected]>
1 parent 413587f commit 0bf4070

File tree

17 files changed

+331
-27
lines changed

17 files changed

+331
-27
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vortex-dtype/src/decimal/precision.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::{DecimalDType, NativeDecimalType};
1212

1313
/// A struct representing the precision and scale of a decimal type, to be represented
1414
/// by the native type `D`.
15-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1616
pub struct PrecisionScale<D> {
1717
precision: NonZero<u8>,
1818
scale: i8,

vortex-vector/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ vortex-dtype = { workspace = true }
2525
vortex-error = { workspace = true }
2626
vortex-mask = { workspace = true }
2727

28+
paste = { workspace = true }
2829
static_assertions = { workspace = true }

vortex-vector/src/datum.rs

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// SPDX-FileCopyrightText: Copyright the Vortex contributors
3+
4+
use vortex_dtype::{NativeDecimalType, NativePType};
5+
6+
use crate::binaryview::{BinaryViewScalar, BinaryViewType, BinaryViewVector};
7+
use crate::bool::{BoolScalar, BoolVector};
8+
use crate::decimal::{DScalar, DVector, DecimalScalar, DecimalVector};
9+
use crate::fixed_size_list::{FixedSizeListScalar, FixedSizeListVector};
10+
use crate::listview::{ListViewScalar, ListViewVector};
11+
use crate::null::{NullScalar, NullVector};
12+
use crate::primitive::{PScalar, PVector, PrimitiveScalar, PrimitiveVector};
13+
use crate::struct_::{StructScalar, StructVector};
14+
use crate::{Scalar, Vector};
15+
16+
/// Represents either a scalar or vector value.
17+
pub enum Datum {
18+
/// A scalar value.
19+
Scalar(Scalar),
20+
/// A vector value.
21+
Vector(Vector),
22+
}
23+
24+
impl 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+
82+
macro_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+
158+
datum!(Null);
159+
datum!(Bool);
160+
datum!(Primitive);
161+
datum!(P<T: NativePType>);
162+
datum!(Decimal);
163+
datum!(D<D: NativeDecimalType>);
164+
datum!(BinaryView<T: BinaryViewType>);
165+
datum!(ListView);
166+
datum!(FixedSizeList);
167+
datum!(Struct);

vortex-vector/src/decimal/scalar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl From<DecimalScalar> for Scalar {
5454
}
5555

5656
/// Represents a decimal scalar value with a specific native decimal type.
57-
#[derive(Clone, Debug)]
57+
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
5858
pub struct DScalar<D> {
5959
ps: PrecisionScale<D>,
6060
value: Option<D>,

vortex-vector/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ pub mod null;
1919
pub mod primitive;
2020
pub mod struct_;
2121

22-
mod ops;
22+
mod datum;
2323
mod scalar;
2424
mod scalar_ops;
2525
mod vector;
2626
mod vector_mut;
27+
mod vector_ops;
2728

28-
pub use ops::{VectorMutOps, VectorOps};
29+
pub use datum::Datum;
2930
pub use scalar::Scalar;
3031
pub use scalar_ops::ScalarOps;
3132
pub use vector::Vector;
3233
pub use vector_mut::VectorMut;
34+
pub use vector_ops::{VectorMutOps, VectorOps};
3335

3436
mod macros;
3537
mod private;

vortex-vector/src/listview/vector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use vortex_error::{VortexExpect, VortexResult, vortex_ensure};
1111
use vortex_mask::Mask;
1212

1313
use super::{ListViewScalar, ListViewVectorMut};
14-
use crate::ops::{VectorMutOps, VectorOps};
1514
use crate::primitive::PrimitiveVector;
15+
use crate::vector_ops::{VectorMutOps, VectorOps};
1616
use crate::{Scalar, Vector, match_each_integer_pvector};
1717

1818
/// A vector of variable-width lists.

vortex-vector/src/listview/vector_mut.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use vortex_error::{VortexExpect, VortexResult, vortex_ensure};
1010
use vortex_mask::MaskMut;
1111

1212
use super::ListViewVector;
13-
use crate::ops::VectorMutOps;
1413
use crate::primitive::{PrimitiveVector, PrimitiveVectorMut};
14+
use crate::vector_ops::VectorMutOps;
1515
use crate::{VectorMut, VectorOps, match_each_integer_pvector, match_each_integer_pvector_mut};
1616

1717
/// A mutable vector of variable-width lists.

vortex-vector/src/null/vector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl VectorOps for NullVector {
5353
}
5454

5555
fn slice(&self, range: impl RangeBounds<usize> + Clone + Debug) -> Self {
56-
let len = crate::ops::range_bounds_to_len(range, self.len());
56+
let len = crate::vector_ops::range_bounds_to_len(range, self.len());
5757
Self::new(len)
5858
}
5959

vortex-vector/src/primitive/generic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use vortex_dtype::NativePType;
1111
use vortex_error::{VortexExpect, VortexResult, vortex_ensure};
1212
use vortex_mask::Mask;
1313

14-
use crate::primitive::{PVectorMut, PrimitiveScalar};
14+
use crate::primitive::{PScalar, PVectorMut};
1515
use crate::{Scalar, VectorOps};
1616

1717
/// An immutable vector of generic primitive values.
@@ -124,7 +124,7 @@ impl<T: NativePType> VectorOps for PVector<T> {
124124

125125
fn scalar_at(&self, index: usize) -> Scalar {
126126
assert!(index < self.len(), "Index out of bounds in `PVector`");
127-
PrimitiveScalar::from(self.validity.value(index).then(|| self.elements[index])).into()
127+
PScalar::<T>::new(self.validity.value(index).then(|| self.elements[index])).into()
128128
}
129129

130130
fn slice(&self, range: impl RangeBounds<usize> + Clone + Debug) -> Self {

0 commit comments

Comments
 (0)