polars_core/serde/
mod.rs

1pub mod chunked_array;
2mod df;
3pub mod series;
4
5#[cfg(test)]
6mod test {
7    use crate::chunked_array::flags::StatisticsFlags;
8    use crate::prelude::*;
9    use crate::series::IsSorted;
10
11    #[test]
12    fn test_serde() -> PolarsResult<()> {
13        let ca = UInt32Chunked::new("foo".into(), &[Some(1), None, Some(2)]);
14
15        let json = serde_json::to_string(&ca.clone().into_series()).unwrap();
16
17        let out = serde_json::from_str::<Series>(&json).unwrap();
18        assert!(ca.into_series().equals_missing(&out));
19
20        let ca = StringChunked::new("foo".into(), &[Some("foo"), None, Some("bar")]);
21
22        let json = serde_json::to_string(&ca.clone().into_series()).unwrap();
23
24        let out = serde_json::from_str::<Series>(&json).unwrap(); // uses `Deserialize<'de>`
25        assert!(ca.into_series().equals_missing(&out));
26
27        Ok(())
28    }
29
30    /// test using the `DeserializedOwned` trait
31    #[test]
32    fn test_serde_owned() {
33        let ca = UInt32Chunked::new("foo".into(), &[Some(1), None, Some(2)]);
34
35        let json = serde_json::to_string(&ca.clone().into_series()).unwrap();
36
37        let out = serde_json::from_reader::<_, Series>(json.as_bytes()).unwrap(); // uses `DeserializeOwned`
38        assert!(ca.into_series().equals_missing(&out));
39    }
40
41    fn sample_dataframe() -> DataFrame {
42        let s1 = Series::new("foo".into(), &[1, 2, 3]);
43        let s2 = Series::new("bar".into(), &[Some(true), None, Some(false)]);
44        let s3 = Series::new("string".into(), &["mouse", "elephant", "dog"]);
45        let s_list = Column::new("list".into(), &[s1.clone(), s1.clone(), s1.clone()]);
46
47        DataFrame::new(vec![s1.into(), s2.into(), s3.into(), s_list]).unwrap()
48    }
49
50    #[test]
51    fn test_serde_flags() {
52        let df = sample_dataframe();
53
54        for mut column in df.columns {
55            column.set_sorted_flag(IsSorted::Descending);
56            let json = serde_json::to_string(&column).unwrap();
57            let out = serde_json::from_reader::<_, Column>(json.as_bytes()).unwrap();
58            let f = out.get_flags();
59            assert_ne!(f, StatisticsFlags::empty());
60            assert_eq!(column.get_flags(), out.get_flags());
61        }
62    }
63
64    #[test]
65    fn test_serde_df_json() {
66        let df = sample_dataframe();
67        let json = serde_json::to_string(&df).unwrap();
68        let out = serde_json::from_str::<DataFrame>(&json).unwrap(); // uses `Deserialize<'de>`
69        assert!(df.equals_missing(&out));
70    }
71
72    #[test]
73    fn test_serde_df_bincode() {
74        let df = sample_dataframe();
75        let bytes = bincode::serialize(&df).unwrap();
76        let out = bincode::deserialize::<DataFrame>(&bytes).unwrap(); // uses `Deserialize<'de>`
77        assert!(df.equals_missing(&out));
78    }
79
80    /// test using the `DeserializedOwned` trait
81    #[test]
82    fn test_serde_df_owned_json() {
83        let df = sample_dataframe();
84        let json = serde_json::to_string(&df).unwrap();
85
86        let out = serde_json::from_reader::<_, DataFrame>(json.as_bytes()).unwrap(); // uses `DeserializeOwned`
87        assert!(df.equals_missing(&out));
88    }
89
90    #[test]
91    fn test_serde_binary_series_owned_bincode() {
92        let s1 = Column::new(
93            "foo".into(),
94            &[
95                vec![1u8, 2u8, 3u8],
96                vec![4u8, 5u8, 6u8, 7u8],
97                vec![8u8, 9u8],
98            ],
99        );
100        let df = DataFrame::new(vec![s1]).unwrap();
101        let bytes = bincode::serialize(&df).unwrap();
102        let out = bincode::deserialize_from::<_, DataFrame>(bytes.as_slice()).unwrap();
103        assert!(df.equals_missing(&out));
104    }
105
106    // STRUCT REFACTOR
107    #[ignore]
108    #[test]
109    #[cfg(feature = "dtype-struct")]
110    fn test_serde_struct_series_owned_json() {
111        let row_1 = AnyValue::StructOwned(Box::new((
112            vec![
113                AnyValue::String("1:1"),
114                AnyValue::Null,
115                AnyValue::String("1:3"),
116            ],
117            vec![
118                Field::new("fld_1".into(), DataType::String),
119                Field::new("fld_2".into(), DataType::String),
120                Field::new("fld_3".into(), DataType::String),
121            ],
122        )));
123        let dtype = DataType::Struct(vec![
124            Field::new("fld_1".into(), DataType::String),
125            Field::new("fld_2".into(), DataType::String),
126            Field::new("fld_3".into(), DataType::String),
127        ]);
128        let row_2 = AnyValue::StructOwned(Box::new((
129            vec![
130                AnyValue::String("2:1"),
131                AnyValue::String("2:2"),
132                AnyValue::String("2:3"),
133            ],
134            vec![
135                Field::new("fld_1".into(), DataType::String),
136                Field::new("fld_2".into(), DataType::String),
137                Field::new("fld_3".into(), DataType::String),
138            ],
139        )));
140        let row_3 = AnyValue::Null;
141
142        let s =
143            Series::from_any_values_and_dtype("item".into(), &[row_1, row_2, row_3], &dtype, false)
144                .unwrap();
145        let df = DataFrame::new(vec![s.into()]).unwrap();
146
147        let df_str = serde_json::to_string(&df).unwrap();
148        let out = serde_json::from_str::<DataFrame>(&df_str).unwrap();
149        assert!(df.equals_missing(&out));
150    }
151    /// test using the `DeserializedOwned` trait
152    #[test]
153    fn test_serde_df_owned_bincode() {
154        let df = sample_dataframe();
155        let bytes = bincode::serialize(&df).unwrap();
156        let out = bincode::deserialize_from::<_, DataFrame>(bytes.as_slice()).unwrap(); // uses `DeserializeOwned`
157        assert!(df.equals_missing(&out));
158    }
159}