Skip to content

Commit f17312f

Browse files
committed
Implement get_transactions_between on CardanoTransactionRepository
1 parent 150f5eb commit f17312f

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

mithril-signer/src/database/provider/cardano_transaction/get_cardano_transaction.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use sqlite::Value;
2+
use std::ops::RangeInclusive;
23

3-
use mithril_common::entities::{ImmutableFileNumber, TransactionHash};
4+
use mithril_common::entities::{BlockNumber, ImmutableFileNumber, TransactionHash};
45
use mithril_persistence::sqlite::{
56
Provider, SourceAlias, SqLiteEntity, SqliteConnection, WhereCondition,
67
};
@@ -38,6 +39,20 @@ impl<'client> GetCardanoTransactionProvider<'client> {
3839
vec![Value::Integer(beacon as i64)],
3940
)
4041
}
42+
43+
pub fn get_transaction_between_blocks_condition(
44+
&self,
45+
range: RangeInclusive<BlockNumber>,
46+
) -> WhereCondition {
47+
WhereCondition::new(
48+
"block_number >= ?*",
49+
vec![Value::Integer(*range.start() as i64)],
50+
)
51+
.and_where(WhereCondition::new(
52+
"block_number <= ?*",
53+
vec![Value::Integer(*range.end() as i64)],
54+
))
55+
}
4156
}
4257

4358
impl<'client> Provider<'client> for GetCardanoTransactionProvider<'client> {

mithril-signer/src/database/repository/cardano_transaction_repository.rs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ impl CardanoTransactionRepository {
3939
Ok(transactions.collect())
4040
}
4141

42+
/// Return all the [CardanoTransactionRecord]s in the database using chronological order.
43+
pub async fn get_transactions_between_blocks(
44+
&self,
45+
range: RangeInclusive<BlockNumber>,
46+
) -> StdResult<Vec<CardanoTransactionRecord>> {
47+
let provider = GetCardanoTransactionProvider::new(&self.connection);
48+
let filters = provider.get_transaction_between_blocks_condition(range);
49+
let transactions = provider.find(filters)?;
50+
51+
Ok(transactions.collect())
52+
}
53+
4254
/// Return all the [CardanoTransactionRecord]s in the database up to the given beacon using
4355
/// chronological order.
4456
pub async fn get_transactions_up_to(
@@ -141,7 +153,11 @@ impl TransactionStore for CardanoTransactionRepository {
141153
&self,
142154
range: RangeInclusive<BlockNumber>,
143155
) -> StdResult<Vec<CardanoTransaction>> {
144-
todo!()
156+
self.get_transactions_between_blocks(range).await.map(|v| {
157+
v.into_iter()
158+
.map(|record| record.into())
159+
.collect::<Vec<CardanoTransaction>>()
160+
})
145161
}
146162

147163
async fn get_up_to(&self, beacon: ImmutableFileNumber) -> StdResult<Vec<CardanoTransaction>> {
@@ -383,4 +399,41 @@ mod tests {
383399
let highest_beacon = repository.get_highest_beacon().await.unwrap();
384400
assert_eq!(Some(100), highest_beacon);
385401
}
402+
403+
#[tokio::test]
404+
async fn repository_get_transactions_between_blocks() {
405+
let connection = Arc::new(cardano_tx_db_connection().unwrap());
406+
let repository = CardanoTransactionRepository::new(connection);
407+
408+
let transactions = vec![
409+
CardanoTransaction::new("tx-hash-1", 10, 50, "block-hash-1", 99),
410+
CardanoTransaction::new("tx-hash-2", 11, 51, "block-hash-2", 100),
411+
CardanoTransaction::new("tx-hash-3", 12, 52, "block-hash-3", 101),
412+
];
413+
repository
414+
.create_transactions(transactions.clone())
415+
.await
416+
.unwrap();
417+
418+
{
419+
let transaction_result = repository.get_transactions_between(0..=9).await.unwrap();
420+
assert_eq!(Vec::<CardanoTransaction>::new(), transaction_result);
421+
}
422+
{
423+
let transaction_result = repository.get_transactions_between(13..=20).await.unwrap();
424+
assert_eq!(Vec::<CardanoTransaction>::new(), transaction_result);
425+
}
426+
{
427+
let transaction_result = repository.get_transactions_between(9..=11).await.unwrap();
428+
assert_eq!(transactions[0..=1].to_vec(), transaction_result);
429+
}
430+
{
431+
let transaction_result = repository.get_transactions_between(10..=12).await.unwrap();
432+
assert_eq!(transactions.clone(), transaction_result);
433+
}
434+
{
435+
let transaction_result = repository.get_transactions_between(11..=13).await.unwrap();
436+
assert_eq!(transactions[1..=2].to_vec(), transaction_result);
437+
}
438+
}
386439
}

0 commit comments

Comments
 (0)