mithril_aggregator/database/query/signer_registration/
get_signer_registration.rs

1use sqlite::Value;
2
3use mithril_common::{StdResult, entities::Epoch};
4use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition};
5
6use crate::database::record::SignerRegistrationRecord;
7
8/// Simple queries to retrieve [SignerRegistrationRecord] from the sqlite database.
9pub struct GetSignerRegistrationRecordQuery {
10    condition: WhereCondition,
11}
12
13impl GetSignerRegistrationRecordQuery {
14    #[cfg(test)]
15    pub fn all() -> Self {
16        Self {
17            condition: WhereCondition::default(),
18        }
19    }
20
21    /// Query to get SignerRegistrationRecords for given signer id and epoch.
22    pub fn by_signer_id_and_epoch(signer_id: String, epoch: Epoch) -> StdResult<Self> {
23        let epoch: i64 = epoch.try_into()?;
24        let condition =
25            WhereCondition::new("signer_id = ?*", vec![Value::String(signer_id)]).and_where(
26                WhereCondition::new("epoch_setting_id = ?*", vec![Value::Integer(epoch)]),
27            );
28
29        Ok(Self { condition })
30    }
31
32    /// Query to get SignerRegistrationRecords for a given Epoch.
33    pub fn by_epoch(epoch: Epoch) -> StdResult<Self> {
34        let epoch: i64 = epoch.try_into()?;
35        let condition = WhereCondition::new("epoch_setting_id = ?*", vec![Value::Integer(epoch)]);
36
37        Ok(Self { condition })
38    }
39}
40
41impl Query for GetSignerRegistrationRecordQuery {
42    type Entity = SignerRegistrationRecord;
43
44    fn filters(&self) -> WhereCondition {
45        self.condition.clone()
46    }
47
48    fn get_definition(&self, condition: &str) -> String {
49        let aliases = SourceAlias::new(&[("{:signer_registration:}", "sr")]);
50        let projection = Self::Entity::get_projection().expand(aliases);
51        format!(
52            "select {projection} from signer_registration as sr where {condition} order by ROWID desc"
53        )
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use chrono::{DateTime, Utc};
60
61    use mithril_common::entities::SignerWithStake;
62    use mithril_common::test::builder::MithrilFixtureBuilder;
63    use mithril_persistence::sqlite::ConnectionExtensions;
64
65    use crate::database::test_helper::{insert_signer_registrations, main_db_connection};
66
67    use super::*;
68
69    fn reset_created_at(
70        signer_registration_records: Vec<SignerRegistrationRecord>,
71    ) -> Vec<SignerRegistrationRecord> {
72        signer_registration_records
73            .into_iter()
74            .map(|mut sr| {
75                sr.created_at = DateTime::<Utc>::default();
76                sr
77            })
78            .collect::<Vec<_>>()
79    }
80
81    #[test]
82    fn test_get_signer_registration_records() {
83        let fixture = MithrilFixtureBuilder::default().with_signers(5).build();
84        let signer_with_stakes = fixture.signers_with_stake();
85        let signer_with_stakes_by_epoch: Vec<(Epoch, Vec<SignerWithStake>)> =
86            (0..=3).map(|e| (Epoch(e), signer_with_stakes.clone())).collect();
87
88        let connection = main_db_connection().unwrap();
89        insert_signer_registrations(&connection, signer_with_stakes_by_epoch.clone()).unwrap();
90
91        let signer_registration_records: Vec<SignerRegistrationRecord> = connection
92            .fetch_collect(GetSignerRegistrationRecordQuery::by_epoch(Epoch(1)).unwrap())
93            .unwrap();
94        let expected_signer_registration_records: Vec<SignerRegistrationRecord> =
95            signer_with_stakes_by_epoch[1]
96                .1
97                .iter()
98                .map(|sr| SignerRegistrationRecord::from_signer_with_stake(sr.clone(), Epoch(1)))
99                .rev()
100                .collect();
101        assert_eq!(
102            reset_created_at(expected_signer_registration_records),
103            reset_created_at(signer_registration_records)
104        );
105
106        let signer_registration_records: Vec<SignerRegistrationRecord> = connection
107            .fetch_collect(GetSignerRegistrationRecordQuery::by_epoch(Epoch(3)).unwrap())
108            .unwrap();
109        let expected_signer_registration_records: Vec<SignerRegistrationRecord> =
110            signer_with_stakes_by_epoch[3]
111                .1
112                .iter()
113                .map(|sr| SignerRegistrationRecord::from_signer_with_stake(sr.clone(), Epoch(3)))
114                .rev()
115                .collect();
116        assert_eq!(
117            reset_created_at(expected_signer_registration_records),
118            reset_created_at(signer_registration_records)
119        );
120
121        let cursor = connection
122            .fetch(GetSignerRegistrationRecordQuery::by_epoch(Epoch(5)).unwrap())
123            .unwrap();
124        assert_eq!(0, cursor.count());
125
126        let signer_registration_records: Vec<SignerRegistrationRecord> = connection
127            .fetch_collect(GetSignerRegistrationRecordQuery::all())
128            .unwrap();
129        let expected_signer_registration_records: Vec<SignerRegistrationRecord> =
130            signer_with_stakes_by_epoch
131                .iter()
132                .fold(
133                    Vec::<SignerRegistrationRecord>::new(),
134                    |mut acc, (epoch, signer_with_stakes)| {
135                        acc.extend(
136                            signer_with_stakes
137                                .iter()
138                                .map(|sr| {
139                                    SignerRegistrationRecord::from_signer_with_stake(
140                                        sr.clone(),
141                                        *epoch,
142                                    )
143                                })
144                                .collect::<Vec<SignerRegistrationRecord>>(),
145                        );
146                        acc
147                    },
148                )
149                .into_iter()
150                .rev()
151                .collect();
152        assert_eq!(
153            reset_created_at(expected_signer_registration_records),
154            reset_created_at(signer_registration_records)
155        );
156    }
157}