Skip to content

Commit b6e0cb8

Browse files
committed
Use Range instead of RangeInclusive in functions signatures
To uniformise use of ranges since `BlockRange` use a Range internaly.
1 parent c7c0f67 commit b6e0cb8

File tree

4 files changed

+65
-69
lines changed

4 files changed

+65
-69
lines changed

mithril-common/src/entities/block_range.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};
33
use std::{
44
cmp::Ordering,
55
fmt::{Display, Formatter, Result},
6-
ops::{Deref, Range, RangeInclusive},
6+
ops::{Deref, Range},
77
};
88

99
use crate::{
@@ -59,7 +59,7 @@ impl BlockRange {
5959
}
6060

6161
/// Get all [BlockRange] contained in the given interval
62-
pub fn all_ranges_in(interval: RangeInclusive<BlockNumber>) -> Vec<BlockRange> {
62+
pub fn all_ranges_in(interval: Range<BlockNumber>) -> Vec<BlockRange> {
6363
let all_numbers: Vec<BlockNumber> =
6464
interval.skip_while(|i| i % Self::LENGTH != 0).collect();
6565
all_numbers
@@ -214,26 +214,28 @@ mod tests {
214214

215215
#[test]
216216
fn test_block_range_all_ranges_in() {
217-
assert_eq!(BlockRange::all_ranges_in(0..=0), vec![]);
218-
assert_eq!(BlockRange::all_ranges_in(1..=16), vec![]);
217+
assert_eq!(BlockRange::all_ranges_in(0..0), vec![]);
218+
assert_eq!(BlockRange::all_ranges_in(0..1), vec![]);
219+
assert_eq!(BlockRange::all_ranges_in(0..14), vec![]);
220+
assert_eq!(BlockRange::all_ranges_in(1..15), vec![]);
219221
assert_eq!(
220-
BlockRange::all_ranges_in(0..=15),
222+
BlockRange::all_ranges_in(0..15),
221223
vec![BlockRange::new(0, 15)]
222224
);
223225
assert_eq!(
224-
BlockRange::all_ranges_in(0..=16),
226+
BlockRange::all_ranges_in(0..16),
225227
vec![BlockRange::new(0, 15)]
226228
);
227229
assert_eq!(
228-
BlockRange::all_ranges_in(14..=29),
230+
BlockRange::all_ranges_in(14..30),
229231
vec![BlockRange::new(15, 30)]
230232
);
231233
assert_eq!(
232-
BlockRange::all_ranges_in(14..=30),
234+
BlockRange::all_ranges_in(14..31),
233235
vec![BlockRange::new(15, 30)]
234236
);
235237
assert_eq!(
236-
BlockRange::all_ranges_in(14..=61),
238+
BlockRange::all_ranges_in(14..61),
237239
vec![
238240
BlockRange::new(15, 30),
239241
BlockRange::new(30, 45),

mithril-signer/src/cardano_transactions_importer.rs

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::ops::RangeInclusive;
1+
use std::ops::Range;
22
use std::path::{Path, PathBuf};
33
use std::sync::Arc;
44

@@ -18,17 +18,6 @@ pub trait TransactionStore: Send + Sync {
1818
/// Get the highest known transaction beacon
1919
async fn get_highest_beacon(&self) -> StdResult<Option<ImmutableFileNumber>>;
2020

21-
/// Get the interval of blocks whose merkle root has yet to be computed
22-
async fn get_block_interval_without_block_range_root(
23-
&self,
24-
) -> StdResult<Option<RangeInclusive<BlockNumber>>>;
25-
26-
/// Get transactions between two block numbers
27-
async fn get_transactions_between(
28-
&self,
29-
range: RangeInclusive<BlockNumber>,
30-
) -> StdResult<Vec<CardanoTransaction>>;
31-
3221
/// Get stored transactions up to the given beacon
3322
async fn get_up_to(
3423
&self,
@@ -38,6 +27,17 @@ pub trait TransactionStore: Send + Sync {
3827
/// Store list of transactions
3928
async fn store_transactions(&self, transactions: Vec<CardanoTransaction>) -> StdResult<()>;
4029

30+
/// Get the interval of blocks whose merkle root has yet to be computed
31+
async fn get_block_interval_without_block_range_root(
32+
&self,
33+
) -> StdResult<Option<Range<BlockNumber>>>;
34+
35+
/// Get transactions between two block numbers
36+
async fn get_transactions_between(
37+
&self,
38+
range: Range<BlockNumber>,
39+
) -> StdResult<Vec<CardanoTransaction>>;
40+
4141
/// Store list of block ranges with their corresponding merkle root
4242
async fn store_block_ranges(
4343
&self,
@@ -134,7 +134,7 @@ impl CardanoTransactionsImporter {
134134
}
135135
Some(range) => {
136136
let block_ranges =
137-
BlockRange::all_ranges_in(BlockRange::start(*range.start())..=*range.end());
137+
BlockRange::all_ranges_in(BlockRange::start(range.start)..range.end);
138138

139139
if block_ranges.is_empty() {
140140
return Ok(());
@@ -144,7 +144,7 @@ impl CardanoTransactionsImporter {
144144
for block_range in block_ranges {
145145
let transactions = self
146146
.transaction_store
147-
.get_transactions_between(block_range.start..=(block_range.end - 1))
147+
.get_transactions_between(block_range.start..block_range.end)
148148
.await?;
149149
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
150150
block_ranges_with_merkle_root.push((block_range, merkle_root));
@@ -468,10 +468,8 @@ mod tests {
468468
#[tokio::test]
469469
// async fn block_range_root_compute_work_on_block_range_starting_before_last_block_range_root_and_finishing_before_last_tx(
470470
async fn block_range_root_only_retrieve_only_strictly_required_transactions() {
471-
fn transactions_for_block(
472-
range: RangeInclusive<BlockNumber>,
473-
) -> StdResult<Vec<CardanoTransaction>> {
474-
Ok(build_blocks(*range.start(), range.count() as BlockNumber)
471+
fn transactions_for_block(range: Range<BlockNumber>) -> StdResult<Vec<CardanoTransaction>> {
472+
Ok(build_blocks(range.start, range.count() as BlockNumber)
475473
.iter()
476474
.flat_map(|b| b.clone().into_transactions())
477475
.collect())
@@ -484,11 +482,7 @@ mod tests {
484482
// Specification of the interval without block range root
485483
// Note: in reality the lower bound will always be a multiple of BlockRange::LENGTH
486484
// since it's computed from the `block_range_root` table
487-
.returning(|| {
488-
Ok(Some(
489-
(BlockRange::LENGTH + 2)..=(BlockRange::LENGTH * 5 + 1),
490-
))
491-
})
485+
.returning(|| Ok(Some((BlockRange::LENGTH + 2)..(BlockRange::LENGTH * 5))))
492486
.once();
493487
store_mock
494488
.expect_get_transactions_between()
@@ -501,7 +495,7 @@ mod tests {
501495
// included in a block range
502496
.withf(|range| {
503497
let expected_range = BlockRange::LENGTH..=(BlockRange::LENGTH * 5);
504-
expected_range.contains(range.start()) && expected_range.contains(range.end())
498+
expected_range.contains(&range.start) && expected_range.contains(&range.end)
505499
})
506500
.returning(transactions_for_block);
507501
store_mock.expect_store_block_ranges().returning(|_| Ok(()));

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use sqlite::Value;
2-
use std::ops::RangeInclusive;
2+
use std::ops::Range;
33

44
use mithril_common::entities::{BlockNumber, ImmutableFileNumber, TransactionHash};
55
use mithril_persistence::sqlite::{
@@ -42,15 +42,15 @@ impl<'client> GetCardanoTransactionProvider<'client> {
4242

4343
pub fn get_transaction_between_blocks_condition(
4444
&self,
45-
range: RangeInclusive<BlockNumber>,
45+
range: Range<BlockNumber>,
4646
) -> WhereCondition {
4747
WhereCondition::new(
4848
"block_number >= ?*",
49-
vec![Value::Integer(*range.start() as i64)],
49+
vec![Value::Integer(range.start as i64)],
5050
)
5151
.and_where(WhereCondition::new(
52-
"block_number <= ?*",
53-
vec![Value::Integer(*range.end() as i64)],
52+
"block_number < ?*",
53+
vec![Value::Integer(range.end as i64)],
5454
))
5555
}
5656
}

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

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::ops::RangeInclusive;
1+
use std::ops::Range;
22
use std::sync::Arc;
33

44
use anyhow::Context;
@@ -46,7 +46,7 @@ impl CardanoTransactionRepository {
4646
/// Return all the [CardanoTransactionRecord]s in the database using chronological order.
4747
pub async fn get_transactions_between_blocks(
4848
&self,
49-
range: RangeInclusive<BlockNumber>,
49+
range: Range<BlockNumber>,
5050
) -> StdResult<Vec<CardanoTransactionRecord>> {
5151
let provider = GetCardanoTransactionProvider::new(&self.connection);
5252
let filters = provider.get_transaction_between_blocks_condition(range);
@@ -180,9 +180,27 @@ impl TransactionStore for CardanoTransactionRepository {
180180
}
181181
}
182182

183+
async fn get_up_to(&self, beacon: ImmutableFileNumber) -> StdResult<Vec<CardanoTransaction>> {
184+
self.get_transactions_up_to(beacon).await.map(|v| {
185+
v.into_iter()
186+
.map(|record| record.into())
187+
.collect::<Vec<CardanoTransaction>>()
188+
})
189+
}
190+
191+
async fn store_transactions(&self, transactions: Vec<CardanoTransaction>) -> StdResult<()> {
192+
// Chunk transactions to avoid an error when we exceed sqlite binding limitations
193+
for transactions_in_chunk in transactions.chunks(100) {
194+
self.create_transactions(transactions_in_chunk.to_vec())
195+
.await
196+
.with_context(|| "CardanoTransactionRepository can not store transactions")?;
197+
}
198+
Ok(())
199+
}
200+
183201
async fn get_block_interval_without_block_range_root(
184202
&self,
185-
) -> StdResult<Option<RangeInclusive<BlockNumber>>> {
203+
) -> StdResult<Option<Range<BlockNumber>>> {
186204
let provider = GetIntervalWithoutBlockRangeRootProvider::new(&self.connection);
187205
let row = provider
188206
.find(provider.get_interval_without_block_range_condition())?
@@ -193,7 +211,7 @@ impl TransactionStore for CardanoTransactionRepository {
193211
None => panic!("IntervalWithoutBlockRangeProvider should always return a single row"),
194212
Some(interval) => match (interval.start, interval.end) {
195213
(_, None) => Ok(None),
196-
(None, Some(end)) => Ok(Some(0..=end)),
214+
(None, Some(end)) => Ok(Some(0..(end + 1))),
197215
(Some(start), Some(end)) if end < start => {
198216
// To discuss : should we prune all block ranges from the DB to force recompute ?
199217
warn!(
@@ -204,14 +222,14 @@ impl TransactionStore for CardanoTransactionRepository {
204222
);
205223
Ok(None)
206224
}
207-
(Some(start), Some(end)) => Ok(Some(start..=end)),
225+
(Some(start), Some(end)) => Ok(Some(start..(end + 1))),
208226
},
209227
}
210228
}
211229

212230
async fn get_transactions_between(
213231
&self,
214-
range: RangeInclusive<BlockNumber>,
232+
range: Range<BlockNumber>,
215233
) -> StdResult<Vec<CardanoTransaction>> {
216234
self.get_transactions_between_blocks(range).await.map(|v| {
217235
v.into_iter()
@@ -220,24 +238,6 @@ impl TransactionStore for CardanoTransactionRepository {
220238
})
221239
}
222240

223-
async fn get_up_to(&self, beacon: ImmutableFileNumber) -> StdResult<Vec<CardanoTransaction>> {
224-
self.get_transactions_up_to(beacon).await.map(|v| {
225-
v.into_iter()
226-
.map(|record| record.into())
227-
.collect::<Vec<CardanoTransaction>>()
228-
})
229-
}
230-
231-
async fn store_transactions(&self, transactions: Vec<CardanoTransaction>) -> StdResult<()> {
232-
// Chunk transactions to avoid an error when we exceed sqlite binding limitations
233-
for transactions_in_chunk in transactions.chunks(100) {
234-
self.create_transactions(transactions_in_chunk.to_vec())
235-
.await
236-
.with_context(|| "CardanoTransactionRepository can not store transactions")?;
237-
}
238-
Ok(())
239-
}
240-
241241
async fn store_block_ranges(
242242
&self,
243243
block_ranges: Vec<(BlockRange, MKTreeNode)>,
@@ -481,23 +481,23 @@ mod tests {
481481
.unwrap();
482482

483483
{
484-
let transaction_result = repository.get_transactions_between(0..=9).await.unwrap();
484+
let transaction_result = repository.get_transactions_between(0..10).await.unwrap();
485485
assert_eq!(Vec::<CardanoTransaction>::new(), transaction_result);
486486
}
487487
{
488-
let transaction_result = repository.get_transactions_between(13..=20).await.unwrap();
488+
let transaction_result = repository.get_transactions_between(13..21).await.unwrap();
489489
assert_eq!(Vec::<CardanoTransaction>::new(), transaction_result);
490490
}
491491
{
492-
let transaction_result = repository.get_transactions_between(9..=11).await.unwrap();
492+
let transaction_result = repository.get_transactions_between(9..12).await.unwrap();
493493
assert_eq!(transactions[0..=1].to_vec(), transaction_result);
494494
}
495495
{
496-
let transaction_result = repository.get_transactions_between(10..=12).await.unwrap();
496+
let transaction_result = repository.get_transactions_between(10..13).await.unwrap();
497497
assert_eq!(transactions.clone(), transaction_result);
498498
}
499499
{
500-
let transaction_result = repository.get_transactions_between(11..=13).await.unwrap();
500+
let transaction_result = repository.get_transactions_between(11..14).await.unwrap();
501501
assert_eq!(transactions[1..=2].to_vec(), transaction_result);
502502
}
503503
}
@@ -529,7 +529,7 @@ mod tests {
529529
.await
530530
.unwrap();
531531

532-
assert_eq!(Some(0..=last_transaction_block_number), interval);
532+
assert_eq!(Some(0..(last_transaction_block_number + 1)), interval);
533533
}
534534
{
535535
// The last block range give the lower bound
@@ -548,7 +548,7 @@ mod tests {
548548
.unwrap();
549549

550550
assert_eq!(
551-
Some(last_block_range.end..=last_transaction_block_number),
551+
Some(last_block_range.end..(last_transaction_block_number + 1)),
552552
interval
553553
);
554554
}

0 commit comments

Comments
 (0)