Skip to content

Commit ebb1fdd

Browse files
aw-transform: Optimize filter_period_intersect by pre-calculating endtimes
1 parent 4f00b19 commit ebb1fdd

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

aw-transform/src/filter_period.rs

+16-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use aw_models::Event;
2+
use chrono::{DateTime, Utc};
23

34
/// Removes events not intersecting with the provided filter_events
45
///
@@ -10,25 +11,32 @@ use aw_models::Event;
1011
///
1112
/// # Example
1213
/// ```ignore
13-
/// events: [a ][b ]
14-
/// filter_events: [ ] [ ]
15-
/// output: [a ] [b ]
14+
/// events: [a ][b ]
15+
/// filter_events: [ ] [ ]
16+
/// output: [a ] [a ][b ]
1617
/// ```
1718
pub fn filter_period_intersect(events: &[Event], filter_events: &[Event]) -> Vec<Event> {
1819
let mut filtered_events = Vec::new();
20+
21+
// Start with pre-calculating endtimes of events
22+
let mut events_with_endtimes: Vec<(&Event, DateTime<Utc>)> = Vec::new();
23+
for event in events {
24+
events_with_endtimes.push((event, event.calculate_endtime()));
25+
}
26+
27+
// Do actual filtering
1928
for filter in filter_events {
2029
let filter_endtime = filter.calculate_endtime();
21-
for event in events {
30+
for (event, event_endtime) in &events_with_endtimes {
2231
if event.timestamp > filter_endtime {
2332
continue;
2433
}
25-
let event_endtime = event.calculate_endtime();
26-
if event_endtime < filter.timestamp {
34+
if *event_endtime < filter.timestamp {
2735
continue;
2836
}
29-
let mut e = event.clone();
37+
let mut e = (*event).clone();
3038
e.timestamp = std::cmp::max(e.timestamp, filter.timestamp);
31-
let endtime = std::cmp::min(event_endtime, filter_endtime);
39+
let endtime = std::cmp::min(*event_endtime, filter_endtime);
3240
e.duration = endtime - e.timestamp;
3341
filtered_events.push(e);
3442
}

0 commit comments

Comments
 (0)