@@ -22,18 +22,17 @@ interface BaseQueryParams {
2222 include_audible ?: boolean ;
2323 classes : [ string [ ] , Rule ] [ ] ;
2424 filter_classes : string [ ] [ ] ;
25+ bid_browsers ?: string [ ] ;
2526}
2627
2728interface DesktopQueryParams extends BaseQueryParams {
2829 bid_window : string ;
2930 bid_afk : string ;
3031 filter_afk : boolean ;
31- bid_browsers ?: string [ ] ;
3232}
3333
3434interface AndroidQueryParams extends BaseQueryParams {
3535 bid_android : string ;
36- bid_browsers ?: string [ ] ;
3736}
3837
3938function isDesktopParams ( object : any ) : object is DesktopQueryParams {
@@ -54,30 +53,38 @@ export function canonicalEvents(params: DesktopQueryParams | AndroidQueryParams)
5453 // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping)
5554 const classes_str = JSON . stringify ( params . classes ) . replace ( / \\ \\ / g, '\\' ) ;
5655 const cat_filter_str = JSON . stringify ( params . filter_classes ) ;
57- const bid_window = isDesktopParams ( params ) ? params . bid_window : params . bid_android ;
5856
59- return `
60- events = flood(query_bucket("${ bid_window } "));
61- ${
62- isDesktopParams ( params )
63- ? `not_afk = flood(query_bucket("${ params . bid_afk } "));
64- not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);`
65- : ''
66- }
67- ${ isAndroidParams ( params ) ? 'events = merge_events_by_keys(events, ["app"]);' : '' }
57+ // For simplicity, we assume that bid_window and bid_android are exchangeable (note however it needs special treatment)
58+ const bid_window = isDesktopParams ( params ) ? params . bid_window : params . bid_android ;
6859
69- ${
70- isDesktopParams ( params ) && params . filter_afk
71- ? 'events = filter_period_intersect(events, not_afk);'
72- : ''
73- }
74- ${ params . classes ? `events = categorize(events, ${ classes_str } );` : '' }
75- ${
76- params . filter_classes
77- ? `events = filter_keyvals(events, "$category", ${ cat_filter_str } );`
78- : ''
79- }
80- ` ;
60+ return [
61+ // Fetch window/app events
62+ `events = flood(query_bucket("${ bid_window } "));` ,
63+ // On Android, merge events to avoid overload of events
64+ isAndroidParams ( params ) ? 'events = merge_events_by_keys(events, ["app"]);' : '' ,
65+ // Fetch not-afk events
66+ isDesktopParams ( params )
67+ ? `not_afk = flood(query_bucket("${ params . bid_afk } "));
68+ not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);`
69+ : '' ,
70+ // Fetch browser events
71+ params . bid_browsers
72+ ? browserEvents ( params ) +
73+ // Include focused and audible browser events as indications of not-afk
74+ ( params . include_audible
75+ ? `audible_events = filter_keyvals(browser_events, "audible", [true]);
76+ not_afk = period_union(not_afk, audible_events);`
77+ : '' )
78+ : '' ,
79+ // Filter out window events when the user was afk
80+ isDesktopParams ( params ) && params . filter_afk
81+ ? 'events = filter_period_intersect(events, not_afk);'
82+ : '' ,
83+ // Categorize
84+ params . classes ? `events = categorize(events, ${ classes_str } );` : '' ,
85+ // Filter out selected categories
86+ params . filter_classes ? `events = filter_keyvals(events, "$category", ${ cat_filter_str } );` : '' ,
87+ ] . join ( '\n' ) ;
8188}
8289
8390const default_limit = 100 ; // Hardcoded limit per group
@@ -171,7 +178,8 @@ function browserEvents(params: DesktopQueryParams): string {
171178 window_${ browserName } = filter_keyvals(events, "app", ${ browser_appnames_str } );
172179 events_${ browserName } = filter_period_intersect(events_${ browserName } , window_${ browserName } );
173180 events_${ browserName } = split_url_events(events_${ browserName } );
174- browser_events = sort_by_timestamp(concat(browser_events, events_${ browserName } ));` ;
181+ browser_events = concat(browser_events, events_${ browserName } );
182+ browser_events = sort_by_timestamp(browser_events);` ;
175183 } ) ;
176184 return code ;
177185}
@@ -209,8 +217,8 @@ export function fullDesktopQuery(
209217 app_events = limit_events(app_events, ${ default_limit } );
210218 title_events = limit_events(title_events, ${ default_limit } );
211219 duration = sum_durations(events);
212-
213- ${ browserEvents ( params ) }
220+ ` + // Browser events are retrieved in canonicalQuery
221+ `
214222 browser_events = split_url_events(browser_events);
215223 browser_urls = merge_events_by_keys(browser_events, ["url"]);
216224 browser_urls = sort_by_duration(browser_urls);
0 commit comments