vortex_mask/
intersect_by_rank.rs1use crate::{AllOr, Mask};
5
6impl Mask {
7 pub fn intersect_by_rank(&self, mask: &Mask) -> Mask {
29 assert_eq!(self.true_count(), mask.len());
30
31 match (self.indices(), mask.indices()) {
32 (AllOr::All, _) => mask.clone(),
33 (_, AllOr::All) => self.clone(),
34 (AllOr::None, _) => Self::new_false(0),
35 (_, AllOr::None) => Self::new_false(self.len()),
36 (AllOr::Some(self_indices), AllOr::Some(mask_indices)) => {
37 Self::from_indices(
38 self.len(),
39 mask_indices
40 .iter()
41 .map(|idx|
42 unsafe{*self_indices.get_unchecked(*idx)})
46 .collect(),
47 )
48 }
49 }
50 }
51}
52
53#[cfg(test)]
54mod test {
55 use arrow_buffer::BooleanBuffer;
56
57 use crate::Mask;
58
59 #[test]
60 fn mask_bitand_all_as_bit_and() {
61 let this = Mask::from_buffer(BooleanBuffer::from_iter(vec![true, true, true, true, true]));
62 let mask = Mask::from_buffer(BooleanBuffer::from_iter(vec![
63 false, true, false, true, true,
64 ]));
65 assert_eq!(
66 this.intersect_by_rank(&mask),
67 Mask::from_indices(5, vec![1, 3, 4])
68 );
69 }
70
71 #[test]
72 fn mask_bitand_all_true() {
73 let this = Mask::from_buffer(BooleanBuffer::from_iter(vec![
74 false, false, true, true, true,
75 ]));
76 let mask = Mask::from_buffer(BooleanBuffer::from_iter(vec![true, true, true]));
77 assert_eq!(
78 this.intersect_by_rank(&mask),
79 Mask::from_indices(5, vec![2, 3, 4])
80 );
81 }
82
83 #[test]
84 fn mask_bitand_true() {
85 let this = Mask::from_buffer(BooleanBuffer::from_iter(vec![
86 true, false, false, true, true,
87 ]));
88 let mask = Mask::from_buffer(BooleanBuffer::from_iter(vec![true, false, true]));
89 assert_eq!(
90 this.intersect_by_rank(&mask),
91 Mask::from_indices(5, vec![0, 4])
92 );
93 }
94
95 #[test]
96 fn mask_bitand_false() {
97 let this = Mask::from_buffer(BooleanBuffer::from_iter(vec![
98 true, false, false, true, true,
99 ]));
100 let mask = Mask::from_buffer(BooleanBuffer::from_iter(vec![false, false, false]));
101 assert_eq!(this.intersect_by_rank(&mask), Mask::from_indices(5, vec![]));
102 }
103}