LCOV - code coverage report
Current view: top level - libs/pageserver_api/src/models - partitioning.rs (source / functions) Coverage Total Hit
Test: fcf55189004bd3119eed75e2873a97da8078700c.info Lines: 100.0 % 101 101
Test Date: 2024-06-25 12:07:31 Functions: 28.8 % 52 15

            Line data    Source code
       1              : use utils::lsn::Lsn;
       2              : 
       3              : use crate::keyspace::SparseKeySpace;
       4              : 
       5              : #[derive(Debug, PartialEq, Eq)]
       6              : pub struct Partitioning {
       7              :     pub keys: crate::keyspace::KeySpace,
       8              :     pub sparse_keys: crate::keyspace::SparseKeySpace,
       9              :     pub at_lsn: Lsn,
      10              : }
      11              : 
      12              : impl serde::Serialize for Partitioning {
      13            2 :     fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
      14            2 :     where
      15            2 :         S: serde::Serializer,
      16            2 :     {
      17              :         pub struct KeySpace<'a>(&'a crate::keyspace::KeySpace);
      18              : 
      19              :         impl<'a> serde::Serialize for KeySpace<'a> {
      20            4 :             fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
      21            4 :             where
      22            4 :                 S: serde::Serializer,
      23            4 :             {
      24              :                 use serde::ser::SerializeSeq;
      25            4 :                 let mut seq = serializer.serialize_seq(Some(self.0.ranges.len()))?;
      26           12 :                 for kr in &self.0.ranges {
      27            8 :                     seq.serialize_element(&KeyRange(kr))?;
      28              :                 }
      29            4 :                 seq.end()
      30            4 :             }
      31              :         }
      32              : 
      33              :         use serde::ser::SerializeMap;
      34            2 :         let mut map = serializer.serialize_map(Some(2))?;
      35            2 :         map.serialize_key("keys")?;
      36            2 :         map.serialize_value(&KeySpace(&self.keys))?;
      37            2 :         map.serialize_key("sparse_keys")?;
      38            2 :         map.serialize_value(&KeySpace(&self.sparse_keys.0))?;
      39            2 :         map.serialize_key("at_lsn")?;
      40            2 :         map.serialize_value(&WithDisplay(&self.at_lsn))?;
      41            2 :         map.end()
      42            2 :     }
      43              : }
      44              : 
      45              : pub struct WithDisplay<'a, T>(&'a T);
      46              : 
      47              : impl<'a, T: std::fmt::Display> serde::Serialize for WithDisplay<'a, T> {
      48           18 :     fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
      49           18 :     where
      50           18 :         S: serde::Serializer,
      51           18 :     {
      52           18 :         serializer.collect_str(&self.0)
      53           18 :     }
      54              : }
      55              : 
      56              : pub struct KeyRange<'a>(&'a std::ops::Range<crate::key::Key>);
      57              : 
      58              : impl<'a> serde::Serialize for KeyRange<'a> {
      59            8 :     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
      60            8 :     where
      61            8 :         S: serde::Serializer,
      62            8 :     {
      63              :         use serde::ser::SerializeTuple;
      64            8 :         let mut t = serializer.serialize_tuple(2)?;
      65            8 :         t.serialize_element(&WithDisplay(&self.0.start))?;
      66            8 :         t.serialize_element(&WithDisplay(&self.0.end))?;
      67            8 :         t.end()
      68            8 :     }
      69              : }
      70              : 
      71              : impl<'a> serde::Deserialize<'a> for Partitioning {
      72            2 :     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
      73            2 :     where
      74            2 :         D: serde::Deserializer<'a>,
      75            2 :     {
      76              :         pub struct KeySpace(crate::keyspace::KeySpace);
      77              : 
      78              :         impl<'de> serde::Deserialize<'de> for KeySpace {
      79            4 :             fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
      80            4 :             where
      81            4 :                 D: serde::Deserializer<'de>,
      82            4 :             {
      83              :                 #[serde_with::serde_as]
      84           16 :                 #[derive(serde::Deserialize)]
      85              :                 #[serde(transparent)]
      86              :                 struct Key(#[serde_as(as = "serde_with::DisplayFromStr")] crate::key::Key);
      87              : 
      88              :                 #[serde_with::serde_as]
      89            8 :                 #[derive(serde::Deserialize)]
      90              :                 struct Range(Key, Key);
      91              : 
      92            4 :                 let ranges: Vec<Range> = serde::Deserialize::deserialize(deserializer)?;
      93            4 :                 Ok(Self(crate::keyspace::KeySpace {
      94            4 :                     ranges: ranges
      95            4 :                         .into_iter()
      96            8 :                         .map(|Range(start, end)| (start.0..end.0))
      97            4 :                         .collect(),
      98            4 :                 }))
      99            4 :             }
     100              :         }
     101              : 
     102              :         #[serde_with::serde_as]
     103           10 :         #[derive(serde::Deserialize)]
     104              :         struct De {
     105              :             keys: KeySpace,
     106              :             sparse_keys: KeySpace,
     107              :             #[serde_as(as = "serde_with::DisplayFromStr")]
     108              :             at_lsn: Lsn,
     109              :         }
     110              : 
     111            2 :         let de: De = serde::Deserialize::deserialize(deserializer)?;
     112            2 :         Ok(Self {
     113            2 :             at_lsn: de.at_lsn,
     114            2 :             keys: de.keys.0,
     115            2 :             sparse_keys: SparseKeySpace(de.sparse_keys.0),
     116            2 :         })
     117            2 :     }
     118              : }
     119              : 
     120              : #[cfg(test)]
     121              : mod tests {
     122              :     use super::*;
     123              : 
     124              :     #[test]
     125            2 :     fn test_serialization_roundtrip() {
     126            2 :         let reference = r#"
     127            2 :         {
     128            2 :             "keys": [
     129            2 :               [
     130            2 :                 "000000000000000000000000000000000000",
     131            2 :                 "000000000000000000000000000000000001"
     132            2 :               ],
     133            2 :               [
     134            2 :                 "000000067F00000001000000000000000000",
     135            2 :                 "000000067F00000001000000000000000002"
     136            2 :               ],
     137            2 :               [
     138            2 :                 "030000000000000000000000000000000000",
     139            2 :                 "030000000000000000000000000000000003"
     140            2 :               ]
     141            2 :             ],
     142            2 :             "sparse_keys": [
     143            2 :               [
     144            2 :                 "620000000000000000000000000000000000",
     145            2 :                 "620000000000000000000000000000000003"
     146            2 :               ]
     147            2 :             ],
     148            2 :             "at_lsn": "0/2240160"
     149            2 :         }
     150            2 :         "#;
     151            2 : 
     152            2 :         let de: Partitioning = serde_json::from_str(reference).unwrap();
     153            2 : 
     154            2 :         let ser = serde_json::to_string(&de).unwrap();
     155            2 : 
     156            2 :         let ser_de: serde_json::Value = serde_json::from_str(&ser).unwrap();
     157            2 : 
     158            2 :         assert_eq!(
     159            2 :             ser_de,
     160            2 :             serde_json::from_str::<'_, serde_json::Value>(reference).unwrap()
     161            2 :         );
     162            2 :     }
     163              : }
        

Generated by: LCOV version 2.1-beta