reifydb_core/value/column/transform/
take.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 crate::{util::CowVec, value::column::Columns};
5
6impl<'a> Columns<'a> {
7	pub fn take(&mut self, n: usize) -> crate::Result<()> {
8		// Take the first n encoded numbers
9		if !self.row_numbers.is_empty() {
10			let actual_n = n.min(self.row_numbers.len());
11			let new_row_numbers: Vec<_> = self.row_numbers.iter().take(actual_n).copied().collect();
12			self.row_numbers = CowVec::new(new_row_numbers);
13		}
14
15		// Take the first n rows from columns
16		let mut columns = Vec::with_capacity(self.len());
17
18		for col in self.iter() {
19			let data = col.data().take(n);
20			columns.push(col.with_new_data(data));
21		}
22
23		self.columns = CowVec::new(columns);
24
25		Ok(())
26	}
27}
28
29#[cfg(test)]
30mod tests {
31	use super::*;
32	use crate::value::column::{Column, ColumnData};
33
34	#[test]
35	fn test_bool_column() {
36		let mut test_instance =
37			Columns::new(vec![Column::bool_with_bitvec("flag", [true, true, false], [false, true, true])]);
38
39		test_instance.take(1).unwrap();
40
41		assert_eq!(*test_instance[0].data(), ColumnData::bool_with_bitvec([true], [false]));
42	}
43
44	#[test]
45	fn test_float4_column() {
46		let mut test_instance =
47			Columns::new(vec![Column::float4_with_bitvec("a", [1.0, 2.0, 3.0], [true, false, true])]);
48
49		test_instance.take(2).unwrap();
50
51		assert_eq!(*test_instance[0].data(), ColumnData::float4_with_bitvec([1.0, 2.0], [true, false]));
52	}
53
54	#[test]
55	fn test_float8_column() {
56		let mut test_instance = Columns::new(vec![Column::float8_with_bitvec(
57			"a",
58			[1f64, 2.0, 3.0, 4.0],
59			[true, true, false, true],
60		)]);
61
62		test_instance.take(2).unwrap();
63
64		assert_eq!(*test_instance[0].data(), ColumnData::float8_with_bitvec([1.0, 2.0], [true, true]));
65	}
66
67	#[test]
68	fn test_int1_column() {
69		let mut test_instance =
70			Columns::new(vec![Column::int1_with_bitvec("a", [1, 2, 3], [true, false, true])]);
71
72		test_instance.take(2).unwrap();
73
74		assert_eq!(*test_instance[0].data(), ColumnData::int1_with_bitvec([1, 2], [true, false]));
75	}
76
77	#[test]
78	fn test_int2_column() {
79		let mut test_instance =
80			Columns::new(vec![Column::int2_with_bitvec("a", [1, 2, 3, 4], [true, true, false, true])]);
81
82		test_instance.take(2).unwrap();
83
84		assert_eq!(*test_instance[0].data(), ColumnData::int2_with_bitvec([1, 2], [true, true]));
85	}
86
87	#[test]
88	fn test_int4_column() {
89		let mut test_instance = Columns::new(vec![Column::int4_with_bitvec("a", [1, 2], [true, false])]);
90
91		test_instance.take(1).unwrap();
92
93		assert_eq!(*test_instance[0].data(), ColumnData::int4_with_bitvec([1], [true]));
94	}
95
96	#[test]
97	fn test_int8_column() {
98		let mut test_instance =
99			Columns::new(vec![Column::int8_with_bitvec("a", [1, 2, 3], [false, true, true])]);
100
101		test_instance.take(2).unwrap();
102
103		assert_eq!(*test_instance[0].data(), ColumnData::int8_with_bitvec([1, 2], [false, true]));
104	}
105
106	#[test]
107	fn test_int16_column() {
108		let mut test_instance = Columns::new(vec![Column::int16_with_bitvec("a", [1, 2], [true, true])]);
109
110		test_instance.take(1).unwrap();
111
112		assert_eq!(*test_instance[0].data(), ColumnData::int16_with_bitvec([1], [true]));
113	}
114
115	#[test]
116	fn test_uint1_column() {
117		let mut test_instance =
118			Columns::new(vec![Column::uint1_with_bitvec("a", [1, 2, 3], [false, false, true])]);
119
120		test_instance.take(2).unwrap();
121
122		assert_eq!(*test_instance[0].data(), ColumnData::uint1_with_bitvec([1, 2], [false, false]));
123	}
124
125	#[test]
126	fn test_uint2_column() {
127		let mut test_instance = Columns::new(vec![Column::uint2_with_bitvec("a", [1, 2], [true, false])]);
128
129		test_instance.take(1).unwrap();
130
131		assert_eq!(*test_instance[0].data(), ColumnData::uint2_with_bitvec([1], [true]));
132	}
133
134	#[test]
135	fn test_uint4_column() {
136		let mut test_instance = Columns::new(vec![Column::uint4_with_bitvec("a", [10, 20], [false, true])]);
137
138		test_instance.take(1).unwrap();
139
140		assert_eq!(*test_instance[0].data(), ColumnData::uint4_with_bitvec([10], [false]));
141	}
142
143	#[test]
144	fn test_uint8_column() {
145		let mut test_instance =
146			Columns::new(vec![Column::uint8_with_bitvec("a", [10, 20, 30], [true, true, false])]);
147
148		test_instance.take(2).unwrap();
149
150		assert_eq!(*test_instance[0].data(), ColumnData::uint8_with_bitvec([10, 20], [true, true]));
151	}
152
153	#[test]
154	fn test_uint16_column() {
155		let mut test_instance =
156			Columns::new(vec![Column::uint16_with_bitvec("a", [100, 200, 300], [true, false, true])]);
157
158		test_instance.take(1).unwrap();
159
160		assert_eq!(*test_instance[0].data(), ColumnData::uint16_with_bitvec([100], [true]));
161	}
162
163	#[test]
164	fn test_text_column() {
165		let mut test_instance = Columns::new(vec![Column::utf8_with_bitvec(
166			"t",
167			vec!["a".to_string(), "b".to_string(), "c".to_string()],
168			vec![true, false, true],
169		)]);
170
171		test_instance.take(2).unwrap();
172
173		assert_eq!(
174			*test_instance[0].data(),
175			ColumnData::utf8_with_bitvec(["a".to_string(), "b".to_string()], [true, false])
176		);
177	}
178
179	#[test]
180	fn test_undefined_column() {
181		let mut test_instance = Columns::new(vec![Column::undefined("u", 3)]);
182
183		test_instance.take(2).unwrap();
184
185		match &test_instance[0].data() {
186			ColumnData::Undefined(container) => {
187				assert_eq!(container.len(), 2);
188			}
189			_ => panic!("Expected undefined column"),
190		}
191	}
192
193	#[test]
194	fn test_handles_undefined() {
195		let mut test_instance = Columns::new(vec![Column::undefined("u", 5)]);
196
197		test_instance.take(3).unwrap();
198
199		match &test_instance[0].data() {
200			ColumnData::Undefined(container) => {
201				assert_eq!(container.len(), 3)
202			}
203			_ => panic!("Expected Undefined column"),
204		}
205	}
206
207	#[test]
208	fn test_n_larger_than_len_is_safe() {
209		let mut test_instance = Columns::new(vec![Column::int2_with_bitvec("a", [10, 20], [true, false])]);
210
211		test_instance.take(10).unwrap();
212
213		assert_eq!(*test_instance[0].data(), ColumnData::int2_with_bitvec([10, 20], [true, false]));
214	}
215}