nullvec/nullvec/
nullvec_scalar.rs1use generic::Scalar;
2use nullvec::NullVec;
3use traits::NullStorable;
4
5impl Default for Scalar {
7 fn default() -> Scalar {
8 Scalar::Null
9 }
10}
11
12impl NullStorable for Scalar {
13 fn has_primitive_null() -> bool {
14 true
15 }
16
17 fn is_null(&self) -> bool {
18 match self {
19 &Scalar::Null => true,
20 _ => false,
21 }
22 }
23}
24
25
26impl Into<Vec<Scalar>> for NullVec<Scalar> {
27 fn into(self: NullVec<Scalar>) -> Vec<Scalar> {
28 match &self.mask {
30 &None => self.data,
31 &Some(ref mask) => {
32 self.data
33 .into_iter()
34 .zip(mask.iter())
35 .map(|(v, &m)| if m == true { Scalar::Null } else { v })
36 .collect()
37 }
38 }
39 }
40}
41
42
43#[cfg(test)]
44mod tests {
45
46 use nullvec::NullVec;
47 use generic::Scalar;
48
49 #[test]
50 fn test_scalar_to_nullvec() {
51 let v = vec![Scalar::i64(1), Scalar::f64(2.)];
53 let nv = NullVec::new(v);
54 assert_eq!(nv.data, vec![Scalar::i64(1), Scalar::f64(2.)]);
55 assert_eq!(nv.mask, None);
56
57 let v = vec![Scalar::i64(1), Scalar::Null];
58 let nv = NullVec::new(v);
59 assert_eq!(nv.data, vec![Scalar::i64(1), Scalar::Null]);
60 assert_eq!(nv.mask, Some(vec![false, true]));
61 }
62
63 #[test]
64 fn test_scalar_conv_from_vec() {
65 let v = vec![Scalar::i64(1), Scalar::f64(2.)];
67 let nv: NullVec<Scalar> = v.into();
68 assert_eq!(nv.data, vec![Scalar::i64(1), Scalar::f64(2.)]);
69 assert_eq!(nv.mask, None);
70 let res: Vec<Scalar> = nv.into();
71 assert_eq!(res, vec![Scalar::i64(1), Scalar::f64(2.)]);
72
73 let v = vec![Scalar::i64(1), Scalar::Null];
74 let nv: NullVec<Scalar> = v.into();
75 assert_eq!(nv.data, vec![Scalar::i64(1), Scalar::Null]);
76 assert_eq!(nv.mask, Some(vec![false, true]));
77 let res: Vec<Scalar> = nv.into();
78 assert_eq!(res, vec![Scalar::i64(1), Scalar::Null]);
79 }
80}