Skip to content

Commit cbcf263

Browse files
committed
MaskValues is serializable
Signed-off-by: blaginin <[email protected]>
1 parent 3d13dae commit cbcf263

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
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-mask/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,18 @@ repository = { workspace = true }
1313
rust-version = { workspace = true }
1414
version = { workspace = true }
1515

16+
17+
[features]
18+
serde = ["dep:serde"]
19+
20+
1621
[dependencies]
1722
itertools = { workspace = true }
23+
serde = { workspace = true, optional = true }
1824
vortex-buffer = { workspace = true, features = ["arrow"] }
1925
vortex-error = { workspace = true }
2026

27+
2128
[dev-dependencies]
2229
rstest = { workspace = true }
2330

vortex-mask/src/lib.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ mod intersect_by_rank;
1010
mod iter_bools;
1111
mod mask_mut;
1212

13+
#[cfg(feature = "serde")]
14+
mod serde;
1315
#[cfg(test)]
1416
mod tests;
1517

@@ -98,6 +100,7 @@ impl<T> Eq for AllOr<T> where T: Eq {}
98100
/// A [`Mask`] can be constructed from various representations, and converted to various
99101
/// others. Internally, these are cached.
100102
#[derive(Debug, Clone)]
103+
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
101104
pub enum Mask {
102105
/// All values are included.
103106
AllTrue(usize),
@@ -123,6 +126,25 @@ pub struct MaskValues {
123126
density: f64,
124127
}
125128

129+
impl MaskValues {
130+
fn from_buffer(buffer: BitBuffer) -> Self {
131+
let count = buffer.true_count();
132+
Self::from_buffer_with_counts(buffer, count)
133+
}
134+
135+
fn from_buffer_with_counts(buffer: BitBuffer, true_count: usize) -> Self {
136+
let len = buffer.len();
137+
138+
Self {
139+
buffer,
140+
indices: Default::default(),
141+
slices: Default::default(),
142+
true_count,
143+
density: true_count as f64 / len as f64,
144+
}
145+
}
146+
}
147+
126148
impl Mask {
127149
/// Create a new Mask where all values are set.
128150
#[inline]

vortex-mask/src/serde.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// SPDX-FileCopyrightText: Copyright the Vortex contributors
3+
4+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
5+
use vortex_buffer::BitBuffer;
6+
7+
use crate::MaskValues;
8+
9+
impl Serialize for MaskValues {
10+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11+
where
12+
S: Serializer,
13+
{
14+
self.buffer.serialize(serializer)
15+
}
16+
}
17+
18+
impl<'de> Deserialize<'de> for MaskValues {
19+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20+
where
21+
D: Deserializer<'de>,
22+
{
23+
let buffer = BitBuffer::deserialize(deserializer)?;
24+
Ok(MaskValues::from_buffer(buffer))
25+
}
26+
}

0 commit comments

Comments
 (0)