Skip to main content

reifydb_core/value/column/transform/
take.rs

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