@@ -533,9 +533,15 @@ impl<'a> RequestQueryBuilder<'a> {
533
533
sql. push_str ( & format ! ( " AND network_id = ${param_count}" ) ) ;
534
534
}
535
535
536
- if self . state . is_some ( ) {
536
+ if let Some ( state ) = & self . state {
537
537
param_count += 1 ;
538
538
sql. push_str ( & format ! ( " AND state = ${param_count}" ) ) ;
539
+
540
+ if * state == StateTag :: Completed {
541
+ sql. push_str ( " AND NOT callback_failed" ) ;
542
+ } else if * state == StateTag :: CallbackErrored {
543
+ sql. push_str ( " AND callback_failed" ) ;
544
+ }
539
545
}
540
546
541
547
sql. push_str ( " ORDER BY created_at DESC" ) ;
@@ -570,7 +576,11 @@ impl<'a> RequestQueryBuilder<'a> {
570
576
}
571
577
572
578
if let Some ( state) = & self . state {
573
- query = query. bind ( state. to_string ( ) ) ;
579
+ query = query. bind ( match state {
580
+ StateTag :: Pending => "Pending" ,
581
+ StateTag :: Failed => "Failed" ,
582
+ StateTag :: Completed | StateTag :: CallbackErrored => "Completed" ,
583
+ } )
574
584
}
575
585
576
586
query = query. bind ( self . limit ) . bind ( self . offset ) ;
@@ -612,9 +622,15 @@ impl<'a> RequestQueryBuilder<'a> {
612
622
sql. push_str ( & format ! ( " AND network_id = ${param_count}" ) ) ;
613
623
}
614
624
615
- if self . state . is_some ( ) {
625
+ if let Some ( state ) = & self . state {
616
626
param_count += 1 ;
617
627
sql. push_str ( & format ! ( " AND state = ${param_count}" ) ) ;
628
+
629
+ if * state == StateTag :: Completed {
630
+ sql. push_str ( " AND NOT callback_failed" ) ;
631
+ } else if * state == StateTag :: CallbackErrored {
632
+ sql. push_str ( " AND callback_failed" ) ;
633
+ }
618
634
}
619
635
620
636
// Now bind all parameters in order
@@ -642,7 +658,11 @@ impl<'a> RequestQueryBuilder<'a> {
642
658
}
643
659
644
660
if let Some ( state) = & self . state {
645
- query = query. bind ( state. to_string ( ) ) ;
661
+ query = query. bind ( match state {
662
+ StateTag :: Pending => "Pending" ,
663
+ StateTag :: Failed => "Failed" ,
664
+ StateTag :: Completed | StateTag :: CallbackErrored => "Completed" ,
665
+ } )
646
666
}
647
667
648
668
query. fetch_one ( self . pool ) . await . map_err ( |err| err. into ( ) )
@@ -1088,6 +1108,90 @@ mod test {
1088
1108
}
1089
1109
}
1090
1110
1111
+ #[ tokio:: test]
1112
+ async fn test_history_state_filter ( ) {
1113
+ let history = History :: new_in_memory ( ) . await . unwrap ( ) ;
1114
+ let reveal_tx_hash = TxHash :: random ( ) ;
1115
+
1116
+ let pending_status = get_random_request_status ( ) ;
1117
+ History :: update_request_status ( & history. pool , pending_status. clone ( ) ) . await ;
1118
+
1119
+ let mut failed_status = get_random_request_status ( ) ;
1120
+ History :: update_request_status ( & history. pool , failed_status. clone ( ) ) . await ;
1121
+ failed_status. state = RequestEntryState :: Failed {
1122
+ reason : "Failed" . to_string ( ) ,
1123
+ provider_random_number : None ,
1124
+ } ;
1125
+ History :: update_request_status ( & history. pool , failed_status. clone ( ) ) . await ;
1126
+
1127
+ let mut completed_status = get_random_request_status ( ) ;
1128
+ History :: update_request_status ( & history. pool , completed_status. clone ( ) ) . await ;
1129
+ completed_status. state = RequestEntryState :: Completed {
1130
+ reveal_block_number : 1 ,
1131
+ reveal_tx_hash,
1132
+ provider_random_number : [ 40 ; 32 ] ,
1133
+ gas_used : U256 :: from ( 567890 ) ,
1134
+ combined_random_number : RequestStatus :: generate_combined_random_number (
1135
+ & completed_status. user_random_number ,
1136
+ & [ 40 ; 32 ] ,
1137
+ ) ,
1138
+ callback_failed : false ,
1139
+ callback_return_value : Default :: default ( ) ,
1140
+ callback_gas_used : 100_000 ,
1141
+ } ;
1142
+ History :: update_request_status ( & history. pool , completed_status. clone ( ) ) . await ;
1143
+
1144
+ let reveal_tx_hash = TxHash :: random ( ) ;
1145
+ let mut callback_errored_status = get_random_request_status ( ) ;
1146
+ History :: update_request_status ( & history. pool , callback_errored_status. clone ( ) ) . await ;
1147
+ callback_errored_status. state = RequestEntryState :: Completed {
1148
+ reveal_block_number : 1 ,
1149
+ reveal_tx_hash,
1150
+ provider_random_number : [ 40 ; 32 ] ,
1151
+ gas_used : U256 :: from ( 567890 ) ,
1152
+ combined_random_number : RequestStatus :: generate_combined_random_number (
1153
+ & callback_errored_status. user_random_number ,
1154
+ & [ 40 ; 32 ] ,
1155
+ ) ,
1156
+ callback_failed : true ,
1157
+ callback_return_value : Default :: default ( ) ,
1158
+ callback_gas_used : 100_000 ,
1159
+ } ;
1160
+ History :: update_request_status ( & history. pool , callback_errored_status. clone ( ) ) . await ;
1161
+
1162
+ let logs = history
1163
+ . query ( )
1164
+ . state ( StateTag :: Pending )
1165
+ . execute ( )
1166
+ . await
1167
+ . unwrap ( ) ;
1168
+ assert_eq ! ( logs, vec![ pending_status. clone( ) ] ) ;
1169
+
1170
+ let logs = history
1171
+ . query ( )
1172
+ . state ( StateTag :: Failed )
1173
+ . execute ( )
1174
+ . await
1175
+ . unwrap ( ) ;
1176
+ assert_eq ! ( logs, vec![ failed_status. clone( ) ] ) ;
1177
+
1178
+ let logs = history
1179
+ . query ( )
1180
+ . state ( StateTag :: Completed )
1181
+ . execute ( )
1182
+ . await
1183
+ . unwrap ( ) ;
1184
+ assert_eq ! ( logs, vec![ completed_status. clone( ) ] ) ;
1185
+
1186
+ let logs = history
1187
+ . query ( )
1188
+ . state ( StateTag :: CallbackErrored )
1189
+ . execute ( )
1190
+ . await
1191
+ . unwrap ( ) ;
1192
+ assert_eq ! ( logs, vec![ callback_errored_status. clone( ) ] ) ;
1193
+ }
1194
+
1091
1195
#[ tokio:: test( flavor = "multi_thread" ) ]
1092
1196
async fn test_writer_thread ( ) {
1093
1197
let history = History :: new_in_memory ( ) . await . unwrap ( ) ;
0 commit comments