@@ -78,7 +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
81
83
82
/// Type alias for categorization classes
84
83
pub type ClassRule = ( CategoryId , CategorySpec ) ;
@@ -135,33 +134,6 @@ impl QueryParams {
135
134
QueryParams :: Android ( params) => build_android_canonical_events ( params) ,
136
135
}
137
136
}
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
137
}
166
138
167
139
/// Helper function to serialize classes in the format expected by the categorize function
@@ -201,7 +173,7 @@ fn serialize_classes(classes: &[ClassRule]) -> String {
201
173
format ! ( "[{}]" , parts. join( ", " ) )
202
174
}
203
175
204
- fn build_desktop_canonical_events ( params : & DesktopQueryParams ) -> String {
176
+ pub fn build_desktop_canonical_events ( params : & DesktopQueryParams ) -> String {
205
177
let mut query = Vec :: new ( ) ;
206
178
207
179
// Fetch window events
@@ -256,7 +228,7 @@ not_afk = period_union(not_afk, audible_events)"
256
228
query. join ( ";\n " )
257
229
}
258
230
259
- fn build_android_canonical_events ( params : & AndroidQueryParams ) -> String {
231
+ pub fn build_android_canonical_events ( params : & AndroidQueryParams ) -> String {
260
232
let mut query = Vec :: new ( ) ;
261
233
262
234
// Fetch app events
@@ -287,7 +259,7 @@ fn build_android_canonical_events(params: &AndroidQueryParams) -> String {
287
259
query. join ( ";\n " )
288
260
}
289
261
290
- fn build_browser_events ( params : & DesktopQueryParams ) -> String {
262
+ pub fn build_browser_events ( params : & DesktopQueryParams ) -> String {
291
263
let mut query = String :: from ( "browser_events = [];" ) ;
292
264
293
265
for browser_bucket in & params. base . bid_browsers {
@@ -311,38 +283,28 @@ browser_events = sort_by_timestamp(browser_events)",
311
283
query
312
284
}
313
285
314
- /// Build a full desktop query
286
+ /// Build a full desktop query using default localhost:5600 configuration
315
287
pub fn full_desktop_query ( params : & DesktopQueryParams ) -> String {
316
- let mut query = QueryParams :: Desktop ( params. clone ( ) ) . canonical_events_with_classes ( ) ;
288
+ let mut query = QueryParams :: Desktop ( params. clone ( ) ) . canonical_events ( ) ;
317
289
318
290
// Add basic event aggregations
319
- query. push_str ( & format ! (
320
- "
291
+ query. push_str ( & "
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
+ " . to_string ( ) ) ;
330
297
331
298
// Add browser-specific query parts if browser buckets exist
332
299
if !params. base . bid_browsers . is_empty ( ) {
333
- query. push_str ( & format ! (
334
- "
300
+ query. push_str ( & "
335
301
browser_events = split_url_events(browser_events);
336
302
browser_urls = merge_events_by_keys(browser_events, [\" url\" ]);
337
303
browser_urls = sort_by_duration(browser_urls);
338
- browser_urls = limit_events(browser_urls, {});
339
304
browser_domains = merge_events_by_keys(browser_events, [\" $domain\" ]);
340
305
browser_domains = sort_by_duration(browser_domains);
341
- browser_domains = limit_events(browser_domains, {});
342
306
browser_duration = sum_durations(browser_events);
343
- " ,
344
- DEFAULT_LIMIT , DEFAULT_LIMIT
345
- ) ) ;
307
+ " . to_string ( ) ) ;
346
308
} else {
347
309
query. push_str (
348
310
"
@@ -490,4 +452,85 @@ mod tests {
490
452
assert ! ( query. contains( "events = categorize" ) ) ;
491
453
assert ! ( query. contains( "test" ) ) ;
492
454
}
455
+
456
+ #[ test]
457
+ fn test_canonical_events_with_client_config ( ) {
458
+ use crate :: AwClient ;
459
+
460
+ let params = DesktopQueryParams {
461
+ base : QueryParamsBase {
462
+ bid_browsers : vec ! [ ] ,
463
+ classes : vec ! [ ] , // Empty - would fetch from server if available
464
+ filter_classes : vec ! [ ] ,
465
+ filter_afk : true ,
466
+ include_audible : true ,
467
+ } ,
468
+ bid_window : "test-window" . to_string ( ) ,
469
+ bid_afk : "test-afk" . to_string ( ) ,
470
+ } ;
471
+
472
+ // Test with custom port client
473
+ if let Ok ( client) = AwClient :: new ( "localhost" , 8080 , "test-client" ) {
474
+ let query_params = QueryParams :: Desktop ( params. clone ( ) ) ;
475
+ let query = query_params. canonical_events_with_classes_from_client ( & client) ;
476
+
477
+ // Should contain basic query structure
478
+ assert ! ( query. contains( "events = flood" ) ) ;
479
+ assert ! ( query. contains( "test-window" ) ) ;
480
+ }
481
+
482
+ // Test with blocking client
483
+ use crate :: blocking:: AwClient as BlockingClient ;
484
+ if let Ok ( blocking_client) = BlockingClient :: new ( "localhost" , 9090 , "test-blocking-client" )
485
+ {
486
+ let query_params = QueryParams :: Desktop ( params) ;
487
+ let query =
488
+ query_params. canonical_events_with_classes_from_blocking_client ( & blocking_client) ;
489
+
490
+ // Should contain basic query structure
491
+ assert ! ( query. contains( "events = flood" ) ) ;
492
+ assert ! ( query. contains( "test-window" ) ) ;
493
+ }
494
+ }
495
+
496
+ #[ test]
497
+ fn test_full_desktop_query_from_client ( ) {
498
+ use crate :: AwClient ;
499
+
500
+ let params = DesktopQueryParams {
501
+ base : QueryParamsBase {
502
+ bid_browsers : vec ! [ "aw-watcher-web-chrome" . to_string( ) ] ,
503
+ classes : vec ! [ ] ,
504
+ filter_classes : vec ! [ ] ,
505
+ filter_afk : true ,
506
+ include_audible : true ,
507
+ } ,
508
+ bid_window : "test-window" . to_string ( ) ,
509
+ bid_afk : "test-afk" . to_string ( ) ,
510
+ } ;
511
+
512
+ // Test the client-aware full desktop query
513
+ if let Ok ( client) = AwClient :: new ( "localhost" , 8080 , "test-client" ) {
514
+ let query = full_desktop_query_from_client ( & params, & client) ;
515
+
516
+ // Should contain all expected parts
517
+ assert ! ( query. contains( "events = flood" ) ) ;
518
+ assert ! ( query. contains( "title_events = sort_by_duration" ) ) ;
519
+ assert ! ( query. contains( "browser_events" ) ) ;
520
+ assert ! ( query. contains( "RETURN" ) ) ;
521
+ }
522
+
523
+ // Test the blocking client version
524
+ use crate :: blocking:: AwClient as BlockingClient ;
525
+ if let Ok ( blocking_client) = BlockingClient :: new ( "localhost" , 9090 , "test-blocking-client" )
526
+ {
527
+ let query = full_desktop_query_from_blocking_client ( & params, & blocking_client) ;
528
+
529
+ // Should contain all expected parts
530
+ assert ! ( query. contains( "events = flood" ) ) ;
531
+ assert ! ( query. contains( "title_events = sort_by_duration" ) ) ;
532
+ assert ! ( query. contains( "browser_events" ) ) ;
533
+ assert ! ( query. contains( "RETURN" ) ) ;
534
+ }
535
+ }
493
536
}
0 commit comments