@@ -692,6 +692,92 @@ func minTime(t, u time.Time) time.Time {
692
692
return u
693
693
}
694
694
695
+ func (q * FakeQuerier ) GetTemplateInsightsByInterval (ctx context.Context , arg database.GetTemplateInsightsByIntervalParams ) ([]database.GetTemplateInsightsByIntervalRow , error ) {
696
+ err := validateDatabaseType (arg )
697
+ if err != nil {
698
+ return nil , err
699
+ }
700
+
701
+ q .mutex .RLock ()
702
+ defer q .mutex .RUnlock ()
703
+
704
+ type dailyStat struct {
705
+ startTime , endTime time.Time
706
+ userSet map [uuid.UUID ]struct {}
707
+ templateIDSet map [uuid.UUID ]struct {}
708
+ }
709
+ dailyStats := []dailyStat {{arg .StartTime , arg .StartTime .AddDate (0 , 0 , 1 ), make (map [uuid.UUID ]struct {}), make (map [uuid.UUID ]struct {})}}
710
+ for dailyStats [len (dailyStats )- 1 ].endTime .Before (arg .EndTime ) {
711
+ dailyStats = append (dailyStats , dailyStat {dailyStats [len (dailyStats )- 1 ].endTime , dailyStats [len (dailyStats )- 1 ].endTime .AddDate (0 , 0 , 1 ), make (map [uuid.UUID ]struct {}), make (map [uuid.UUID ]struct {})})
712
+ }
713
+ if dailyStats [len (dailyStats )- 1 ].endTime .After (arg .EndTime ) {
714
+ dailyStats [len (dailyStats )- 1 ].endTime = arg .EndTime
715
+ }
716
+
717
+ for _ , s := range q .workspaceAgentStats {
718
+ if s .CreatedAt .Before (arg .StartTime ) || s .CreatedAt .Equal (arg .EndTime ) || s .CreatedAt .After (arg .EndTime ) {
719
+ continue
720
+ }
721
+ if len (arg .TemplateIDs ) > 0 && ! slices .Contains (arg .TemplateIDs , s .TemplateID ) {
722
+ continue
723
+ }
724
+ if s .ConnectionCount == 0 {
725
+ continue
726
+ }
727
+
728
+ for _ , ds := range dailyStats {
729
+ if s .CreatedAt .Before (ds .startTime ) || s .CreatedAt .Equal (ds .endTime ) || s .CreatedAt .After (ds .endTime ) {
730
+ continue
731
+ }
732
+ ds .userSet [s .UserID ] = struct {}{}
733
+ ds .templateIDSet [s .TemplateID ] = struct {}{}
734
+ }
735
+ }
736
+
737
+ for _ , s := range q .workspaceAppStats {
738
+ w , err := q .getWorkspaceByIDNoLock (ctx , s .WorkspaceID )
739
+ if err != nil {
740
+ return nil , err
741
+ }
742
+
743
+ if len (arg .TemplateIDs ) > 0 && ! slices .Contains (arg .TemplateIDs , w .TemplateID ) {
744
+ continue
745
+ }
746
+
747
+ for _ , ds := range dailyStats {
748
+ // (was.session_started_at >= ts.from_ AND was.session_started_at < ts.to_)
749
+ // OR (was.session_ended_at > ts.from_ AND was.session_ended_at < ts.to_)
750
+ // OR (was.session_started_at < ts.from_ AND was.session_ended_at >= ts.to_)
751
+ if ! (((s .SessionStartedAt .After (ds .startTime ) || s .SessionStartedAt .Equal (ds .startTime )) && s .SessionStartedAt .Before (ds .endTime )) ||
752
+ (s .SessionEndedAt .After (ds .startTime ) && s .SessionEndedAt .Before (ds .endTime )) ||
753
+ (s .SessionStartedAt .Before (ds .startTime ) && (s .SessionEndedAt .After (ds .endTime ) || s .SessionEndedAt .Equal (ds .endTime )))) {
754
+ continue
755
+ }
756
+
757
+ ds .userSet [s .UserID ] = struct {}{}
758
+ ds .templateIDSet [w .TemplateID ] = struct {}{}
759
+ }
760
+ }
761
+
762
+ var result []database.GetTemplateInsightsByIntervalRow
763
+ for _ , ds := range dailyStats {
764
+ templateIDs := make ([]uuid.UUID , 0 , len (ds .templateIDSet ))
765
+ for templateID := range ds .templateIDSet {
766
+ templateIDs = append (templateIDs , templateID )
767
+ }
768
+ slices .SortFunc (templateIDs , func (a , b uuid.UUID ) int {
769
+ return slice .Ascending (a .String (), b .String ())
770
+ })
771
+ result = append (result , database.GetTemplateInsightsByIntervalRow {
772
+ StartTime : ds .startTime ,
773
+ EndTime : ds .endTime ,
774
+ TemplateIDs : templateIDs ,
775
+ ActiveUsers : int64 (len (ds .userSet )),
776
+ })
777
+ }
778
+ return result , nil
779
+ }
780
+
695
781
func (* FakeQuerier ) AcquireLock (_ context.Context , _ int64 ) error {
696
782
return xerrors .New ("AcquireLock must only be called within a transaction" )
697
783
}
@@ -2340,92 +2426,6 @@ func (q *FakeQuerier) GetTemplateDAUs(_ context.Context, arg database.GetTemplat
2340
2426
return rs , nil
2341
2427
}
2342
2428
2343
- func (q * FakeQuerier ) GetTemplateDailyInsights (ctx context.Context , arg database.GetTemplateDailyInsightsParams ) ([]database.GetTemplateDailyInsightsRow , error ) {
2344
- err := validateDatabaseType (arg )
2345
- if err != nil {
2346
- return nil , err
2347
- }
2348
-
2349
- q .mutex .RLock ()
2350
- defer q .mutex .RUnlock ()
2351
-
2352
- type dailyStat struct {
2353
- startTime , endTime time.Time
2354
- userSet map [uuid.UUID ]struct {}
2355
- templateIDSet map [uuid.UUID ]struct {}
2356
- }
2357
- dailyStats := []dailyStat {{arg .StartTime , arg .StartTime .AddDate (0 , 0 , 1 ), make (map [uuid.UUID ]struct {}), make (map [uuid.UUID ]struct {})}}
2358
- for dailyStats [len (dailyStats )- 1 ].endTime .Before (arg .EndTime ) {
2359
- dailyStats = append (dailyStats , dailyStat {dailyStats [len (dailyStats )- 1 ].endTime , dailyStats [len (dailyStats )- 1 ].endTime .AddDate (0 , 0 , 1 ), make (map [uuid.UUID ]struct {}), make (map [uuid.UUID ]struct {})})
2360
- }
2361
- if dailyStats [len (dailyStats )- 1 ].endTime .After (arg .EndTime ) {
2362
- dailyStats [len (dailyStats )- 1 ].endTime = arg .EndTime
2363
- }
2364
-
2365
- for _ , s := range q .workspaceAgentStats {
2366
- if s .CreatedAt .Before (arg .StartTime ) || s .CreatedAt .Equal (arg .EndTime ) || s .CreatedAt .After (arg .EndTime ) {
2367
- continue
2368
- }
2369
- if len (arg .TemplateIDs ) > 0 && ! slices .Contains (arg .TemplateIDs , s .TemplateID ) {
2370
- continue
2371
- }
2372
- if s .ConnectionCount == 0 {
2373
- continue
2374
- }
2375
-
2376
- for _ , ds := range dailyStats {
2377
- if s .CreatedAt .Before (ds .startTime ) || s .CreatedAt .Equal (ds .endTime ) || s .CreatedAt .After (ds .endTime ) {
2378
- continue
2379
- }
2380
- ds .userSet [s .UserID ] = struct {}{}
2381
- ds .templateIDSet [s .TemplateID ] = struct {}{}
2382
- }
2383
- }
2384
-
2385
- for _ , s := range q .workspaceAppStats {
2386
- w , err := q .getWorkspaceByIDNoLock (ctx , s .WorkspaceID )
2387
- if err != nil {
2388
- return nil , err
2389
- }
2390
-
2391
- if len (arg .TemplateIDs ) > 0 && ! slices .Contains (arg .TemplateIDs , w .TemplateID ) {
2392
- continue
2393
- }
2394
-
2395
- for _ , ds := range dailyStats {
2396
- // (was.session_started_at >= ts.from_ AND was.session_started_at < ts.to_)
2397
- // OR (was.session_ended_at > ts.from_ AND was.session_ended_at < ts.to_)
2398
- // OR (was.session_started_at < ts.from_ AND was.session_ended_at >= ts.to_)
2399
- if ! (((s .SessionStartedAt .After (ds .startTime ) || s .SessionStartedAt .Equal (ds .startTime )) && s .SessionStartedAt .Before (ds .endTime )) ||
2400
- (s .SessionEndedAt .After (ds .startTime ) && s .SessionEndedAt .Before (ds .endTime )) ||
2401
- (s .SessionStartedAt .Before (ds .startTime ) && (s .SessionEndedAt .After (ds .endTime ) || s .SessionEndedAt .Equal (ds .endTime )))) {
2402
- continue
2403
- }
2404
-
2405
- ds .userSet [s .UserID ] = struct {}{}
2406
- ds .templateIDSet [w .TemplateID ] = struct {}{}
2407
- }
2408
- }
2409
-
2410
- var result []database.GetTemplateDailyInsightsRow
2411
- for _ , ds := range dailyStats {
2412
- templateIDs := make ([]uuid.UUID , 0 , len (ds .templateIDSet ))
2413
- for templateID := range ds .templateIDSet {
2414
- templateIDs = append (templateIDs , templateID )
2415
- }
2416
- slices .SortFunc (templateIDs , func (a , b uuid.UUID ) int {
2417
- return slice .Ascending (a .String (), b .String ())
2418
- })
2419
- result = append (result , database.GetTemplateDailyInsightsRow {
2420
- StartTime : ds .startTime ,
2421
- EndTime : ds .endTime ,
2422
- TemplateIDs : templateIDs ,
2423
- ActiveUsers : int64 (len (ds .userSet )),
2424
- })
2425
- }
2426
- return result , nil
2427
- }
2428
-
2429
2429
func (q * FakeQuerier ) GetTemplateInsights (_ context.Context , arg database.GetTemplateInsightsParams ) (database.GetTemplateInsightsRow , error ) {
2430
2430
err := validateDatabaseType (arg )
2431
2431
if err != nil {
0 commit comments