@@ -243,6 +243,21 @@ where
243243 s. values ( ) . cloned ( ) . collect ( )
244244 }
245245
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+
246261 /// Retrieve a `clone()` of the entry found by the given predicate
247262 #[ must_use]
248263 pub fn find < P > ( & self , predicate : P ) -> Option < Arc < K > >
@@ -408,4 +423,54 @@ mod tests {
408423 let found = reader. find ( |k| k. metadata . generation == Some ( 1234 ) ) ;
409424 assert_eq ! ( found. as_deref( ) , Some ( & target_cm) ) ;
410425 }
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+ }
411476}
0 commit comments