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