@@ -243,6 +243,21 @@ where
243
243
s. values ( ) . cloned ( ) . collect ( )
244
244
}
245
245
246
+ /// Retrieve a list of cloned entries found by the given predicate
247
+ #[ must_use]
248
+ pub fn filter < P > ( & self , predicate : P ) -> Vec < Arc < K > >
249
+ where
250
+ P : Fn ( & K ) -> bool ,
251
+ {
252
+ self . store
253
+ . read ( )
254
+ . iter ( )
255
+ . map ( |( _, k) | k)
256
+ . filter ( |k| predicate ( k. as_ref ( ) ) )
257
+ . cloned ( )
258
+ . collect ( )
259
+ }
260
+
246
261
/// Retrieve a `clone()` of the entry found by the given predicate
247
262
#[ must_use]
248
263
pub fn find < P > ( & self , predicate : P ) -> Option < Arc < K > >
@@ -408,4 +423,54 @@ mod tests {
408
423
let found = reader. find ( |k| k. metadata . generation == Some ( 1234 ) ) ;
409
424
assert_eq ! ( found. as_deref( ) , Some ( & target_cm) ) ;
410
425
}
426
+
427
+ #[ test]
428
+ fn filter_elements_in_store ( ) {
429
+ let mut cm_list = vec ! [ ] ;
430
+
431
+ for i in 0 ..5 {
432
+ let cm = ConfigMap {
433
+ metadata : ObjectMeta {
434
+ name : Some ( format ! ( "obj{i}" ) ) ,
435
+ namespace : None ,
436
+ generation : Some ( i) ,
437
+ ..ObjectMeta :: default ( )
438
+ } ,
439
+ ..ConfigMap :: default ( )
440
+ } ;
441
+
442
+ cm_list. push ( cm) ;
443
+ }
444
+
445
+ let ( reader, mut writer) = store :: < ConfigMap > ( ) ;
446
+ assert ! ( reader. is_empty( ) ) ;
447
+ for cm in & cm_list {
448
+ writer. apply_watcher_event ( & watcher:: Event :: Apply ( cm. clone ( ) ) ) ;
449
+ }
450
+
451
+ assert_eq ! ( reader. len( ) , 5 ) ;
452
+ assert ! ( reader. filter( |k| k. metadata. generation == Some ( 1234 ) ) . is_empty( ) ) ;
453
+
454
+ //0, 2, 4
455
+ let filtered = reader. filter ( |k| k. metadata . generation . map ( |o| o % 2 ) == Some ( 0 ) ) ;
456
+ assert_eq ! ( filtered. len( ) , 3 ) ;
457
+
458
+ let mut filtered_generatios = filtered
459
+ . into_iter ( )
460
+ . map ( |k| k. metadata . generation . unwrap ( ) )
461
+ . collect :: < Vec < _ > > ( ) ;
462
+ filtered_generatios. sort ( ) ;
463
+
464
+ assert_eq ! ( filtered_generatios, vec![ 0 , 2 , 4 ] ) ;
465
+
466
+ let mut target_cm = cm_list[ 0 ] . clone ( ) ;
467
+ target_cm. metadata . name = Some ( "obj_target" . to_string ( ) ) ;
468
+ target_cm. metadata . generation = Some ( 1234 ) ;
469
+ writer. apply_watcher_event ( & watcher:: Event :: Apply ( target_cm. clone ( ) ) ) ;
470
+ assert_eq ! ( reader. len( ) , 6 ) ;
471
+
472
+ let filtered = reader. filter ( |k| k. metadata . generation == Some ( 1234 ) ) ;
473
+ assert_eq ! ( filtered. len( ) , 1 ) ;
474
+ assert_eq ! ( filtered[ 0 ] . as_ref( ) , & target_cm) ;
475
+ }
411
476
}
0 commit comments