@@ -74,6 +74,13 @@ pub fn fill_env(env: &mut HashMap<String, DataType>) {
7474 "filter_keyvals" . to_string ( ) ,
7575 DataType :: Function ( "filter_keyvals" . to_string ( ) , qfunctions:: filter_keyvals) ,
7676 ) ;
77+ env. insert (
78+ "filter_keyvals_regex" . to_string ( ) ,
79+ DataType :: Function (
80+ "filter_keyvals_regex" . to_string ( ) ,
81+ qfunctions:: filter_keyvals_regex,
82+ ) ,
83+ ) ;
7784 env. insert (
7885 "filter_period_intersect" . to_string ( ) ,
7986 DataType :: Function (
@@ -420,6 +427,36 @@ mod qfunctions {
420427 Ok ( DataType :: List ( filtered_tagged_events) )
421428 }
422429
430+ use regex:: RegexBuilder ;
431+
432+ pub fn filter_keyvals_regex (
433+ args : Vec < DataType > ,
434+ _env : & HashMap < String , DataType > ,
435+ _ds : & Datastore ,
436+ ) -> Result < DataType , QueryError > {
437+ // typecheck
438+ validate:: args_length ( & args, 3 ) ?;
439+ let events = ( & args[ 0 ] ) . try_into ( ) ?;
440+ let key: String = ( & args[ 1 ] ) . try_into ( ) ?;
441+ let regex_str: String = ( & args[ 2 ] ) . try_into ( ) ?;
442+ let regex = match RegexBuilder :: new ( & regex_str) . build ( ) {
443+ Ok ( regex) => regex,
444+ Err ( e) => {
445+ return Err ( QueryError :: RegexCompileError ( format ! (
446+ "Failed to compile regex string '{}': {}" ,
447+ regex_str, e
448+ ) ) )
449+ }
450+ } ;
451+
452+ let mut filtered_events = aw_transform:: filter_keyvals_regex ( events, & key, & regex) ;
453+ let mut filtered_tagged_events = Vec :: new ( ) ;
454+ for event in filtered_events. drain ( ..) {
455+ filtered_tagged_events. push ( DataType :: Event ( event) ) ;
456+ }
457+ Ok ( DataType :: List ( filtered_tagged_events) )
458+ }
459+
423460 pub fn filter_period_intersect (
424461 args : Vec < DataType > ,
425462 _env : & HashMap < String , DataType > ,
0 commit comments