mithril_aggregator/database/query/epoch_settings/
get_epoch_settings.rs1use anyhow::Context;
2use mithril_common::StdResult;
3use mithril_common::entities::Epoch;
4use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereCondition};
5use sqlite::Value;
6
7use crate::database::record::EpochSettingsRecord;
8
9pub struct GetEpochSettingsQuery {
11 condition: WhereCondition,
12}
13
14impl GetEpochSettingsQuery {
15 pub fn by_epoch(epoch: Epoch) -> StdResult<Self> {
16 let epoch_settings_id: i64 = epoch
17 .try_into()
18 .with_context(|| format!("Can not convert epoch: '{epoch}'"))?;
19
20 Ok(Self {
21 condition: WhereCondition::new(
22 "epoch_setting_id = ?*",
23 vec![Value::Integer(epoch_settings_id)],
24 ),
25 })
26 }
27}
28
29impl Query for GetEpochSettingsQuery {
30 type Entity = EpochSettingsRecord;
31
32 fn filters(&self) -> WhereCondition {
33 self.condition.clone()
34 }
35
36 fn get_definition(&self, condition: &str) -> String {
37 let aliases = SourceAlias::new(&[("{:epoch_setting:}", "es")]);
38 let projection = Self::Entity::get_projection().expand(aliases);
39 format!(
40 "select {projection} from epoch_setting as es where {condition} order by epoch_setting_id desc"
41 )
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use mithril_common::entities::{
48 BlockNumber, CardanoTransactionsSigningConfig, ProtocolParameters,
49 };
50 use mithril_persistence::sqlite::ConnectionExtensions;
51
52 use crate::database::test_helper::{insert_epoch_settings, main_db_connection};
53
54 use super::*;
55
56 #[test]
57 fn test_get_epoch_settings() {
58 let connection = main_db_connection().unwrap();
59 insert_epoch_settings(&connection, &[1, 2, 3]).unwrap();
60
61 let epoch_settings_record = connection
62 .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(1)).unwrap())
63 .unwrap()
64 .expect("Should have an epoch settings for epoch 1.");
65 assert_eq!(Epoch(1), epoch_settings_record.epoch_settings_id);
66 assert_eq!(
67 ProtocolParameters::new(1, 2, 1.0),
68 epoch_settings_record.protocol_parameters
69 );
70
71 assert_eq!(
72 CardanoTransactionsSigningConfig::new(BlockNumber(10), BlockNumber(15)),
73 epoch_settings_record.cardano_transactions_signing_config
74 );
75
76 let epoch_settings_record = connection
77 .fetch_first(GetEpochSettingsQuery::by_epoch(Epoch(3)).unwrap())
78 .unwrap()
79 .expect("Should have an epoch settings for epoch 3.");
80 assert_eq!(Epoch(3), epoch_settings_record.epoch_settings_id);
81 assert_eq!(
82 ProtocolParameters::new(3, 4, 1.0),
83 epoch_settings_record.protocol_parameters
84 );
85 assert_eq!(
86 CardanoTransactionsSigningConfig {
87 security_parameter: BlockNumber(30),
88 step: BlockNumber(15),
89 },
90 epoch_settings_record.cardano_transactions_signing_config
91 );
92
93 let cursor = connection
94 .fetch(GetEpochSettingsQuery::by_epoch(Epoch(5)).unwrap())
95 .unwrap();
96 assert_eq!(0, cursor.count());
97 }
98}