1
1
use aw_models:: Event ;
2
+ use chrono:: { DateTime , Utc } ;
2
3
3
4
/// Removes events not intersecting with the provided filter_events
4
5
///
@@ -10,25 +11,32 @@ use aw_models::Event;
10
11
///
11
12
/// # Example
12
13
/// ```ignore
13
- /// events: [a ][b ]
14
- /// filter_events: [ ] [ ]
15
- /// output: [a ] [b ]
14
+ /// events: [a ][b ]
15
+ /// filter_events: [ ] [ ]
16
+ /// output: [a ] [a ][b ]
16
17
/// ```
17
18
pub fn filter_period_intersect ( events : & [ Event ] , filter_events : & [ Event ] ) -> Vec < Event > {
18
19
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
19
28
for filter in filter_events {
20
29
let filter_endtime = filter. calculate_endtime ( ) ;
21
- for event in events {
30
+ for ( event, event_endtime ) in & events_with_endtimes {
22
31
if event. timestamp > filter_endtime {
23
32
continue ;
24
33
}
25
- let event_endtime = event. calculate_endtime ( ) ;
26
- if event_endtime < filter. timestamp {
34
+ if * event_endtime < filter. timestamp {
27
35
continue ;
28
36
}
29
- let mut e = event. clone ( ) ;
37
+ let mut e = ( * event) . clone ( ) ;
30
38
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) ;
32
40
e. duration = endtime - e. timestamp ;
33
41
filtered_events. push ( e) ;
34
42
}
0 commit comments