1
- use std:: {
2
- collections:: HashMap ,
3
- sync:: { Arc , Mutex } ,
4
- } ;
1
+ use std:: sync:: { Arc , Mutex } ;
5
2
6
3
use async_trait:: async_trait;
7
4
use chrono:: NaiveDateTime ;
@@ -121,7 +118,7 @@ impl<'client> Provider<'client> for StakePoolProvider<'client> {
121
118
let aliases = SourceAlias :: new ( & [ ( "{:stake_pool:}" , "sp" ) ] ) ;
122
119
let projection = Self :: Entity :: get_projection ( ) . expand ( aliases) ;
123
120
124
- format ! ( "select {projection} from stake_pool as sp where {condition} order by epoch asc, stake desc" )
121
+ format ! ( "select {projection} from stake_pool as sp where {condition} order by epoch asc, stake desc, stake_pool_id asc " )
125
122
}
126
123
}
127
124
@@ -254,7 +251,7 @@ impl StakeStorer for StakePoolStore {
254
251
. lock ( )
255
252
. map_err ( |e| AdapterError :: GeneralError ( format ! ( "{e}" ) ) ) ?;
256
253
let provider = UpdateStakePoolProvider :: new ( connection) ;
257
- let mut new_stakes: HashMap < PartyId , Stake > = HashMap :: new ( ) ;
254
+ let mut new_stakes = StakeDistribution :: new ( ) ;
258
255
connection
259
256
. execute ( "begin transaction" )
260
257
. map_err ( |e| AdapterError :: QueryError ( e. into ( ) ) ) ?;
@@ -287,7 +284,7 @@ impl StakeStorer for StakePoolStore {
287
284
let cursor = provider
288
285
. get_by_epoch ( & epoch)
289
286
. map_err ( |e| AdapterError :: GeneralError ( format ! ( "Could not get stakes: {e}" ) ) ) ?;
290
- let mut stake_distribution: HashMap < PartyId , Stake > = HashMap :: new ( ) ;
287
+ let mut stake_distribution = StakeDistribution :: new ( ) ;
291
288
292
289
for stake_pool in cursor {
293
290
stake_distribution. insert ( stake_pool. stake_pool_id , stake_pool. stake ) ;
@@ -297,10 +294,54 @@ impl StakeStorer for StakePoolStore {
297
294
}
298
295
}
299
296
300
- #[ cfg( test) ]
301
- mod tests {
297
+ #[ cfg( any ( test, feature = "test_only" ) ) ]
298
+ pub fn setup_stake_db ( connection : & Connection ) -> Result < ( ) , StdError > {
302
299
use crate :: database:: migration:: get_migrations;
303
300
301
+ let migrations = get_migrations ( ) ;
302
+ let migration = migrations
303
+ . iter ( )
304
+ . find ( |& m| m. version == 1 )
305
+ . ok_or_else ( || -> StdError {
306
+ "There should be a migration version 1" . to_string ( ) . into ( )
307
+ } ) ?;
308
+ let query = {
309
+ // leverage the expanded parameter from this provider which is unit
310
+ // tested on its own above.
311
+ let update_provider = UpdateStakePoolProvider :: new ( connection) ;
312
+ let ( sql_values, _) = update_provider
313
+ . get_update_condition ( "pool_id" , Epoch ( 1 ) , 1000 )
314
+ . expand ( ) ;
315
+
316
+ connection. execute ( & migration. alterations ) ?;
317
+
318
+ format ! ( "insert into stake_pool {sql_values}" )
319
+ } ;
320
+ let stake_distribution: & [ ( & str , i64 , i64 ) ; 9 ] = & [
321
+ ( "pool1" , 1 , 1000 ) ,
322
+ ( "pool2" , 1 , 1100 ) ,
323
+ ( "pool3" , 1 , 1300 ) ,
324
+ ( "pool1" , 2 , 1230 ) ,
325
+ ( "pool2" , 2 , 1090 ) ,
326
+ ( "pool3" , 2 , 1300 ) ,
327
+ ( "pool1" , 3 , 1250 ) ,
328
+ ( "pool2" , 3 , 1370 ) ,
329
+ ( "pool3" , 3 , 1300 ) ,
330
+ ] ;
331
+ for ( pool_id, epoch, stake) in stake_distribution {
332
+ let mut statement = connection. prepare ( & query) ?;
333
+
334
+ statement. bind ( 1 , * pool_id) . unwrap ( ) ;
335
+ statement. bind ( 2 , * epoch) . unwrap ( ) ;
336
+ statement. bind ( 3 , * stake) . unwrap ( ) ;
337
+ statement. next ( ) . unwrap ( ) ;
338
+ }
339
+
340
+ Ok ( ( ) )
341
+ }
342
+
343
+ #[ cfg( test) ]
344
+ mod tests {
304
345
use super :: * ;
305
346
306
347
#[ test]
@@ -357,54 +398,10 @@ mod tests {
357
398
assert_eq ! ( vec![ Value :: Integer ( 5 ) ] , params) ;
358
399
}
359
400
360
- fn setup_db ( connection : & Connection ) -> Result < ( ) , StdError > {
361
- let migrations = get_migrations ( ) ;
362
- let migration =
363
- migrations
364
- . iter ( )
365
- . find ( |& m| m. version == 1 )
366
- . ok_or_else ( || -> StdError {
367
- "There should be a migration version 1" . to_string ( ) . into ( )
368
- } ) ?;
369
- let query = {
370
- // leverage the expanded parameter from this provider which is unit
371
- // tested on its own above.
372
- let update_provider = UpdateStakePoolProvider :: new ( connection) ;
373
- let ( sql_values, _) = update_provider
374
- . get_update_condition ( "pool_id" , Epoch ( 1 ) , 1000 )
375
- . expand ( ) ;
376
-
377
- connection. execute ( & migration. alterations ) ?;
378
-
379
- format ! ( "insert into stake_pool {sql_values}" )
380
- } ;
381
- let stake_distribution: & [ ( & str , i64 , i64 ) ; 9 ] = & [
382
- ( "pool1" , 1 , 1000 ) ,
383
- ( "pool2" , 1 , 1100 ) ,
384
- ( "pool3" , 1 , 1300 ) ,
385
- ( "pool1" , 2 , 1230 ) ,
386
- ( "pool2" , 2 , 1090 ) ,
387
- ( "pool3" , 2 , 1300 ) ,
388
- ( "pool1" , 3 , 1250 ) ,
389
- ( "pool2" , 3 , 1370 ) ,
390
- ( "pool3" , 3 , 1300 ) ,
391
- ] ;
392
- for ( pool_id, epoch, stake) in stake_distribution {
393
- let mut statement = connection. prepare ( & query) ?;
394
-
395
- statement. bind ( 1 , * pool_id) . unwrap ( ) ;
396
- statement. bind ( 2 , * epoch) . unwrap ( ) ;
397
- statement. bind ( 3 , * stake) . unwrap ( ) ;
398
- statement. next ( ) . unwrap ( ) ;
399
- }
400
-
401
- Ok ( ( ) )
402
- }
403
-
404
401
#[ test]
405
402
fn test_get_stake_pools ( ) {
406
403
let connection = Connection :: open ( ":memory:" ) . unwrap ( ) ;
407
- setup_db ( & connection) . unwrap ( ) ;
404
+ setup_stake_db ( & connection) . unwrap ( ) ;
408
405
409
406
let provider = StakePoolProvider :: new ( & connection) ;
410
407
let mut cursor = provider. get_by_epoch ( & Epoch ( 1 ) ) . unwrap ( ) ;
@@ -430,7 +427,7 @@ mod tests {
430
427
#[ test]
431
428
fn test_update_stakes ( ) {
432
429
let connection = Connection :: open ( ":memory:" ) . unwrap ( ) ;
433
- setup_db ( & connection) . unwrap ( ) ;
430
+ setup_stake_db ( & connection) . unwrap ( ) ;
434
431
435
432
let provider = UpdateStakePoolProvider :: new ( & connection) ;
436
433
let stake_pool = provider. persist ( "pool4" , Epoch ( 3 ) , 9999 ) . unwrap ( ) ;
@@ -452,7 +449,7 @@ mod tests {
452
449
#[ test]
453
450
fn test_prune ( ) {
454
451
let connection = Connection :: open ( ":memory:" ) . unwrap ( ) ;
455
- setup_db ( & connection) . unwrap ( ) ;
452
+ setup_stake_db ( & connection) . unwrap ( ) ;
456
453
457
454
let provider = DeleteStakePoolProvider :: new ( & connection) ;
458
455
let cursor = provider. prune ( Epoch ( 2 ) ) . unwrap ( ) ;
0 commit comments