reifydb_core/value/column/transform/
take.rs1use crate::{util::CowVec, value::column::Columns};
5
6impl<'a> Columns<'a> {
7 pub fn take(&mut self, n: usize) -> crate::Result<()> {
8 if !self.row_numbers.is_empty() {
10 let actual_n = n.min(self.row_numbers.len());
11 let new_row_numbers: Vec<_> = self.row_numbers.iter().take(actual_n).copied().collect();
12 self.row_numbers = CowVec::new(new_row_numbers);
13 }
14
15 let mut columns = Vec::with_capacity(self.len());
17
18 for col in self.iter() {
19 let data = col.data().take(n);
20 columns.push(col.with_new_data(data));
21 }
22
23 self.columns = CowVec::new(columns);
24
25 Ok(())
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32 use crate::value::column::{Column, ColumnData};
33
34 #[test]
35 fn test_bool_column() {
36 let mut test_instance =
37 Columns::new(vec![Column::bool_with_bitvec("flag", [true, true, false], [false, true, true])]);
38
39 test_instance.take(1).unwrap();
40
41 assert_eq!(*test_instance[0].data(), ColumnData::bool_with_bitvec([true], [false]));
42 }
43
44 #[test]
45 fn test_float4_column() {
46 let mut test_instance =
47 Columns::new(vec![Column::float4_with_bitvec("a", [1.0, 2.0, 3.0], [true, false, true])]);
48
49 test_instance.take(2).unwrap();
50
51 assert_eq!(*test_instance[0].data(), ColumnData::float4_with_bitvec([1.0, 2.0], [true, false]));
52 }
53
54 #[test]
55 fn test_float8_column() {
56 let mut test_instance = Columns::new(vec![Column::float8_with_bitvec(
57 "a",
58 [1f64, 2.0, 3.0, 4.0],
59 [true, true, false, true],
60 )]);
61
62 test_instance.take(2).unwrap();
63
64 assert_eq!(*test_instance[0].data(), ColumnData::float8_with_bitvec([1.0, 2.0], [true, true]));
65 }
66
67 #[test]
68 fn test_int1_column() {
69 let mut test_instance =
70 Columns::new(vec![Column::int1_with_bitvec("a", [1, 2, 3], [true, false, true])]);
71
72 test_instance.take(2).unwrap();
73
74 assert_eq!(*test_instance[0].data(), ColumnData::int1_with_bitvec([1, 2], [true, false]));
75 }
76
77 #[test]
78 fn test_int2_column() {
79 let mut test_instance =
80 Columns::new(vec![Column::int2_with_bitvec("a", [1, 2, 3, 4], [true, true, false, true])]);
81
82 test_instance.take(2).unwrap();
83
84 assert_eq!(*test_instance[0].data(), ColumnData::int2_with_bitvec([1, 2], [true, true]));
85 }
86
87 #[test]
88 fn test_int4_column() {
89 let mut test_instance = Columns::new(vec![Column::int4_with_bitvec("a", [1, 2], [true, false])]);
90
91 test_instance.take(1).unwrap();
92
93 assert_eq!(*test_instance[0].data(), ColumnData::int4_with_bitvec([1], [true]));
94 }
95
96 #[test]
97 fn test_int8_column() {
98 let mut test_instance =
99 Columns::new(vec![Column::int8_with_bitvec("a", [1, 2, 3], [false, true, true])]);
100
101 test_instance.take(2).unwrap();
102
103 assert_eq!(*test_instance[0].data(), ColumnData::int8_with_bitvec([1, 2], [false, true]));
104 }
105
106 #[test]
107 fn test_int16_column() {
108 let mut test_instance = Columns::new(vec![Column::int16_with_bitvec("a", [1, 2], [true, true])]);
109
110 test_instance.take(1).unwrap();
111
112 assert_eq!(*test_instance[0].data(), ColumnData::int16_with_bitvec([1], [true]));
113 }
114
115 #[test]
116 fn test_uint1_column() {
117 let mut test_instance =
118 Columns::new(vec![Column::uint1_with_bitvec("a", [1, 2, 3], [false, false, true])]);
119
120 test_instance.take(2).unwrap();
121
122 assert_eq!(*test_instance[0].data(), ColumnData::uint1_with_bitvec([1, 2], [false, false]));
123 }
124
125 #[test]
126 fn test_uint2_column() {
127 let mut test_instance = Columns::new(vec![Column::uint2_with_bitvec("a", [1, 2], [true, false])]);
128
129 test_instance.take(1).unwrap();
130
131 assert_eq!(*test_instance[0].data(), ColumnData::uint2_with_bitvec([1], [true]));
132 }
133
134 #[test]
135 fn test_uint4_column() {
136 let mut test_instance = Columns::new(vec![Column::uint4_with_bitvec("a", [10, 20], [false, true])]);
137
138 test_instance.take(1).unwrap();
139
140 assert_eq!(*test_instance[0].data(), ColumnData::uint4_with_bitvec([10], [false]));
141 }
142
143 #[test]
144 fn test_uint8_column() {
145 let mut test_instance =
146 Columns::new(vec![Column::uint8_with_bitvec("a", [10, 20, 30], [true, true, false])]);
147
148 test_instance.take(2).unwrap();
149
150 assert_eq!(*test_instance[0].data(), ColumnData::uint8_with_bitvec([10, 20], [true, true]));
151 }
152
153 #[test]
154 fn test_uint16_column() {
155 let mut test_instance =
156 Columns::new(vec![Column::uint16_with_bitvec("a", [100, 200, 300], [true, false, true])]);
157
158 test_instance.take(1).unwrap();
159
160 assert_eq!(*test_instance[0].data(), ColumnData::uint16_with_bitvec([100], [true]));
161 }
162
163 #[test]
164 fn test_text_column() {
165 let mut test_instance = Columns::new(vec![Column::utf8_with_bitvec(
166 "t",
167 vec!["a".to_string(), "b".to_string(), "c".to_string()],
168 vec![true, false, true],
169 )]);
170
171 test_instance.take(2).unwrap();
172
173 assert_eq!(
174 *test_instance[0].data(),
175 ColumnData::utf8_with_bitvec(["a".to_string(), "b".to_string()], [true, false])
176 );
177 }
178
179 #[test]
180 fn test_undefined_column() {
181 let mut test_instance = Columns::new(vec![Column::undefined("u", 3)]);
182
183 test_instance.take(2).unwrap();
184
185 match &test_instance[0].data() {
186 ColumnData::Undefined(container) => {
187 assert_eq!(container.len(), 2);
188 }
189 _ => panic!("Expected undefined column"),
190 }
191 }
192
193 #[test]
194 fn test_handles_undefined() {
195 let mut test_instance = Columns::new(vec![Column::undefined("u", 5)]);
196
197 test_instance.take(3).unwrap();
198
199 match &test_instance[0].data() {
200 ColumnData::Undefined(container) => {
201 assert_eq!(container.len(), 3)
202 }
203 _ => panic!("Expected Undefined column"),
204 }
205 }
206
207 #[test]
208 fn test_n_larger_than_len_is_safe() {
209 let mut test_instance = Columns::new(vec![Column::int2_with_bitvec("a", [10, 20], [true, false])]);
210
211 test_instance.take(10).unwrap();
212
213 assert_eq!(*test_instance[0].data(), ColumnData::int2_with_bitvec([10, 20], [true, false]));
214 }
215}