Skip to content

Commit d02084c

Browse files
committed
tests for BoolVector filter
Signed-off-by: Andrew Duffy <[email protected]>
1 parent c77f2d2 commit d02084c

File tree

11 files changed

+123
-1
lines changed

11 files changed

+123
-1
lines changed

vortex-compute/src/filter/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl<'a> MaskIndices<'a> {
4040
/// # Safety
4141
///
4242
/// The caller must ensure that the indices are strict-sorted, i.e. that they
43-
/// are montonic and unique.
43+
/// are monotonic and unique.
4444
///
4545
/// Users of the `Indices` type assume this and failure to uphold this guarantee
4646
/// can result in UB downstream.

vortex-compute/src/filter/vector/bool.rs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,116 @@ where
4242
}
4343
}
4444
}
45+
46+
#[cfg(test)]
47+
mod tests {
48+
use vortex_buffer::BitBuffer;
49+
use vortex_mask::Mask;
50+
use vortex_vector::bool::BoolVectorMut;
51+
use vortex_vector::{VectorMutOps, VectorOps};
52+
53+
use super::*;
54+
use crate::filter::MaskIndices;
55+
56+
#[test]
57+
fn test_filter_bool_vector_with_mask() {
58+
let vec = BoolVectorMut::from_iter([true, false, true, false, true]).freeze();
59+
let mask = Mask::from_iter([true, false, true, false, true]);
60+
61+
let filtered = vec.filter(&mask);
62+
63+
assert_eq!(filtered.len(), 3);
64+
assert_eq!(filtered.validity().true_count(), 3);
65+
assert_eq!(filtered.bits(), &BitBuffer::from_iter([true, true, true]));
66+
}
67+
68+
#[test]
69+
fn test_filter_bool_vector_with_mask_indices() {
70+
let vec = BoolVectorMut::from_iter([true, false, true, false, true]).freeze();
71+
let indices = unsafe { MaskIndices::new_unchecked(&[0, 2, 4]) };
72+
73+
let filtered = vec.filter(&indices);
74+
75+
assert_eq!(filtered.len(), 3);
76+
assert_eq!(filtered.validity().true_count(), 3);
77+
assert_eq!(filtered.bits(), &BitBuffer::from_iter([true, true, true]));
78+
}
79+
80+
#[test]
81+
fn test_filter_bool_vector_with_nulls() {
82+
let vec =
83+
BoolVectorMut::from_iter([Some(true), None, Some(false), Some(true), None]).freeze();
84+
let mask = Mask::from_iter([true, true, false, true, false]);
85+
86+
let filtered = vec.filter(&mask);
87+
88+
assert_eq!(filtered.len(), 3);
89+
assert_eq!(filtered.validity().true_count(), 2);
90+
91+
assert_eq!(
92+
filtered.validity().to_bit_buffer(),
93+
BitBuffer::from_iter([true, false, true])
94+
);
95+
assert_eq!(filtered.bits(), &BitBuffer::from_iter([true, false, true]));
96+
}
97+
98+
#[test]
99+
fn test_filter_bool_vector_all_true() {
100+
let vec = BoolVectorMut::from_iter([true, false, true]).freeze();
101+
let mask = Mask::new_true(3);
102+
103+
let filtered = vec.filter(&mask);
104+
105+
assert_eq!(filtered.len(), 3);
106+
assert_eq!(filtered.bits(), &BitBuffer::from_iter([true, false, true]));
107+
}
108+
109+
#[test]
110+
fn test_filter_bool_vector_all_false() {
111+
let vec = BoolVectorMut::from_iter([true, false, true]).freeze();
112+
let mask = Mask::new_false(3);
113+
114+
let filtered = vec.filter(&mask);
115+
116+
assert_eq!(filtered.len(), 0);
117+
}
118+
119+
#[test]
120+
fn test_filter_bool_vector_mut_with_mask() {
121+
let mut vec = BoolVectorMut::from_iter([true, false, true, false, true]);
122+
let mask = Mask::from_iter([true, false, true, false, true]);
123+
124+
vec.filter(&mask);
125+
126+
assert_eq!(vec.len(), 3);
127+
let frozen = vec.freeze();
128+
assert_eq!(frozen.len(), 3);
129+
assert_eq!(frozen.validity().true_count(), 3);
130+
}
131+
132+
#[test]
133+
fn test_filter_bool_vector_mut_with_mask_indices() {
134+
let mut vec = BoolVectorMut::from_iter([true, false, true, false, true]);
135+
let indices = unsafe { MaskIndices::new_unchecked(&[0, 2, 4]) };
136+
137+
vec.filter(&indices);
138+
139+
assert_eq!(vec.len(), 3);
140+
let frozen = vec.freeze();
141+
assert_eq!(frozen.len(), 3);
142+
assert_eq!(frozen.validity().true_count(), 3);
143+
}
144+
145+
#[test]
146+
fn test_filter_bool_vector_mut_with_nulls() {
147+
let mut vec = BoolVectorMut::from_iter([Some(true), None, Some(false), Some(true), None]);
148+
let mask = Mask::from_iter([true, true, false, true, false]);
149+
150+
vec.filter(&mask);
151+
152+
assert_eq!(vec.len(), 3);
153+
let frozen = vec.freeze();
154+
assert_eq!(frozen.len(), 3);
155+
assert_eq!(frozen.validity().true_count(), 2);
156+
}
157+
}

vortex-vector/src/binaryview/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::binaryview::{
77
use crate::{Scalar, ScalarOps, VectorMutOps};
88

99
/// A scalar value for types that implement [`BinaryViewType`].
10+
#[derive(Debug)]
1011
pub struct BinaryViewScalar<T: BinaryViewType>(Option<T::Scalar>);
1112

1213
impl<T: BinaryViewType> From<Option<T::Scalar>> for BinaryViewScalar<T> {

vortex-vector/src/bool/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::bool::BoolVectorMut;
55
use crate::{Scalar, ScalarOps, VectorMut, VectorMutOps};
66

77
/// A scalar value for boolean types.
8+
#[derive(Debug)]
89
pub struct BoolScalar(Option<bool>);
910

1011
impl From<Option<bool>> for BoolScalar {

vortex-vector/src/decimal/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::decimal::DVectorMut;
88
use crate::{Scalar, ScalarOps, VectorMut, VectorMutOps};
99

1010
/// Represents a decimal scalar value.
11+
#[derive(Debug)]
1112
pub enum DecimalScalar {
1213
/// 8-bit decimal scalar.
1314
I8(DScalar<i8>),

vortex-vector/src/fixed_size_list/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::{Scalar, ScalarOps, VectorMut, VectorOps};
1010
///
1111
// NOTE(ngates): the reason we don't hold Option<Vector> representing the elements is that we
1212
// wouldn't be able to go back to a vector using "repeat".
13+
#[derive(Debug)]
1314
pub struct FixedSizeListScalar(FixedSizeListVector);
1415

1516
impl FixedSizeListScalar {

vortex-vector/src/listview/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{Scalar, ScalarOps, VectorMut, VectorOps};
77
/// A scalar value for list view types.
88
///
99
/// The inner value is a ListViewVector with length 1.
10+
#[derive(Debug)]
1011
pub struct ListViewScalar(ListViewVector);
1112

1213
impl ListViewScalar {

vortex-vector/src/null/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::null::NullVectorMut;
55
use crate::{Scalar, ScalarOps, VectorMut};
66

77
/// Represents a null scalar value.
8+
#[derive(Debug)]
89
pub struct NullScalar;
910

1011
impl ScalarOps for NullScalar {

vortex-vector/src/primitive/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::primitive::{PVectorMut, PrimitiveVectorMut};
1010
use crate::{Scalar, ScalarOps, VectorMut, VectorMutOps};
1111

1212
/// Represents a primitive scalar value.
13+
#[derive(Debug)]
1314
pub enum PrimitiveScalar {
1415
/// 8-bit signed integer scalar
1516
I8(PScalar<i8>),

vortex-vector/src/scalar.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::struct_::StructScalar;
1414
use crate::{ScalarOps, VectorMut, match_each_scalar};
1515

1616
/// Represents a scalar value of any supported type.
17+
#[derive(Debug)]
1718
pub enum Scalar {
1819
/// Null scalars are always null.
1920
Null(NullScalar),

0 commit comments

Comments
 (0)