@@ -74,6 +74,13 @@ pub fn fill_env(env: &mut HashMap<String, DataType>) {
74
74
"filter_keyvals" . to_string ( ) ,
75
75
DataType :: Function ( "filter_keyvals" . to_string ( ) , qfunctions:: filter_keyvals) ,
76
76
) ;
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
+ ) ;
77
84
env. insert (
78
85
"filter_period_intersect" . to_string ( ) ,
79
86
DataType :: Function (
@@ -420,6 +427,36 @@ mod qfunctions {
420
427
Ok ( DataType :: List ( filtered_tagged_events) )
421
428
}
422
429
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
+
423
460
pub fn filter_period_intersect (
424
461
args : Vec < DataType > ,
425
462
_env : & HashMap < String , DataType > ,
0 commit comments