reifydb_core/value/container/
row_number.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use 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		// All should be defined
222		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); // undefined
248		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); // undefined
281		assert_eq!(container.get(2), None); // undefined
282	}
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]); // middle value undefined
291		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))); // was index 2
339		assert_eq!(container.get(1), Some(&RowNumber::new(10))); // was index 0
340		assert_eq!(container.get(2), Some(&RowNumber::new(20))); // was index 1
341	}
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]; // index 5 is out of bounds
347
348		container.reorder(&indices);
349
350		assert_eq!(container.len(), 3);
351		assert_eq!(container.get(0), Some(&RowNumber::new(2))); // was index 1
352		assert_eq!(container.get(1), None); // out of bounds -> undefined
353		assert_eq!(container.get(2), Some(&RowNumber::new(1))); // was index 0
354	}
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		// Test immutable access
368		assert_eq!(container.data().len(), 2);
369
370		// Test mutable access
371		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}