mithril_aggregator/database/query/signer_registration/
get_signer_registration.rs1use sqlite::Value;
2
3use mithril_common::{StdResult, entities::Epoch};
4use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition};
5
6use crate::database::record::SignerRegistrationRecord;
7
8pub 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 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 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}