Skip to content

Commit 13a927f

Browse files
committed
feat: progress on audible-as-active
1 parent 86b8eab commit 13a927f

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

src/queries.ts

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,17 @@ interface BaseQueryParams {
2222
include_audible?: boolean;
2323
classes: [string[], Rule][];
2424
filter_classes: string[][];
25+
bid_browsers?: string[];
2526
}
2627

2728
interface DesktopQueryParams extends BaseQueryParams {
2829
bid_window: string;
2930
bid_afk: string;
3031
filter_afk: boolean;
31-
bid_browsers?: string[];
3232
}
3333

3434
interface AndroidQueryParams extends BaseQueryParams {
3535
bid_android: string;
36-
bid_browsers?: string[];
3736
}
3837

3938
function 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

8390
const 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

Comments
 (0)