nullvec/nullvec/
nullvec_scalar.rs

1use generic::Scalar;
2use nullvec::NullVec;
3use traits::NullStorable;
4
5// allow to store Scalar to NullVec
6impl 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        // ToDo: check has_primitive_null and return type null
29        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        // test here to check nullvec internal
52        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        // test here to check nullvec internal
66        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}