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