Skip to content

Commit 132370b

Browse files
aw-query: Add function filter_keyvals_regex
1 parent 5185b5d commit 132370b

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

aw-query/src/functions.rs

+37
Original file line numberDiff line numberDiff line change
@@ -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>,

aw-query/tests/query.rs

+1
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ mod query_tests {
365365
url_events = split_url_events (events);
366366
filtered_events = filter_period_intersect(events, events);
367367
filtered_events = filter_keyvals(events, "$category", [["Uncategorized"]]);
368+
filtered_events = filter_keyvals_regex(events, "key", "regex");
368369
chunked_events = chunk_events_by_key(events, "key");
369370
merged_events = merge_events_by_keys(events, ["key"]);
370371
return merged_events;"#,

0 commit comments

Comments
 (0)