1use vortex_buffer::BufferMut;
7use vortex_dtype::{NativeDecimalType, PrecisionScale};
8use vortex_error::{VortexExpect, VortexResult, vortex_bail};
9use vortex_mask::MaskMut;
10
11use crate::decimal::DVector;
12use crate::{VectorMutOps, VectorOps};
13
14#[derive(Debug, Clone)]
28pub struct DVectorMut<D> {
29 pub(super) ps: PrecisionScale<D>,
31 pub(super) elements: BufferMut<D>,
33 pub(super) validity: MaskMut,
35}
36
37impl<D: NativeDecimalType> DVectorMut<D> {
38 pub fn new(ps: PrecisionScale<D>, elements: BufferMut<D>, validity: MaskMut) -> Self {
48 Self::try_new(ps, elements, validity).vortex_expect("Failed to create `DVector`")
49 }
50
51 pub fn try_new(
61 ps: PrecisionScale<D>,
62 elements: BufferMut<D>,
63 validity: MaskMut,
64 ) -> VortexResult<Self> {
65 if elements.len() != validity.len() {
66 vortex_bail!(
67 "Elements length {} does not match validity length {}",
68 elements.len(),
69 validity.len()
70 );
71 }
72
73 if !elements.iter().all(|e| ps.is_valid(*e)) {
75 vortex_bail!(
76 "One or more elements are out of bounds for precision {} and scale {}",
77 ps.precision(),
78 ps.scale()
79 );
80 }
81
82 Ok(Self {
83 ps,
84 elements,
85 validity,
86 })
87 }
88
89 pub unsafe fn new_unchecked(
99 ps: PrecisionScale<D>,
100 elements: BufferMut<D>,
101 validity: MaskMut,
102 ) -> Self {
103 if cfg!(debug_assertions) {
104 Self::try_new(ps, elements, validity).vortex_expect("Failed to create `DVectorMut`")
105 } else {
106 Self {
107 ps,
108 elements,
109 validity,
110 }
111 }
112 }
113
114 pub fn with_capacity(ps: PrecisionScale<D>, capacity: usize) -> Self {
116 Self {
117 ps,
118 elements: BufferMut::with_capacity(capacity),
119 validity: MaskMut::with_capacity(capacity),
120 }
121 }
122
123 pub fn into_parts(self) -> (PrecisionScale<D>, BufferMut<D>, MaskMut) {
126 (self.ps, self.elements, self.validity)
127 }
128
129 pub fn precision_scale(&self) -> PrecisionScale<D> {
131 self.ps
132 }
133
134 pub fn elements(&self) -> &BufferMut<D> {
136 &self.elements
137 }
138
139 pub unsafe fn elements_mut(&mut self) -> &mut BufferMut<D> {
146 &mut self.elements
147 }
148
149 pub unsafe fn validity_mut(&mut self) -> &mut MaskMut {
156 &mut self.validity
157 }
158
159 pub fn get(&self, index: usize) -> Option<&D> {
172 self.validity.value(index).then(|| &self.elements[index])
173 }
174
175 pub fn try_push(&mut self, value: D) -> VortexResult<()> {
181 self.try_append_n(value, 1)
182 }
183
184 pub fn try_append_n(&mut self, value: D, n: usize) -> VortexResult<()> {
190 if !self.ps.is_valid(value) {
191 vortex_bail!("Value {:?} is out of bounds for {}", value, self.ps);
192 }
193
194 self.elements.push_n(value, n);
195 self.validity.append_n(true, n);
196 Ok(())
197 }
198}
199
200impl<D: NativeDecimalType> AsRef<[D]> for DVectorMut<D> {
201 fn as_ref(&self) -> &[D] {
202 &self.elements
203 }
204}
205
206impl<D: NativeDecimalType> VectorMutOps for DVectorMut<D> {
207 type Immutable = DVector<D>;
208
209 fn len(&self) -> usize {
210 self.elements.len()
211 }
212
213 fn validity(&self) -> &MaskMut {
214 &self.validity
215 }
216
217 fn capacity(&self) -> usize {
218 self.elements.capacity()
219 }
220
221 fn reserve(&mut self, additional: usize) {
222 self.elements.reserve(additional);
223 self.validity.reserve(additional);
224 }
225
226 fn clear(&mut self) {
227 self.elements.clear();
228 self.validity.clear();
229 }
230
231 fn truncate(&mut self, len: usize) {
232 self.elements.truncate(len);
233 self.validity.truncate(len);
234 }
235
236 fn extend_from_vector(&mut self, other: &DVector<D>) {
237 self.elements.extend_from_slice(&other.elements);
238 self.validity.append_mask(other.validity());
239 }
240
241 fn append_nulls(&mut self, n: usize) {
242 self.elements.extend((0..n).map(|_| D::default()));
243 self.validity.append_n(false, n);
244 }
245
246 fn freeze(self) -> DVector<D> {
247 DVector {
248 ps: self.ps,
249 elements: self.elements.freeze(),
250 validity: self.validity.freeze(),
251 }
252 }
253
254 fn split_off(&mut self, at: usize) -> Self {
255 DVectorMut {
256 ps: self.ps,
257 elements: self.elements.split_off(at),
258 validity: self.validity.split_off(at),
259 }
260 }
261
262 fn unsplit(&mut self, other: Self) {
263 if self.is_empty() {
264 *self = other;
265 return;
266 }
267 self.elements.unsplit(other.elements);
268 self.validity.unsplit(other.validity);
269 }
270}
271
272#[cfg(test)]
273mod tests {
274 use super::*;
275
276 #[test]
277 fn test_construction_and_validation() {
278 let ps_i32 = PrecisionScale::<i32>::new(9, 2);
280 let vec_i32 = DVectorMut::<i32>::with_capacity(ps_i32, 10);
281 assert_eq!(vec_i32.len(), 0);
282 assert!(vec_i32.capacity() >= 10);
283
284 let ps_i64 = PrecisionScale::<i64>::new(18, 4);
285 let vec_i64 = DVectorMut::<i64>::with_capacity(ps_i64, 5);
286 assert_eq!(vec_i64.len(), 0);
287 assert!(vec_i64.capacity() >= 5);
288
289 let ps_i128 = PrecisionScale::<i128>::new(38, 10);
290 let vec_i128 = DVectorMut::<i128>::with_capacity(ps_i128, 3);
291 assert_eq!(vec_i128.len(), 0);
292 assert!(vec_i128.capacity() >= 3);
293
294 let ps = ps_i32;
296 let elements = BufferMut::from_iter([100_i32, 200, 300]);
297 let validity = MaskMut::new_true(3);
298 let vec = DVectorMut::try_new(ps, elements, validity).unwrap();
299 assert_eq!(vec.len(), 3);
300 assert_eq!(vec.precision_scale().precision(), 9);
301 assert_eq!(vec.precision_scale().scale(), 2);
302
303 let elements_bad = BufferMut::from_iter([100_i32, 200]);
305 let validity_bad = MaskMut::new_true(3);
306 let result = DVectorMut::try_new(ps, elements_bad, validity_bad);
307 assert!(result.is_err());
308
309 let too_large = 10_i32.pow(9); let elements_oob = BufferMut::from_iter([100_i32, too_large, 300]);
312 let validity_oob = MaskMut::new_true(3);
313 let result = DVectorMut::try_new(ps, elements_oob, validity_oob);
314 assert!(result.is_err());
315
316 let elements_unchecked = BufferMut::from_iter([100_i32, 200]);
318 let validity_unchecked = MaskMut::new_true(2);
319 let vec_unchecked =
320 unsafe { DVectorMut::new_unchecked(ps, elements_unchecked, validity_unchecked) };
321 assert_eq!(vec_unchecked.len(), 2);
322 }
323
324 #[test]
325 fn test_push_append_and_access() {
326 let ps = PrecisionScale::<i32>::new(9, 2);
327 let mut vec = DVectorMut::<i32>::with_capacity(ps, 10);
328
329 vec.try_push(12345).unwrap(); vec.try_push(9999).unwrap(); vec.try_push(-5000).unwrap(); assert_eq!(vec.len(), 3);
334
335 let too_large = 10_i32.pow(9);
337 assert!(vec.try_push(too_large).is_err());
338 assert_eq!(vec.len(), 3); assert_eq!(vec.get(0), Some(&12345));
342 assert_eq!(vec.get(1), Some(&9999));
343 assert_eq!(vec.get(2), Some(&-5000));
344
345 vec.append_nulls(2);
347 assert_eq!(vec.len(), 5);
348 assert_eq!(vec.get(3), None);
349 assert_eq!(vec.get(4), None);
350
351 let slice = vec.as_ref();
353 assert_eq!(slice.len(), 5);
354 assert_eq!(slice[0], 12345);
355 assert_eq!(slice[1], 9999);
356 assert_eq!(slice[2], -5000);
357 }
359
360 #[test]
361 fn test_vector_mut_ops_comprehensive() {
362 let ps = PrecisionScale::<i64>::new(10, 3);
363 let mut vec1 = DVectorMut::<i64>::with_capacity(ps, 10);
364 vec1.try_push(1000000).unwrap(); vec1.try_push(2000000).unwrap(); vec1.try_push(3000000).unwrap(); vec1.try_push(4000000).unwrap(); let mut vec2 = DVectorMut::<i64>::with_capacity(ps, 10);
371 vec2.try_push(5000000).unwrap(); vec2.try_push(6000000).unwrap(); let frozen_vec2 = vec2.freeze();
374
375 let original_len = vec1.len();
376 vec1.extend_from_vector(&frozen_vec2);
377 assert_eq!(vec1.len(), original_len + frozen_vec2.len());
378 assert_eq!(vec1.get(4), Some(&5000000));
379 assert_eq!(vec1.get(5), Some(&6000000));
380
381 vec1.append_nulls(2); assert_eq!(vec1.len(), 8);
384
385 let split = vec1.split_off(5);
386 assert_eq!(vec1.len(), 5);
387 assert_eq!(split.len(), 3);
388
389 assert_eq!(split.get(0), Some(&6000000)); assert_eq!(split.get(1), None); assert_eq!(split.get(2), None); let initial_capacity = vec1.capacity();
396 vec1.reserve(20);
397 assert!(vec1.capacity() >= initial_capacity + 20);
398
399 assert_eq!(vec1.len(), 5);
401 assert!(vec1.capacity() >= 25);
402
403 vec1.unsplit(split);
405 assert_eq!(vec1.len(), 8);
406 assert_eq!(vec1.get(6), None); assert_eq!(vec1.get(7), None); }
409
410 #[test]
411 fn test_freeze_and_immutable_vector() {
412 let ps = PrecisionScale::<i64>::new(15, 5);
413 let mut vec_mut = DVectorMut::<i64>::with_capacity(ps, 5);
414
415 vec_mut.try_push(1234567890).unwrap(); vec_mut.try_push(9876543210).unwrap(); vec_mut.append_nulls(1);
419 vec_mut.try_push(5555555555).unwrap(); vec_mut.append_nulls(1);
421
422 let vec_immutable = vec_mut.freeze();
424 assert_eq!(vec_immutable.len(), 5);
425
426 assert_eq!(vec_immutable.get(0), Some(&1234567890));
428 assert_eq!(vec_immutable.get(1), Some(&9876543210));
429 assert_eq!(vec_immutable.get(2), None); assert_eq!(vec_immutable.get(3), Some(&5555555555));
431 assert_eq!(vec_immutable.get(4), None); let slice = vec_immutable.as_ref();
435 assert_eq!(slice.len(), 5);
436 assert_eq!(slice[0], 1234567890);
437 assert_eq!(slice[3], 5555555555);
438
439 assert_eq!(vec_immutable.precision_scale().precision(), 15);
441 assert_eq!(vec_immutable.precision_scale().scale(), 5);
442
443 let mut vec_mut_again = match vec_immutable.try_into_mut() {
445 Ok(v) => v,
446 Err(_) => {
447 let ps = PrecisionScale::<i64>::new(15, 5);
450 let mut new_vec = DVectorMut::<i64>::with_capacity(ps, 6);
451 new_vec.try_push(1234567890).unwrap();
452 new_vec.try_push(9876543210).unwrap();
453 new_vec.append_nulls(1);
454 new_vec.try_push(5555555555).unwrap();
455 new_vec.append_nulls(1);
456 new_vec
457 }
458 };
459
460 assert_eq!(vec_mut_again.len(), 5);
461 vec_mut_again.try_push(7777777777).unwrap(); assert_eq!(vec_mut_again.len(), 6);
463
464 let vec_final = vec_mut_again.freeze();
466 assert_eq!(vec_final.len(), 6);
467 assert_eq!(vec_final.get(5), Some(&7777777777));
468 }
469
470 #[test]
471 fn test_precision_scale_combinations() {
472 let ps_9_2 = PrecisionScale::<i32>::new(9, 2);
474 let mut vec_9_2 = DVectorMut::<i32>::with_capacity(ps_9_2, 5);
475 vec_9_2.try_push(999999999).unwrap(); assert!(vec_9_2.try_push(1000000000).is_err()); assert!(vec_9_2.try_push(-999999999).is_ok()); assert_eq!(vec_9_2.len(), 2);
479
480 let ps_38_10 = PrecisionScale::<i128>::new(38, 10);
482 let mut vec_38_10 = DVectorMut::<i128>::with_capacity(ps_38_10, 3);
483 let large_value = 10_i128.pow(28) - 1; vec_38_10.try_push(large_value).unwrap();
485 assert_eq!(vec_38_10.len(), 1);
486
487 let ps_4_0 = PrecisionScale::<i16>::new(4, 0);
489 let mut vec_4_0 = DVectorMut::<i16>::with_capacity(ps_4_0, 5);
490 vec_4_0.try_push(9999).unwrap(); assert!(vec_4_0.try_push(10000).is_err()); vec_4_0.try_push(-9999).unwrap(); assert_eq!(vec_4_0.len(), 2);
494
495 let ps_2_1 = PrecisionScale::<i8>::new(2, 1);
498 let mut vec_i8 = DVectorMut::<i8>::with_capacity(ps_2_1, 3);
499 vec_i8.try_push(99).unwrap(); assert!(vec_i8.try_push(100).is_err()); let ps_4_2 = PrecisionScale::<i16>::new(4, 2);
504 let mut vec_i16 = DVectorMut::<i16>::with_capacity(ps_4_2, 3);
505 vec_i16.try_push(999).unwrap(); vec_i16.try_push(9999).unwrap(); assert_eq!(vec_i16.len(), 2);
508 }
509
510 #[test]
511 fn test_empty_and_edge_cases() {
512 let ps = PrecisionScale::<i32>::new(9, 2);
513
514 let empty_vec = DVectorMut::<i32>::with_capacity(ps, 0);
516 assert_eq!(empty_vec.len(), 0);
517 let _ = empty_vec.capacity(); let frozen_empty = empty_vec.freeze();
522 assert_eq!(frozen_empty.len(), 0);
523
524 let mut single = DVectorMut::<i32>::with_capacity(ps, 1);
526 single.try_push(42).unwrap();
527 assert_eq!(single.len(), 1);
528 assert_eq!(single.get(0), Some(&42));
529
530 let split_single = single.split_off(1);
533 assert_eq!(single.len(), 1); assert_eq!(split_single.len(), 0); let mut all_nulls = DVectorMut::<i32>::with_capacity(ps, 5);
538 all_nulls.append_nulls(5);
539 assert_eq!(all_nulls.len(), 5);
540 for i in 0..5 {
541 assert_eq!(all_nulls.get(i), None);
542 }
543
544 let frozen_nulls = all_nulls.freeze();
546 assert_eq!(frozen_nulls.len(), 5);
547 for i in 0..5 {
548 assert_eq!(frozen_nulls.get(i), None);
549 }
550
551 let mut large = DVectorMut::<i32>::with_capacity(ps, 1000);
553 for _ in 0..1000 {
554 large.try_push(999).unwrap();
555 }
556 assert_eq!(large.len(), 1000);
557 assert!(large.capacity() >= 1000);
558 }
559
560 #[test]
561 fn test_nulls_with_validity_mask() {
562 let ps = PrecisionScale::<i32>::new(8, 3);
563
564 let elements = BufferMut::from_iter([1000_i32, 0, 2000, 0, 3000]); let mut validity = MaskMut::with_capacity(5);
567 validity.append_n(true, 1); validity.append_n(false, 1); validity.append_n(true, 1); validity.append_n(false, 1); validity.append_n(true, 1); let mut vec = DVectorMut::new(ps, elements, validity);
573
574 assert_eq!(vec.len(), 5);
575 assert_eq!(vec.get(0), Some(&1000)); assert_eq!(vec.get(1), None); assert_eq!(vec.get(2), Some(&2000)); assert_eq!(vec.get(3), None); assert_eq!(vec.get(4), Some(&3000)); vec.try_push(4000).unwrap();
583 vec.append_nulls(2);
584 assert_eq!(vec.len(), 8);
585 assert_eq!(vec.get(5), Some(&4000));
586 assert_eq!(vec.get(6), None);
587 assert_eq!(vec.get(7), None);
588
589 let split = vec.split_off(4);
591 assert_eq!(vec.len(), 4);
592 assert_eq!(split.len(), 4);
593
594 assert_eq!(vec.get(1), None);
596 assert_eq!(vec.get(3), None);
597
598 assert_eq!(split.get(0), Some(&3000));
600 assert_eq!(split.get(1), Some(&4000));
601 assert_eq!(split.get(2), None);
602 assert_eq!(split.get(3), None);
603 }
604}