Skip to content

Commit 28846eb

Browse files
committed
More vector scalars
Signed-off-by: Nicholas Gates <[email protected]>
1 parent 60221f6 commit 28846eb

File tree

3 files changed

+112
-9
lines changed

3 files changed

+112
-9
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-scalar/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ prost = { workspace = true }
2727
vortex-buffer = { workspace = true }
2828
vortex-dtype = { workspace = true, features = ["arrow"] }
2929
vortex-error = { workspace = true }
30+
vortex-mask = { workspace = true }
3031
vortex-proto = { workspace = true, features = ["scalar"] }
3132
vortex-utils = { workspace = true }
3233
vortex-vector = { workspace = true }

vortex-scalar/src/vectors.rs

Lines changed: 110 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,35 @@
33

44
//! Conversion logic from this "legacy" scalar crate to Vortex Vector scalars.
55
6+
use std::sync::Arc;
7+
8+
use vortex_buffer::Buffer;
69
use vortex_dtype::{
710
DType, DecimalType, PrecisionScale, match_each_decimal_value_type, match_each_native_ptype,
811
};
912
use vortex_error::VortexExpect;
10-
use vortex_vector::binaryview::{BinaryViewScalar, StringScalar};
13+
use vortex_mask::Mask;
14+
use vortex_vector::binaryview::{BinaryScalar, StringScalar};
1115
use vortex_vector::bool::BoolScalar;
1216
use vortex_vector::decimal::DScalar;
17+
use vortex_vector::fixed_size_list::{FixedSizeListScalar, FixedSizeListVector};
18+
use vortex_vector::listview::{ListViewScalar, ListViewVector, ListViewVectorMut};
1319
use vortex_vector::null::NullScalar;
14-
use vortex_vector::primitive::PScalar;
20+
use vortex_vector::primitive::{PScalar, PVector};
21+
use vortex_vector::struct_::{StructScalar, StructVector};
22+
use vortex_vector::{VectorMut, VectorMutOps};
1523

1624
use crate::Scalar;
1725

1826
impl Scalar {
19-
pub fn into_vector(self) -> vortex_vector::Scalar {
27+
/// Convert the `vortex-scalar` [`Scalar`] into a `vortex-vector` [`vortex_vector::Scalar`].
28+
pub fn to_vector_scalar(&self) -> vortex_vector::Scalar {
2029
match self.dtype() {
2130
DType::Null => NullScalar.into(),
2231
DType::Bool(_) => BoolScalar::new(self.as_bool().value()).into(),
2332
DType::Primitive(ptype, _) => {
2433
match_each_native_ptype!(ptype, |T| {
25-
PScalar::new(self.as_primitive().typed_value()).into()
34+
PScalar::new(self.as_primitive().typed_value::<T>()).into()
2635
})
2736
}
2837
DType::Decimal(dec_dtype, _) => {
@@ -41,11 +50,103 @@ impl Scalar {
4150
})
4251
}
4352
DType::Utf8(_) => StringScalar::new(self.as_utf8().value()).into(),
44-
DType::Binary(_) => BinaryViewScalar::new(self.as_binary().value()).into(),
45-
DType::List(..) => {}
46-
DType::FixedSizeList(..) => {}
47-
DType::Struct(..) => {}
48-
DType::Extension(_) => {}
53+
DType::Binary(_) => BinaryScalar::new(self.as_binary().value()).into(),
54+
DType::List(elems_dtype, _) => {
55+
let lscalar = self.as_list();
56+
match lscalar.elements() {
57+
None => {
58+
let mut list_view = ListViewVectorMut::with_capacity(&elems_dtype, 1);
59+
list_view.append_nulls(1);
60+
ListViewScalar::new(list_view.freeze()).into()
61+
}
62+
Some(elements) => {
63+
// If the list elements are non-null, we convert each one accordingly
64+
// and append it to the new list view.
65+
let mut new_elements =
66+
VectorMut::with_capacity(elems_dtype, elements.len());
67+
for element in &elements {
68+
let element_scalar = element.to_vector_scalar();
69+
new_elements.append_scalars(&element_scalar, 1);
70+
}
71+
72+
let offsets =
73+
PVector::<u64>::new(Buffer::from_iter([0]), Mask::new_true(1));
74+
let sizes = PVector::<u64>::new(
75+
Buffer::from_iter([elements.len() as u64]),
76+
Mask::new_true(1),
77+
);
78+
79+
// Create the length-1 vector holding the list scalar.
80+
let list_view_vector = ListViewVector::new(
81+
Arc::new(new_elements.freeze()),
82+
offsets.into(),
83+
sizes.into(),
84+
Mask::new_true(1),
85+
);
86+
87+
ListViewScalar::new(list_view_vector).into()
88+
}
89+
}
90+
}
91+
DType::FixedSizeList(elems_dtype, size, _) => {
92+
let lscalar = self.as_list();
93+
match lscalar.elements() {
94+
None => {
95+
let mut elements = VectorMut::with_capacity(elems_dtype, *size as usize);
96+
elements.append_zeros(*size as usize);
97+
98+
FixedSizeListScalar::new(FixedSizeListVector::new(
99+
Arc::new(elements.freeze()),
100+
*size,
101+
Mask::new_false(1),
102+
))
103+
.into()
104+
}
105+
Some(element_scalars) => {
106+
let mut elements = VectorMut::with_capacity(elems_dtype, *size as usize);
107+
for element_scalar in &element_scalars {
108+
elements.append_scalars(&element_scalar.to_vector_scalar(), 1);
109+
}
110+
FixedSizeListScalar::new(FixedSizeListVector::new(
111+
Arc::new(elements.freeze()),
112+
*size,
113+
Mask::new_true(1),
114+
))
115+
.into()
116+
}
117+
}
118+
}
119+
DType::Struct(fields, _) => {
120+
let scalar = self.as_struct();
121+
122+
match scalar.fields() {
123+
None => {
124+
// Null struct scalar, we still need a length-1 vector for each field.
125+
let fields = fields
126+
.fields()
127+
.map(|dtype| {
128+
let mut field_vec = VectorMut::with_capacity(&dtype, 1);
129+
field_vec.append_zeros(1);
130+
field_vec.freeze()
131+
})
132+
.collect();
133+
StructScalar::new(StructVector::new(Arc::new(fields), Mask::new_false(1)))
134+
.into()
135+
}
136+
Some(field_scalars) => {
137+
let fields = field_scalars
138+
.map(|scalar| {
139+
let mut field_vec = VectorMut::with_capacity(scalar.dtype(), 1);
140+
field_vec.append_scalars(&scalar.to_vector_scalar(), 1);
141+
field_vec.freeze()
142+
})
143+
.collect();
144+
StructScalar::new(StructVector::new(Arc::new(fields), Mask::new_false(1)))
145+
.into()
146+
}
147+
}
148+
}
149+
DType::Extension(_) => self.as_extension().storage().to_vector_scalar(),
49150
}
50151
}
51152
}

0 commit comments

Comments
 (0)