@@ -10,14 +10,15 @@ function querystr_to_array(querystr: string): string[] {
1010}
1111
1212interface BaseQueryParams {
13- filter_afk : boolean ;
1413 include_audible ?: boolean ;
1514 classes : Record < string , any > ;
15+ filter_classes : string [ ] [ ] ;
1616}
1717
1818interface DesktopQueryParams extends BaseQueryParams {
1919 bid_window : string ;
2020 bid_afk : string ;
21+ filter_afk : boolean ;
2122 bid_browsers ?: string [ ] ;
2223}
2324
@@ -26,44 +27,63 @@ interface AndroidQueryParams extends BaseQueryParams {
2627 bid_browsers ?: string [ ] ;
2728}
2829
30+ function isDesktopParams ( object : any ) : object is DesktopQueryParams {
31+ return 'bid_window' in object ;
32+ }
33+
34+ function isAndroidParams ( object : any ) : object is AndroidQueryParams {
35+ return 'bid_android' in object ;
36+ }
37+
2938// Constructs a query that returns a fully-detailed list of events from the merging of several sources (window, afk, web).
30- // Puts it's results in `not_afk` and `events`.
31- function canonicalEvents ( params : DesktopQueryParams ) : string {
39+ // Performs:
40+ // - AFK filtering (if filter_afk is true)
41+ // - Categorization (if classes specified)
42+ // - Filters by category (if filter_classes set)
43+ // Puts it's results in `events` and `not_afk` (if not_afk available for platform).
44+ function canonicalEvents ( params : DesktopQueryParams | AndroidQueryParams ) : string {
45+ // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping)
46+ const classes_str = JSON . stringify ( params . classes ) . replace ( '\\\\' , '\\' ) ;
47+ const cat_filter_str = JSON . stringify ( params . filter_classes ) ;
48+ const bid_window = isDesktopParams ( params ) ? params . bid_window : params . bid_android ;
49+
3250 return `
33- events = flood(query_bucket("${ params . bid_window } "));
34- not_afk = flood(query_bucket("${ params . bid_afk } "));
35- not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);
36- ${ params . filter_afk ? 'events = filter_period_intersect(events, not_afk);' : '' }
51+ events = flood(query_bucket("${ bid_window } "));
52+ ${
53+ isDesktopParams ( params )
54+ ? `not_afk = flood(query_bucket("${ params . bid_afk } "));
55+ not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);`
56+ : ''
57+ }
58+ ${ isAndroidParams ( params ) ? 'events = merge_events_by_keys(events, ["app"]);' : '' }
59+
60+ ${
61+ isDesktopParams ( params ) && params . filter_afk
62+ ? 'events = filter_period_intersect(events, not_afk);'
63+ : ''
64+ }
65+ ${ params . classes ? `events = categorize(events, ${ classes_str } );` : '' }
66+ ${
67+ params . filter_classes
68+ ? `events = filter_keyvals(events, "$category", ${ cat_filter_str } );`
69+ : ''
70+ }
3771 ` ;
3872}
3973
4074const default_limit = 100 ; // Hardcoded limit per group
4175
42- export function appQuery (
43- appbucket : string ,
44- classes ,
45- filterAFK : boolean ,
46- filterCategories : string [ ] [ ]
47- ) : string [ ] {
76+ export function appQuery ( appbucket : string , classes , filterCategories : string [ ] [ ] ) : string [ ] {
4877 appbucket = appbucket . replace ( '"' , '\\"' ) ;
4978 const params : AndroidQueryParams = {
5079 bid_android : appbucket ,
5180 classes : classes ,
52- filter_afk : filterAFK ,
81+ filter_classes : filterCategories ,
5382 } ;
5483
55- // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping)
56- const classes_str = JSON . stringify ( params . classes ) . replace ( '\\\\' , '\\' ) ;
84+ const code = `
85+ ${ canonicalEvents ( params ) }
5786
58- const code =
59- `
60- events = query_bucket("${ params . bid_android } ");
61- events = merge_events_by_keys(events, ["app"]);
62- events = categorize(events, ${ classes_str } );` +
63- ( filterCategories
64- ? `events = filter_keyvals(events, "$category", ${ JSON . stringify ( filterCategories ) } );`
65- : '' ) +
66- `
6787 title_events = sort_by_duration(merge_events_by_keys(events, ["app", "classname"]));
6888 app_events = sort_by_duration(merge_events_by_keys(title_events, ["app"]));
6989 cat_events = sort_by_duration(merge_events_by_keys(events, ["$category"]));
@@ -155,21 +175,13 @@ export function fullDesktopQuery(
155175 bid_afk : afkbucket ,
156176 bid_browsers : browserbuckets ,
157177 classes : classes ,
178+ filter_classes : filterCategories ,
158179 filter_afk : filterAFK ,
159180 } ;
160181
161- // Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unecessary escaping)
162- const classes_str = JSON . stringify ( params . classes ) . replace ( '\\\\' , '\\' ) ;
163-
164182 return querystr_to_array (
165183 `
166184 ${ canonicalEvents ( params ) }
167- events = categorize(events, ${ classes_str } );
168- ` +
169- ( filterCategories
170- ? `events = filter_keyvals(events, "$category", ${ JSON . stringify ( filterCategories ) } );`
171- : '' ) +
172- `
173185 title_events = sort_by_duration(merge_events_by_keys(events, ["app", "title"]));
174186 app_events = sort_by_duration(merge_events_by_keys(title_events, ["app"]));
175187 cat_events = sort_by_duration(merge_events_by_keys(events, ["$category"]));
0 commit comments