Skip to main content

reifydb_core/value/column/transform/
take.rs

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