1- import _ from ' lodash' ;
1+ import _ from " lodash" ;
22
33// TODO: Sanitize string input of buckets
44
5+ function querystr_to_array ( querystr ) {
6+ return querystr
7+ . split ( ";" )
8+ . filter ( l => l )
9+ . map ( l => l + ";" ) ;
10+ }
11+
512export function summaryQuery ( windowbucket , afkbucket , count ) {
613 windowbucket = windowbucket . replace ( '"' , '\\"' ) ;
714 afkbucket = afkbucket . replace ( '"' , '\\"' ) ;
8- let code = (
9- `events = flood(query_bucket("${ windowbucket } "));
15+ let code = `events = flood(query_bucket("${ windowbucket } "));
1016 not_afk = flood(query_bucket("${ afkbucket } "));
1117 not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);
1218 events = filter_period_intersect(events, not_afk);
@@ -16,22 +22,24 @@ export function summaryQuery(windowbucket, afkbucket, count) {
1622 app_events = sort_by_duration(app_events);
1723 app_events = limit_events(app_events, ${ count } );
1824 title_events = limit_events(title_events, ${ count } );
19- RETURN = {"app_events": app_events, "title_events": title_events};`
20- ) ;
21- let lines = code . split ( ";" ) ;
22- return _ . map ( lines , ( l ) => l + ";" ) ;
25+ RETURN = {"app_events": app_events, "title_events": title_events};` ;
26+ return querystr_to_array ( code ) ;
2327}
2428
25- export function windowQuery ( windowbucket , afkbucket , appcount , titlecount , filterAFK ) {
29+ export function windowQuery (
30+ windowbucket ,
31+ afkbucket ,
32+ appcount ,
33+ titlecount ,
34+ filterAFK
35+ ) {
2636 windowbucket = windowbucket . replace ( '"' , '\\"' ) ;
2737 afkbucket = afkbucket . replace ( '"' , '\\"' ) ;
28- let code = (
38+ let code =
2939 `events = flood(query_bucket("${ windowbucket } "));
3040 not_afk = flood(query_bucket("${ afkbucket } "));
31- not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);`
32- ) + (
33- filterAFK ? 'events = filter_period_intersect(events, not_afk);' : ''
34- ) + (
41+ not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` +
42+ ( filterAFK ? "events = filter_period_intersect(events, not_afk);" : "" ) +
3543 `title_events = merge_events_by_keys(events, ["app", "title"]);
3644 title_events = sort_by_duration(title_events);
3745 app_events = merge_events_by_keys(title_events, ["app"]);
@@ -42,98 +50,116 @@ export function windowQuery(windowbucket, afkbucket, appcount, titlecount, filte
4250 app_events = limit_events(app_events, ${ appcount } );
4351 title_events = limit_events(title_events, ${ titlecount } );
4452 duration = sum_durations(events);
45- RETURN = {"app_events": app_events, "title_events": title_events, "app_chunks": app_chunks, "duration": duration};`
46- ) ;
47- let lines = code . split ( ";" ) ;
48- return _ . map ( lines , ( l ) => l + ";" ) ;
53+ RETURN = {"app_events": app_events, "title_events": title_events, "app_chunks": app_chunks, "duration": duration};` ;
54+ return querystr_to_array ( code ) ;
4955}
5056
5157export function appQuery ( appbucket , limit ) {
5258 appbucket = appbucket . replace ( '"' , '\\"' ) ;
5359 limit = limit || 5 ;
54- let code = (
55- `events = query_bucket("${ appbucket } ");`
56- ) + (
60+ let code =
61+ `events = query_bucket("${ appbucket } ");` +
5762 `events = merge_events_by_keys(events, ["app"]);
5863 events = sort_by_duration(events);
5964 events = limit_events(events, ${ limit } );
6065 total_duration = sum_durations(events);
61- RETURN = {"events": events, "total_duration": total_duration};`
62- ) ;
63- let lines = code . split ( ";" ) ;
64- return _ . map ( lines , ( l ) => l + ";" ) ;
66+ RETURN = {"events": events, "total_duration": total_duration};` ;
67+ return querystr_to_array ( code ) ;
6568}
6669
6770const appnames = {
68- "chrome" : [ "Google-chrome" , "chrome.exe" , "Chromium" , "Google Chrome" , "Chromium-browser" , "Chromium-browser-chromium" , "Google-chrome-beta" , "Google-chrome-unstable" ] ,
69- "firefox" : [ "Firefox" , "Firefox.exe" , "firefox" , "firefox.exe" , "Firefox Developer Edition" , "Firefox Beta" , "Nightly" ] ,
70- "opera" : [ "opera.exe" , "Opera" ] ,
71- "brave" : [ "brave.exe" ] ,
71+ chrome : [
72+ "Google-chrome" ,
73+ "chrome.exe" ,
74+ "Chromium" ,
75+ "Google Chrome" ,
76+ "Chromium-browser" ,
77+ "Chromium-browser-chromium" ,
78+ "Google-chrome-beta" ,
79+ "Google-chrome-unstable"
80+ ] ,
81+ firefox : [
82+ "Firefox" ,
83+ "Firefox.exe" ,
84+ "firefox" ,
85+ "firefox.exe" ,
86+ "Firefox Developer Edition" ,
87+ "Firefox Beta" ,
88+ "Nightly"
89+ ] ,
90+ opera : [ "opera.exe" , "Opera" ] ,
91+ brave : [ "brave.exe" ]
7292} ;
7393
74- export function browserSummaryQuery ( browserbuckets , windowbucket , afkbucket , limit , filterAFK ) {
94+ export function browserSummaryQuery (
95+ browserbuckets ,
96+ windowbucket ,
97+ afkbucket ,
98+ limit ,
99+ filterAFK
100+ ) {
75101 // Escape `"`
76- browserbuckets = _ . map ( browserbuckets , ( b ) => b . replace ( '"' , '\\"' ) ) ;
102+ browserbuckets = _ . map ( browserbuckets , b => b . replace ( '"' , '\\"' ) ) ;
77103 windowbucket = windowbucket . replace ( '"' , '\\"' ) ;
78104 afkbucket = afkbucket . replace ( '"' , '\\"' ) ;
79105 limit = limit || 5 ;
80106
81107 // If multiple browser buckets were found
82- let code = (
108+ let code =
83109 `events = [];
84- window = flood(query_bucket("${ windowbucket } "));`
85- ) + ( filterAFK ?
86- `not_afk = flood(query_bucket("${ afkbucket } "));
87- not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);` : ''
88- ) ;
110+ window = flood(query_bucket("${ windowbucket } "));` +
111+ ( filterAFK
112+ ? `not_afk = flood(query_bucket("${ afkbucket } "));
113+ not_afk = filter_keyvals(not_afk, "status", ["not-afk"]);`
114+ : "" ) ;
89115
90- _ . each ( [ "chrome" , "firefox" , "opera" , "brave" ] , ( browserName ) => {
91- let bucketId = _ . filter ( browserbuckets , ( buckets ) => buckets . indexOf ( browserName ) !== - 1 ) [ 0 ] ;
92- if ( bucketId === undefined ) {
116+ _ . each ( [ "chrome" , "firefox" , "opera" , "brave" ] , browserName => {
117+ let bucketId = _ . filter (
118+ browserbuckets ,
119+ buckets => buckets . indexOf ( browserName ) !== - 1
120+ ) [ 0 ] ;
121+ if ( bucketId === undefined ) {
93122 // Skip browser if specific bucket not available
94123 return ;
95124 }
96125 let appnames_str = JSON . stringify ( appnames [ browserName ] ) ;
97- code += (
126+ code +=
98127 `events_${ browserName } = flood(query_bucket("${ bucketId } "));
99- window_${ browserName } = filter_keyvals(window, "app", ${ appnames_str } );`
100- ) + (
101- filterAFK ? `window_${ browserName } = filter_period_intersect(window_${ browserName } , not_afk);` : ''
102- ) + (
128+ window_${ browserName } = filter_keyvals(window, "app", ${ appnames_str } );` +
129+ ( filterAFK
130+ ? `window_${ browserName } = filter_period_intersect(window_${ browserName } , not_afk);`
131+ : "" ) +
103132 `events_${ browserName } = filter_period_intersect(events_${ browserName } , window_${ browserName } );
104133 events_${ browserName } = split_url_events(events_${ browserName } );
105- events = sort_by_timestamp(concat(events, events_${ browserName } ));`
106- ) ;
107- } )
134+ events = sort_by_timestamp(concat(events, events_${ browserName } ));` ;
135+ } ) ;
108136
109- let lines = code . split ( ";" ) ;
110- let query = _ . map ( lines , ( l ) => l + ";" ) ;
111- return query . concat ( [
137+ return querystr_to_array ( code ) . concat ( [
112138 'urls = merge_events_by_keys(events, ["url"]);' ,
113- ' urls = sort_by_duration(urls);' ,
114- ' urls = limit_events(urls, ' + limit + ');' ,
115- ' domains = split_url_events(events);' ,
139+ " urls = sort_by_duration(urls);" ,
140+ " urls = limit_events(urls, " + limit + ");" ,
141+ " domains = split_url_events(events);" ,
116142 'domains = merge_events_by_keys(domains, ["domain"]);' ,
117- ' domains = sort_by_duration(domains);' ,
118- ' domains = limit_events(domains, ' + limit + ');' ,
143+ " domains = sort_by_duration(domains);" ,
144+ " domains = limit_events(domains, " + limit + ");" ,
119145 'chunks = chunk_events_by_key(events, "domain");' ,
120- ' duration = sum_durations(events);' ,
121- 'RETURN = {"domains": domains, "urls": urls, "chunks": chunks, "duration": duration};' ,
146+ " duration = sum_durations(events);" ,
147+ 'RETURN = {"domains": domains, "urls": urls, "chunks": chunks, "duration": duration};'
122148 ] ) ;
123149}
124150
125151export function editorActivityQuery ( editorbucket , limit ) {
126152 editorbucket = editorbucket . replace ( '"' , '\\"' ) ;
127153 return [
128154 'editorbucket = "' + editorbucket + '";' ,
129- ' events = flood(query_bucket(editorbucket));' ,
155+ " events = flood(query_bucket(editorbucket));" ,
130156 'files = sort_by_duration(merge_events_by_keys(events, ["file", "language"]));' ,
131- ' files = limit_events(files, ' + limit + ');' ,
157+ " files = limit_events(files, " + limit + ");" ,
132158 'languages = sort_by_duration(merge_events_by_keys(events, ["language"]));' ,
133- ' languages = limit_events(languages, ' + limit + ');' ,
159+ " languages = limit_events(languages, " + limit + ");" ,
134160 'projects = sort_by_duration(merge_events_by_keys(events, ["project"]));' ,
135- ' projects = limit_events(projects, ' + limit + ');' ,
136- ' duration = sum_durations(events);' ,
161+ " projects = limit_events(projects, " + limit + ");" ,
162+ " duration = sum_durations(events);" ,
137163 'RETURN = {"files": files, "languages": languages, "projects": projects, "duration": duration};'
138164 ] ;
139165}
@@ -142,17 +168,17 @@ export function dailyActivityQuery(afkbucket) {
142168 afkbucket = afkbucket . replace ( '"' , '\\"' ) ;
143169 return [
144170 'afkbucket = "' + afkbucket + '";' ,
145- ' not_afk = flood(query_bucket(afkbucket));' ,
171+ " not_afk = flood(query_bucket(afkbucket));" ,
146172 'not_afk = merge_events_by_keys(not_afk, ["status"]);' ,
147- ' RETURN = not_afk;'
173+ " RETURN = not_afk;"
148174 ] ;
149175}
150176
151177export function dailyActivityQueryAndroid ( androidbucket ) {
152178 androidbucket = androidbucket . replace ( '"' , '\\"' ) ;
153179 return [
154180 `events = query_bucket("${ androidbucket } ");` ,
155- ' RETURN = sum_durations(events);'
181+ " RETURN = sum_durations(events);"
156182 ] ;
157183}
158184
@@ -163,5 +189,5 @@ export default {
163189 appQuery,
164190 dailyActivityQuery,
165191 dailyActivityQueryAndroid,
166- editorActivityQuery,
192+ editorActivityQuery
167193} ;
0 commit comments