@@ -78,8 +78,6 @@ pub static BROWSER_APPNAMES: phf::Map<&'static str, &'static [&'static str]> = p
78
78
"vivaldi" => & [ "Vivaldi-stable" , "Vivaldi-snapshot" , "vivaldi.exe" ] ,
79
79
} ;
80
80
81
- pub const DEFAULT_LIMIT : u32 = 100 ;
82
-
83
81
/// Type alias for categorization classes
84
82
pub type ClassRule = ( CategoryId , CategorySpec ) ;
85
83
@@ -135,33 +133,6 @@ impl QueryParams {
135
133
QueryParams :: Android ( params) => build_android_canonical_events ( params) ,
136
134
}
137
135
}
138
-
139
- /// Build canonical events query string with automatic class fetching if not provided
140
- pub fn canonical_events_with_classes ( & self ) -> String {
141
- self . canonical_events_with_classes_from_server ( "localhost" , 5600 )
142
- }
143
-
144
- /// Build canonical events query string with automatic class fetching from custom server
145
- pub fn canonical_events_with_classes_from_server ( & self , host : & str , port : u16 ) -> String {
146
- match self {
147
- QueryParams :: Desktop ( params) => {
148
- let mut params_with_classes = params. clone ( ) ;
149
- if params_with_classes. base . classes . is_empty ( ) {
150
- params_with_classes. base . classes =
151
- crate :: classes:: get_classes_from_server ( host, port) ;
152
- }
153
- build_desktop_canonical_events ( & params_with_classes)
154
- }
155
- QueryParams :: Android ( params) => {
156
- let mut params_with_classes = params. clone ( ) ;
157
- if params_with_classes. base . classes . is_empty ( ) {
158
- params_with_classes. base . classes =
159
- crate :: classes:: get_classes_from_server ( host, port) ;
160
- }
161
- build_android_canonical_events ( & params_with_classes)
162
- }
163
- }
164
- }
165
136
}
166
137
167
138
/// Helper function to serialize classes in the format expected by the categorize function
@@ -201,7 +172,7 @@ fn serialize_classes(classes: &[ClassRule]) -> String {
201
172
format ! ( "[{}]" , parts. join( ", " ) )
202
173
}
203
174
204
- fn build_desktop_canonical_events ( params : & DesktopQueryParams ) -> String {
175
+ pub fn build_desktop_canonical_events ( params : & DesktopQueryParams ) -> String {
205
176
let mut query = Vec :: new ( ) ;
206
177
207
178
// Fetch window events
@@ -256,7 +227,7 @@ not_afk = period_union(not_afk, audible_events)"
256
227
query. join ( ";\n " )
257
228
}
258
229
259
- fn build_android_canonical_events ( params : & AndroidQueryParams ) -> String {
230
+ pub fn build_android_canonical_events ( params : & AndroidQueryParams ) -> String {
260
231
let mut query = Vec :: new ( ) ;
261
232
262
233
// Fetch app events
@@ -287,7 +258,7 @@ fn build_android_canonical_events(params: &AndroidQueryParams) -> String {
287
258
query. join ( ";\n " )
288
259
}
289
260
290
- fn build_browser_events ( params : & DesktopQueryParams ) -> String {
261
+ pub fn build_browser_events ( params : & DesktopQueryParams ) -> String {
291
262
let mut query = String :: from ( "browser_events = [];" ) ;
292
263
293
264
for browser_bucket in & params. base . bid_browsers {
@@ -311,38 +282,34 @@ browser_events = sort_by_timestamp(browser_events)",
311
282
query
312
283
}
313
284
314
- /// Build a full desktop query
285
+ /// Build a full desktop query using default localhost:5600 configuration
315
286
pub fn full_desktop_query ( params : & DesktopQueryParams ) -> String {
316
- let mut query = QueryParams :: Desktop ( params. clone ( ) ) . canonical_events_with_classes ( ) ;
287
+ let mut query = QueryParams :: Desktop ( params. clone ( ) ) . canonical_events ( ) ;
317
288
318
289
// Add basic event aggregations
319
- query. push_str ( & format ! (
320
- "
290
+ query. push_str (
291
+ & "
321
292
title_events = sort_by_duration(merge_events_by_keys(events, [\" app\" , \" title\" ]));
322
293
app_events = sort_by_duration(merge_events_by_keys(title_events, [\" app\" ]));
323
294
cat_events = sort_by_duration(merge_events_by_keys(events, [\" $category\" ]));
324
- app_events = limit_events(app_events, {});
325
- title_events = limit_events(title_events, {});
326
295
duration = sum_durations(events);
327
- " ,
328
- DEFAULT_LIMIT , DEFAULT_LIMIT
329
- ) ) ;
296
+ "
297
+ . to_string ( ) ,
298
+ ) ;
330
299
331
300
// Add browser-specific query parts if browser buckets exist
332
301
if !params. base . bid_browsers . is_empty ( ) {
333
- query. push_str ( & format ! (
334
- "
302
+ query. push_str (
303
+ & "
335
304
browser_events = split_url_events(browser_events);
336
305
browser_urls = merge_events_by_keys(browser_events, [\" url\" ]);
337
306
browser_urls = sort_by_duration(browser_urls);
338
- browser_urls = limit_events(browser_urls, {});
339
307
browser_domains = merge_events_by_keys(browser_events, [\" $domain\" ]);
340
308
browser_domains = sort_by_duration(browser_domains);
341
- browser_domains = limit_events(browser_domains, {});
342
309
browser_duration = sum_durations(browser_events);
343
- " ,
344
- DEFAULT_LIMIT , DEFAULT_LIMIT
345
- ) ) ;
310
+ "
311
+ . to_string ( ) ,
312
+ ) ;
346
313
} else {
347
314
query. push_str (
348
315
"
@@ -490,4 +457,85 @@ mod tests {
490
457
assert ! ( query. contains( "events = categorize" ) ) ;
491
458
assert ! ( query. contains( "test" ) ) ;
492
459
}
460
+
461
+ #[ test]
462
+ fn test_canonical_events_with_client_config ( ) {
463
+ use crate :: AwClient ;
464
+
465
+ let params = DesktopQueryParams {
466
+ base : QueryParamsBase {
467
+ bid_browsers : vec ! [ ] ,
468
+ classes : vec ! [ ] , // Empty - would fetch from server if available
469
+ filter_classes : vec ! [ ] ,
470
+ filter_afk : true ,
471
+ include_audible : true ,
472
+ } ,
473
+ bid_window : "test-window" . to_string ( ) ,
474
+ bid_afk : "test-afk" . to_string ( ) ,
475
+ } ;
476
+
477
+ // Test with custom port client
478
+ if let Ok ( client) = AwClient :: new ( "localhost" , 8080 , "test-client" ) {
479
+ let query_params = QueryParams :: Desktop ( params. clone ( ) ) ;
480
+ let query = query_params. canonical_events_with_classes_from_client ( & client) ;
481
+
482
+ // Should contain basic query structure
483
+ assert ! ( query. contains( "events = flood" ) ) ;
484
+ assert ! ( query. contains( "test-window" ) ) ;
485
+ }
486
+
487
+ // Test with blocking client
488
+ use crate :: blocking:: AwClient as BlockingClient ;
489
+ if let Ok ( blocking_client) = BlockingClient :: new ( "localhost" , 9090 , "test-blocking-client" )
490
+ {
491
+ let query_params = QueryParams :: Desktop ( params) ;
492
+ let query =
493
+ query_params. canonical_events_with_classes_from_blocking_client ( & blocking_client) ;
494
+
495
+ // Should contain basic query structure
496
+ assert ! ( query. contains( "events = flood" ) ) ;
497
+ assert ! ( query. contains( "test-window" ) ) ;
498
+ }
499
+ }
500
+
501
+ #[ test]
502
+ fn test_full_desktop_query_from_client ( ) {
503
+ use crate :: AwClient ;
504
+
505
+ let params = DesktopQueryParams {
506
+ base : QueryParamsBase {
507
+ bid_browsers : vec ! [ "aw-watcher-web-chrome" . to_string( ) ] ,
508
+ classes : vec ! [ ] ,
509
+ filter_classes : vec ! [ ] ,
510
+ filter_afk : true ,
511
+ include_audible : true ,
512
+ } ,
513
+ bid_window : "test-window" . to_string ( ) ,
514
+ bid_afk : "test-afk" . to_string ( ) ,
515
+ } ;
516
+
517
+ // Test the client-aware full desktop query
518
+ if let Ok ( client) = AwClient :: new ( "localhost" , 8080 , "test-client" ) {
519
+ let query = full_desktop_query_from_client ( & params, & client) ;
520
+
521
+ // Should contain all expected parts
522
+ assert ! ( query. contains( "events = flood" ) ) ;
523
+ assert ! ( query. contains( "title_events = sort_by_duration" ) ) ;
524
+ assert ! ( query. contains( "browser_events" ) ) ;
525
+ assert ! ( query. contains( "RETURN" ) ) ;
526
+ }
527
+
528
+ // Test the blocking client version
529
+ use crate :: blocking:: AwClient as BlockingClient ;
530
+ if let Ok ( blocking_client) = BlockingClient :: new ( "localhost" , 9090 , "test-blocking-client" )
531
+ {
532
+ let query = full_desktop_query_from_blocking_client ( & params, & blocking_client) ;
533
+
534
+ // Should contain all expected parts
535
+ assert ! ( query. contains( "events = flood" ) ) ;
536
+ assert ! ( query. contains( "title_events = sort_by_duration" ) ) ;
537
+ assert ! ( query. contains( "browser_events" ) ) ;
538
+ assert ! ( query. contains( "RETURN" ) ) ;
539
+ }
540
+ }
493
541
}
0 commit comments