Skip to content

Commit 03a1242

Browse files
committed
fix: cleaned up queries, unifying more into canonicalQuery
1 parent 443528f commit 03a1242

2 files changed

Lines changed: 47 additions & 35 deletions

File tree

src/queries.ts

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ function querystr_to_array(querystr: string): string[] {
1010
}
1111

1212
interface BaseQueryParams {
13-
filter_afk: boolean;
1413
include_audible?: boolean;
1514
classes: Record<string, any>;
15+
filter_classes: string[][];
1616
}
1717

1818
interface 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

4074
const 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"]));

src/store/modules/activity.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ const actions = {
171171
async query_android({ state, commit }, { timeperiod, filterCategories }: QueryOptions) {
172172
const periods = [timeperiodToStr(timeperiod)];
173173
const classes = loadClassesForQuery();
174-
const q = queries.appQuery(state.buckets.android[0], classes, true, filterCategories);
174+
const q = queries.appQuery(state.buckets.android[0], classes, filterCategories);
175175
const data = await this._vm.$aw.query(periods, q).catch(this.errorHandler);
176176
commit('query_window_completed', data[0]);
177177
},

0 commit comments

Comments
 (0)