Skip to content

Commit 087c2bb

Browse files
committed
Mooooaarrrrr generics
Signed-off-by: Nicholas Gates <[email protected]>
2 parents aaf8553 + cbf93fd commit 087c2bb

File tree

13 files changed

+24
-774
lines changed

13 files changed

+24
-774
lines changed

.github/release-drafter.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ categories:
1515
collapse-after: 8
1616
labels:
1717
- "fix"
18+
- title: "📖 Documentation"
19+
labels:
20+
- "documentation"
1821
- title: "🧰 Maintenance"
1922
labels:
2023
- "chore"

.github/workflows/labels.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
run: |
2929
REQUIRED_LABELS=(
3030
"chore"
31+
"documentation"
3132
"feature"
3233
"fix"
3334
"performance"

vortex-compute/src/filter/bitbuffer.rs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use vortex_buffer::{
77
};
88
use vortex_mask::Mask;
99

10-
use crate::filter::{Filter, MaskIndices};
10+
use crate::filter::Filter;
1111

1212
impl Filter<Mask> for &BitBuffer {
1313
type Output = BitBuffer;
@@ -49,22 +49,6 @@ impl Filter<Mask> for &mut BitBufferMut {
4949
}
5050
}
5151

52-
impl Filter<MaskIndices<'_>> for &BitBuffer {
53-
type Output = BitBuffer;
54-
55-
fn filter(self, indices: &MaskIndices) -> BitBuffer {
56-
filter_indices(self.inner().as_ref(), self.offset(), indices).freeze()
57-
}
58-
}
59-
60-
impl Filter<MaskIndices<'_>> for &mut BitBufferMut {
61-
type Output = ();
62-
63-
fn filter(self, indices: &MaskIndices) {
64-
*self = filter_indices(self.inner().as_ref(), self.offset(), indices)
65-
}
66-
}
67-
6852
fn filter_indices(bools: &[u8], bit_offset: usize, indices: &[usize]) -> BitBufferMut {
6953
// FIXME(ngates): this is slower than it could be!
7054
BitBufferMut::collect_bool(indices.len(), |idx| {

vortex-compute/src/filter/buffer.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
use vortex_buffer::{BitView, Buffer, BufferMut};
55
use vortex_mask::{Mask, MaskIter};
66

7-
use crate::filter::{Filter, MaskIndices};
7+
use crate::filter::Filter;
8+
9+
// This is modeled after the constant with the equivalent name in arrow-rs.
10+
const FILTER_SLICES_SELECTIVITY_THRESHOLD: f64 = 0.8;
811

912
impl<M, T: Copy> Filter<M> for Buffer<T>
1013
where
@@ -26,9 +29,6 @@ where
2629
}
2730
}
2831

29-
// This is modeled after the constant with the equivalent name in arrow-rs.
30-
const FILTER_SLICES_SELECTIVITY_THRESHOLD: f64 = 0.8;
31-
3232
impl<T: Copy> Filter<Mask> for &Buffer<T> {
3333
type Output = Buffer<T>;
3434

@@ -52,14 +52,6 @@ impl<T: Copy> Filter<Mask> for &Buffer<T> {
5252
}
5353
}
5454

55-
impl<T: Copy> Filter<MaskIndices<'_>> for &Buffer<T> {
56-
type Output = Buffer<T>;
57-
58-
fn filter(self, indices: &MaskIndices) -> Buffer<T> {
59-
filter_indices(self, indices)
60-
}
61-
}
62-
6355
impl<const NB: usize, T: Copy> Filter<BitView<'_, NB>> for &Buffer<T> {
6456
type Output = Buffer<T>;
6557

vortex-compute/src/filter/mask.rs

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use vortex_buffer::BitView;
55
use vortex_error::VortexExpect;
66
use vortex_mask::{Mask, MaskMut};
77

8-
use crate::filter::{Filter, MaskIndices};
8+
use crate::filter::Filter;
99

1010
impl Filter<Mask> for &Mask {
1111
type Output = Mask;
@@ -30,18 +30,6 @@ impl Filter<Mask> for &Mask {
3030
}
3131
}
3232

33-
impl Filter<MaskIndices<'_>> for &Mask {
34-
type Output = Mask;
35-
36-
fn filter(self, indices: &MaskIndices<'_>) -> Mask {
37-
match self {
38-
Mask::AllTrue(_) => Mask::AllTrue(indices.len()),
39-
Mask::AllFalse(_) => Mask::AllFalse(indices.len()),
40-
Mask::Values(mask_values) => Mask::from(mask_values.bit_buffer().filter(indices)),
41-
}
42-
}
43-
}
44-
4533
impl<const NB: usize> Filter<BitView<'_, NB>> for &Mask {
4634
type Output = Mask;
4735

@@ -70,16 +58,6 @@ impl Filter<Mask> for &mut MaskMut {
7058
}
7159
}
7260

73-
impl Filter<MaskIndices<'_>> for &mut MaskMut {
74-
type Output = ();
75-
76-
fn filter(self, indices: &MaskIndices<'_>) -> Self::Output {
77-
// TODO(aduffy): Filter in-place
78-
let filtered = self.clone().freeze().filter(indices).into_mut();
79-
*self = filtered;
80-
}
81-
}
82-
8361
impl<const NB: usize> Filter<BitView<'_, NB>> for &mut MaskMut {
8462
type Output = ();
8563

vortex-compute/src/filter/mod.rs

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
//! Filter function.
55
6-
use std::ops::Deref;
7-
86
mod bitbuffer;
97
mod buffer;
108
mod mask;
@@ -25,35 +23,3 @@ pub trait Filter<By: ?Sized> {
2523
/// If the length of the mask does not equal the length of the value being filtered.
2624
fn filter(self, selection: &By) -> Self::Output;
2725
}
28-
29-
/// A view over a set of strictly sorted indices from a bit mask.
30-
///
31-
/// Unlike other indices, `MaskIndices` are always strict-sorted, meaning they are
32-
/// always unique and monotonic.
33-
///
34-
/// You can treat a `MaskIndices` just like a `&[usize]` by iterating or indexing
35-
/// into it just like you would a slice.
36-
pub struct MaskIndices<'a>(&'a [usize]);
37-
38-
impl<'a> MaskIndices<'a> {
39-
/// Create new indices from a slice of strict-sorted index values.
40-
///
41-
/// # Safety
42-
///
43-
/// The caller must ensure that the indices are strict-sorted, i.e. that they
44-
/// are monotonic and unique.
45-
///
46-
/// Users of the `Indices` type assume this and failure to uphold this guarantee
47-
/// can result in UB downstream.
48-
pub unsafe fn new_unchecked(indices: &'a [usize]) -> Self {
49-
Self(indices)
50-
}
51-
}
52-
53-
impl Deref for MaskIndices<'_> {
54-
type Target = [usize];
55-
56-
fn deref(&self) -> &Self::Target {
57-
self.0
58-
}
59-
}

vortex-compute/src/filter/slice_mut.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,7 @@ use std::ptr;
1212
use vortex_buffer::BitView;
1313
use vortex_mask::Mask;
1414

15-
use crate::filter::{Filter, MaskIndices};
16-
17-
impl<T: Copy> Filter<MaskIndices<'_>> for &mut [T] {
18-
type Output = Self;
19-
20-
fn filter(self, indices: &MaskIndices) -> Self::Output {
21-
for (write_index, &read_index) in indices.iter().enumerate() {
22-
self[write_index] = self[read_index];
23-
}
24-
&mut self[..indices.len()]
25-
}
26-
}
15+
use crate::filter::Filter;
2716

2817
impl<T: Copy> Filter<Mask> for &mut [T] {
2918
type Output = Self;

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

Lines changed: 0 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -42,175 +42,3 @@ where
4242
}
4343
}
4444
}
45-
46-
#[cfg(test)]
47-
mod tests {
48-
use vortex_mask::Mask;
49-
use vortex_vector::binaryview::StringVectorMut;
50-
use vortex_vector::{VectorMutOps, VectorOps};
51-
52-
use super::*;
53-
use crate::filter::MaskIndices;
54-
55-
#[test]
56-
fn test_filter_binary_view_vector_with_mask() {
57-
let mut vec = StringVectorMut::with_capacity(5);
58-
vec.append_values("hello", 1);
59-
vec.append_values("world", 1);
60-
vec.append_values("foo", 1);
61-
vec.append_values("bar", 1);
62-
vec.append_values("baz", 1);
63-
let vec = vec.freeze();
64-
65-
let mask = Mask::from_iter([true, false, true, false, true]);
66-
67-
let filtered = vec.filter(&mask);
68-
69-
assert_eq!(filtered.len(), 3);
70-
assert_eq!(filtered.validity().true_count(), 3);
71-
assert_eq!(filtered.get_ref(0), Some("hello"));
72-
assert_eq!(filtered.get_ref(1), Some("foo"));
73-
assert_eq!(filtered.get_ref(2), Some("baz"));
74-
}
75-
76-
#[test]
77-
fn test_filter_binary_view_vector_with_mask_indices() {
78-
let mut vec = StringVectorMut::with_capacity(5);
79-
vec.append_values("hello", 1);
80-
vec.append_values("world", 1);
81-
vec.append_values("foo", 1);
82-
vec.append_values("bar", 1);
83-
vec.append_values("baz", 1);
84-
let vec = vec.freeze();
85-
86-
let indices = unsafe { MaskIndices::new_unchecked(&[0, 2, 4]) };
87-
88-
let filtered = vec.filter(&indices);
89-
90-
assert_eq!(filtered.len(), 3);
91-
assert_eq!(filtered.validity().true_count(), 3);
92-
assert_eq!(filtered.get_ref(0), Some("hello"));
93-
assert_eq!(filtered.get_ref(1), Some("foo"));
94-
assert_eq!(filtered.get_ref(2), Some("baz"));
95-
}
96-
97-
#[test]
98-
fn test_filter_binary_view_vector_with_nulls() {
99-
let mut vec = StringVectorMut::with_capacity(5);
100-
vec.append_values("hello", 1);
101-
vec.append_nulls(1);
102-
vec.append_values("foo", 1);
103-
vec.append_values("bar", 1);
104-
vec.append_nulls(1);
105-
let vec = vec.freeze();
106-
107-
let mask = Mask::from_iter([true, true, false, true, false]);
108-
109-
let filtered = vec.filter(&mask);
110-
111-
assert_eq!(filtered.len(), 3);
112-
assert_eq!(filtered.validity().true_count(), 2);
113-
assert_eq!(filtered.get_ref(0), Some("hello"));
114-
assert_eq!(filtered.get_ref(1), None);
115-
assert_eq!(filtered.get_ref(2), Some("bar"));
116-
}
117-
118-
#[test]
119-
fn test_filter_binary_view_vector_all_true() {
120-
let mut vec = StringVectorMut::with_capacity(3);
121-
vec.append_values("hello", 1);
122-
vec.append_values("world", 1);
123-
vec.append_values("foo", 1);
124-
let vec = vec.freeze();
125-
126-
let mask = Mask::new_true(3);
127-
128-
let filtered = vec.filter(&mask);
129-
130-
assert_eq!(filtered.len(), 3);
131-
assert_eq!(filtered.get_ref(0), Some("hello"));
132-
assert_eq!(filtered.get_ref(1), Some("world"));
133-
assert_eq!(filtered.get_ref(2), Some("foo"));
134-
}
135-
136-
#[test]
137-
fn test_filter_binary_view_vector_all_false() {
138-
let mut vec = StringVectorMut::with_capacity(3);
139-
vec.append_values("hello", 1);
140-
vec.append_values("world", 1);
141-
vec.append_values("foo", 1);
142-
let vec = vec.freeze();
143-
144-
let mask = Mask::new_false(3);
145-
146-
let filtered = vec.filter(&mask);
147-
148-
assert_eq!(filtered.len(), 0);
149-
}
150-
151-
#[test]
152-
fn test_filter_binary_view_vector_mut_with_mask() {
153-
let mut vec = StringVectorMut::with_capacity(5);
154-
vec.append_values("hello", 1);
155-
vec.append_values("world", 1);
156-
vec.append_values("foo", 1);
157-
vec.append_values("bar", 1);
158-
vec.append_values("baz", 1);
159-
160-
let mask = Mask::from_iter([true, false, true, false, true]);
161-
162-
vec.filter(&mask);
163-
164-
assert_eq!(vec.len(), 3);
165-
let frozen = vec.freeze();
166-
assert_eq!(frozen.len(), 3);
167-
assert_eq!(frozen.validity().true_count(), 3);
168-
assert_eq!(frozen.get_ref(0), Some("hello"));
169-
assert_eq!(frozen.get_ref(1), Some("foo"));
170-
assert_eq!(frozen.get_ref(2), Some("baz"));
171-
}
172-
173-
#[test]
174-
fn test_filter_binary_view_vector_mut_with_mask_indices() {
175-
let mut vec = StringVectorMut::with_capacity(5);
176-
vec.append_values("hello", 1);
177-
vec.append_values("world", 1);
178-
vec.append_values("foo", 1);
179-
vec.append_values("bar", 1);
180-
vec.append_values("baz", 1);
181-
182-
let indices = unsafe { MaskIndices::new_unchecked(&[0, 2, 4]) };
183-
184-
vec.filter(&indices);
185-
186-
assert_eq!(vec.len(), 3);
187-
let frozen = vec.freeze();
188-
assert_eq!(frozen.len(), 3);
189-
assert_eq!(frozen.validity().true_count(), 3);
190-
assert_eq!(frozen.get_ref(0), Some("hello"));
191-
assert_eq!(frozen.get_ref(1), Some("foo"));
192-
assert_eq!(frozen.get_ref(2), Some("baz"));
193-
}
194-
195-
#[test]
196-
fn test_filter_binary_view_vector_mut_with_nulls() {
197-
let mut vec = StringVectorMut::with_capacity(5);
198-
vec.append_values("hello", 1);
199-
vec.append_nulls(1);
200-
vec.append_values("foo", 1);
201-
vec.append_values("bar", 1);
202-
vec.append_nulls(1);
203-
204-
let mask = Mask::from_iter([true, true, false, true, false]);
205-
206-
vec.filter(&mask);
207-
208-
assert_eq!(vec.len(), 3);
209-
let frozen = vec.freeze();
210-
assert_eq!(frozen.len(), 3);
211-
assert_eq!(frozen.validity().true_count(), 2);
212-
assert_eq!(frozen.get_ref(0), Some("hello"));
213-
assert_eq!(frozen.get_ref(1), None);
214-
assert_eq!(frozen.get_ref(2), Some("bar"));
215-
}
216-
}

0 commit comments

Comments
 (0)