reifydb_core/value/container/
row_number.rs1use std::ops::Deref;
5
6use reifydb_type::{RowNumber, Value};
7use serde::{Deserialize, Serialize};
8
9use crate::{BitVec, CowVec};
10
11#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
12pub struct RowNumberContainer {
13 data: CowVec<RowNumber>,
14 bitvec: BitVec,
15}
16
17impl Deref for RowNumberContainer {
18 type Target = [RowNumber];
19
20 fn deref(&self) -> &Self::Target {
21 self.data.as_slice()
22 }
23}
24
25impl RowNumberContainer {
26 pub fn new(data: Vec<RowNumber>, bitvec: BitVec) -> Self {
27 debug_assert_eq!(data.len(), bitvec.len());
28 Self {
29 data: CowVec::new(data),
30 bitvec,
31 }
32 }
33
34 pub fn with_capacity(capacity: usize) -> Self {
35 Self {
36 data: CowVec::with_capacity(capacity),
37 bitvec: BitVec::with_capacity(capacity),
38 }
39 }
40
41 pub fn from_vec(data: Vec<RowNumber>) -> Self {
42 let len = data.len();
43 Self {
44 data: CowVec::new(data),
45 bitvec: BitVec::repeat(len, true),
46 }
47 }
48
49 pub fn len(&self) -> usize {
50 debug_assert_eq!(self.data.len(), self.bitvec.len());
51 self.data.len()
52 }
53
54 pub fn capacity(&self) -> usize {
55 debug_assert!(self.data.capacity() >= self.bitvec.capacity());
56 self.data.capacity().min(self.bitvec.capacity())
57 }
58
59 pub fn is_empty(&self) -> bool {
60 self.data.is_empty()
61 }
62
63 pub fn push(&mut self, value: RowNumber) {
64 self.data.push(value);
65 self.bitvec.push(true);
66 }
67
68 pub fn push_undefined(&mut self) {
69 self.data.push(RowNumber::default());
70 self.bitvec.push(false);
71 }
72
73 pub fn get(&self, index: usize) -> Option<&RowNumber> {
74 if index < self.len() && self.is_defined(index) {
75 self.data.get(index)
76 } else {
77 None
78 }
79 }
80
81 pub fn bitvec(&self) -> &BitVec {
82 &self.bitvec
83 }
84
85 pub fn bitvec_mut(&mut self) -> &mut BitVec {
86 &mut self.bitvec
87 }
88
89 pub fn is_defined(&self, idx: usize) -> bool {
90 idx < self.len() && self.bitvec.get(idx)
91 }
92
93 pub fn data(&self) -> &CowVec<RowNumber> {
94 &self.data
95 }
96
97 pub fn data_mut(&mut self) -> &mut CowVec<RowNumber> {
98 &mut self.data
99 }
100
101 pub fn as_string(&self, index: usize) -> String {
102 if index < self.len() && self.is_defined(index) {
103 self.data[index].to_string()
104 } else {
105 "Undefined".to_string()
106 }
107 }
108
109 pub fn get_value(&self, index: usize) -> Value {
110 if index < self.len() && self.is_defined(index) {
111 Value::RowNumber(self.data[index])
112 } else {
113 Value::Undefined
114 }
115 }
116
117 pub fn extend(&mut self, other: &Self) -> crate::Result<()> {
118 self.data.extend(other.data.iter().cloned());
119 self.bitvec.extend(&other.bitvec);
120 Ok(())
121 }
122
123 pub fn extend_from_undefined(&mut self, len: usize) {
124 self.data.extend(std::iter::repeat(RowNumber::default()).take(len));
125 self.bitvec.extend(&BitVec::repeat(len, false));
126 }
127
128 pub fn iter(&self) -> impl Iterator<Item = Option<RowNumber>> + '_ {
129 self.data.iter().zip(self.bitvec.iter()).map(|(&v, defined)| {
130 if defined {
131 Some(v)
132 } else {
133 None
134 }
135 })
136 }
137
138 pub fn slice(&self, start: usize, end: usize) -> Self {
139 let new_data: Vec<RowNumber> = self.data.iter().skip(start).take(end - start).cloned().collect();
140 let new_bitvec: Vec<bool> = self.bitvec.iter().skip(start).take(end - start).collect();
141 Self {
142 data: CowVec::new(new_data),
143 bitvec: BitVec::from_slice(&new_bitvec),
144 }
145 }
146
147 pub fn filter(&mut self, mask: &BitVec) {
148 let mut new_data = Vec::with_capacity(mask.count_ones());
149 let mut new_bitvec = BitVec::with_capacity(mask.count_ones());
150
151 for (i, keep) in mask.iter().enumerate() {
152 if keep && i < self.len() {
153 new_data.push(self.data[i].clone());
154 new_bitvec.push(self.bitvec.get(i));
155 }
156 }
157
158 self.data = CowVec::new(new_data);
159 self.bitvec = new_bitvec;
160 }
161
162 pub fn reorder(&mut self, indices: &[usize]) {
163 let mut new_data = Vec::with_capacity(indices.len());
164 let mut new_bitvec = BitVec::with_capacity(indices.len());
165
166 for &idx in indices {
167 if idx < self.len() {
168 new_data.push(self.data[idx].clone());
169 new_bitvec.push(self.bitvec.get(idx));
170 } else {
171 new_data.push(RowNumber::default());
172 new_bitvec.push(false);
173 }
174 }
175
176 self.data = CowVec::new(new_data);
177 self.bitvec = new_bitvec;
178 }
179
180 pub fn take(&self, num: usize) -> Self {
181 Self {
182 data: self.data.take(num),
183 bitvec: self.bitvec.take(num),
184 }
185 }
186}
187
188impl Default for RowNumberContainer {
189 fn default() -> Self {
190 Self::with_capacity(0)
191 }
192}
193
194#[cfg(test)]
195mod tests {
196 use super::*;
197
198 #[test]
199 fn test_new() {
200 let row_number1 = RowNumber::new(1);
201 let row_number2 = RowNumber::new(2);
202 let row_numbers = vec![row_number1, row_number2];
203 let bitvec = BitVec::from_slice(&[true, true]);
204 let container = RowNumberContainer::new(row_numbers.clone(), bitvec);
205
206 assert_eq!(container.len(), 2);
207 assert_eq!(container.get(0), Some(&row_numbers[0]));
208 assert_eq!(container.get(1), Some(&row_numbers[1]));
209 }
210
211 #[test]
212 fn test_from_vec() {
213 let row_numbers = vec![RowNumber::new(10), RowNumber::new(20), RowNumber::new(30)];
214 let container = RowNumberContainer::from_vec(row_numbers.clone());
215
216 assert_eq!(container.len(), 3);
217 assert_eq!(container.get(0), Some(&row_numbers[0]));
218 assert_eq!(container.get(1), Some(&row_numbers[1]));
219 assert_eq!(container.get(2), Some(&row_numbers[2]));
220
221 for i in 0..3 {
223 assert!(container.is_defined(i));
224 }
225 }
226
227 #[test]
228 fn test_with_capacity() {
229 let container = RowNumberContainer::with_capacity(10);
230 assert_eq!(container.len(), 0);
231 assert!(container.is_empty());
232 assert!(container.capacity() >= 10);
233 }
234
235 #[test]
236 fn test_push_with_undefined() {
237 let mut container = RowNumberContainer::with_capacity(3);
238 let row_number1 = RowNumber::new(100);
239 let row_number2 = RowNumber::new(200);
240
241 container.push(row_number1);
242 container.push_undefined();
243 container.push(row_number2);
244
245 assert_eq!(container.len(), 3);
246 assert_eq!(container.get(0), Some(&row_number1));
247 assert_eq!(container.get(1), None); assert_eq!(container.get(2), Some(&row_number2));
249
250 assert!(container.is_defined(0));
251 assert!(!container.is_defined(1));
252 assert!(container.is_defined(2));
253 }
254
255 #[test]
256 fn test_extend() {
257 let row_number1 = RowNumber::new(1);
258 let row_number2 = RowNumber::new(2);
259 let row_number3 = RowNumber::new(3);
260
261 let mut container1 = RowNumberContainer::from_vec(vec![row_number1, row_number2]);
262 let container2 = RowNumberContainer::from_vec(vec![row_number3]);
263
264 container1.extend(&container2).unwrap();
265
266 assert_eq!(container1.len(), 3);
267 assert_eq!(container1.get(0), Some(&row_number1));
268 assert_eq!(container1.get(1), Some(&row_number2));
269 assert_eq!(container1.get(2), Some(&row_number3));
270 }
271
272 #[test]
273 fn test_extend_from_undefined() {
274 let row_number = RowNumber::new(42);
275 let mut container = RowNumberContainer::from_vec(vec![row_number]);
276 container.extend_from_undefined(2);
277
278 assert_eq!(container.len(), 3);
279 assert_eq!(container.get(0), Some(&row_number));
280 assert_eq!(container.get(1), None); assert_eq!(container.get(2), None); }
283
284 #[test]
285 fn test_iter() {
286 let row_number1 = RowNumber::new(10);
287 let row_number2 = RowNumber::new(20);
288 let row_number3 = RowNumber::new(30);
289 let row_numbers = vec![row_number1, row_number2, row_number3];
290 let bitvec = BitVec::from_slice(&[true, false, true]); let container = RowNumberContainer::new(row_numbers.clone(), bitvec);
292
293 let collected: Vec<Option<RowNumber>> = container.iter().collect();
294 assert_eq!(collected, vec![Some(row_numbers[0]), None, Some(row_numbers[2])]);
295 }
296
297 #[test]
298 fn test_slice() {
299 let container = RowNumberContainer::from_vec(vec![
300 RowNumber::new(1),
301 RowNumber::new(2),
302 RowNumber::new(3),
303 RowNumber::new(4),
304 ]);
305 let sliced = container.slice(1, 3);
306
307 assert_eq!(sliced.len(), 2);
308 assert_eq!(sliced.get(0), Some(&RowNumber::new(2)));
309 assert_eq!(sliced.get(1), Some(&RowNumber::new(3)));
310 }
311
312 #[test]
313 fn test_filter() {
314 let mut container = RowNumberContainer::from_vec(vec![
315 RowNumber::new(1),
316 RowNumber::new(2),
317 RowNumber::new(3),
318 RowNumber::new(4),
319 ]);
320 let mask = BitVec::from_slice(&[true, false, true, false]);
321
322 container.filter(&mask);
323
324 assert_eq!(container.len(), 2);
325 assert_eq!(container.get(0), Some(&RowNumber::new(1)));
326 assert_eq!(container.get(1), Some(&RowNumber::new(3)));
327 }
328
329 #[test]
330 fn test_reorder() {
331 let mut container =
332 RowNumberContainer::from_vec(vec![RowNumber::new(10), RowNumber::new(20), RowNumber::new(30)]);
333 let indices = [2, 0, 1];
334
335 container.reorder(&indices);
336
337 assert_eq!(container.len(), 3);
338 assert_eq!(container.get(0), Some(&RowNumber::new(30))); assert_eq!(container.get(1), Some(&RowNumber::new(10))); assert_eq!(container.get(2), Some(&RowNumber::new(20))); }
342
343 #[test]
344 fn test_reorder_with_out_of_bounds() {
345 let mut container = RowNumberContainer::from_vec(vec![RowNumber::new(1), RowNumber::new(2)]);
346 let indices = [1, 5, 0]; container.reorder(&indices);
349
350 assert_eq!(container.len(), 3);
351 assert_eq!(container.get(0), Some(&RowNumber::new(2))); assert_eq!(container.get(1), None); assert_eq!(container.get(2), Some(&RowNumber::new(1))); }
355
356 #[test]
357 fn test_default() {
358 let container = RowNumberContainer::default();
359 assert_eq!(container.len(), 0);
360 assert!(container.is_empty());
361 }
362
363 #[test]
364 fn test_data_access() {
365 let mut container = RowNumberContainer::from_vec(vec![RowNumber::new(1), RowNumber::new(2)]);
366
367 assert_eq!(container.data().len(), 2);
369
370 container.data_mut().push(RowNumber::new(3));
372 container.bitvec_mut().push(true);
373
374 assert_eq!(container.len(), 3);
375 assert_eq!(container.get(2), Some(&RowNumber::new(3)));
376 }
377}