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 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}