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 using the `DeserializedOwned` trait
73    #[test]
74    fn test_serde_df_owned_json() {
75        let df = sample_dataframe();
76        let json = serde_json::to_string(&df).unwrap();
77
78        let out = serde_json::from_reader::<_, DataFrame>(json.as_bytes()).unwrap(); // uses `DeserializeOwned`
79        assert!(df.equals_missing(&out));
80    }
81
82    // STRUCT REFACTOR
83    #[ignore]
84    #[test]
85    #[cfg(feature = "dtype-struct")]
86    fn test_serde_struct_series_owned_json() {
87        let row_1 = AnyValue::StructOwned(Box::new((
88            vec![
89                AnyValue::String("1:1"),
90                AnyValue::Null,
91                AnyValue::String("1:3"),
92            ],
93            vec![
94                Field::new("fld_1".into(), DataType::String),
95                Field::new("fld_2".into(), DataType::String),
96                Field::new("fld_3".into(), DataType::String),
97            ],
98        )));
99        let dtype = DataType::Struct(vec![
100            Field::new("fld_1".into(), DataType::String),
101            Field::new("fld_2".into(), DataType::String),
102            Field::new("fld_3".into(), DataType::String),
103        ]);
104        let row_2 = AnyValue::StructOwned(Box::new((
105            vec![
106                AnyValue::String("2:1"),
107                AnyValue::String("2:2"),
108                AnyValue::String("2:3"),
109            ],
110            vec![
111                Field::new("fld_1".into(), DataType::String),
112                Field::new("fld_2".into(), DataType::String),
113                Field::new("fld_3".into(), DataType::String),
114            ],
115        )));
116        let row_3 = AnyValue::Null;
117
118        let s =
119            Series::from_any_values_and_dtype("item".into(), &[row_1, row_2, row_3], &dtype, false)
120                .unwrap();
121        let df = DataFrame::new(vec![s.into()]).unwrap();
122
123        let df_str = serde_json::to_string(&df).unwrap();
124        let out = serde_json::from_str::<DataFrame>(&df_str).unwrap();
125        assert!(df.equals_missing(&out));
126    }
127}