reifydb_core/value/column/transform/
take.rs1use 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 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 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 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 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}