2
2
import time
3
3
from collections import OrderedDict , defaultdict
4
4
from datetime import datetime , timedelta
5
- from typing import Callable , Optional , Sequence , Union
5
+ from typing import Callable , Sequence , Union
6
6
7
7
from django .conf import settings
8
8
from django .db import connection , models
@@ -55,7 +55,7 @@ def __init__(
55
55
property : str ,
56
56
data_collector : "DataCollector" ,
57
57
frequency : str ,
58
- interval : Optional [ timedelta ] = None ,
58
+ interval : timedelta | None = None ,
59
59
) -> None :
60
60
self .property = property
61
61
self .data_collector = data_collector
@@ -72,7 +72,7 @@ def __init__(
72
72
def __repr__ (self ) -> str :
73
73
return f"<CountStat: { self .property } >"
74
74
75
- def last_successful_fill (self ) -> Optional [ datetime ] :
75
+ def last_successful_fill (self ) -> datetime | None :
76
76
fillstate = FillState .objects .filter (property = self .property ).first ()
77
77
if fillstate is None :
78
78
return None
@@ -92,7 +92,7 @@ def __init__(
92
92
property : str ,
93
93
data_collector : "DataCollector" ,
94
94
frequency : str ,
95
- interval : Optional [ timedelta ] = None ,
95
+ interval : timedelta | None = None ,
96
96
dependencies : Sequence [str ] = [],
97
97
) -> None :
98
98
CountStat .__init__ (self , property , data_collector , frequency , interval = interval )
@@ -103,7 +103,7 @@ class DataCollector:
103
103
def __init__ (
104
104
self ,
105
105
output_table : type [BaseCount ],
106
- pull_function : Optional [ Callable [[str , datetime , datetime , Optional [ Realm ]] , int ]] ,
106
+ pull_function : Callable [[str , datetime , datetime , Realm | None ] , int ] | None ,
107
107
) -> None :
108
108
self .output_table = output_table
109
109
self .pull_function = pull_function
@@ -115,9 +115,7 @@ def depends_on_realm(self) -> bool:
115
115
## CountStat-level operations ##
116
116
117
117
118
- def process_count_stat (
119
- stat : CountStat , fill_to_time : datetime , realm : Optional [Realm ] = None
120
- ) -> None :
118
+ def process_count_stat (stat : CountStat , fill_to_time : datetime , realm : Realm | None = None ) -> None :
121
119
# TODO: The realm argument is not yet supported, in that we don't
122
120
# have a solution for how to update FillState if it is passed. It
123
121
# exists solely as partial plumbing for when we do fully implement
@@ -180,7 +178,7 @@ def do_update_fill_state(fill_state: FillState, end_time: datetime, state: int)
180
178
# We assume end_time is valid (e.g. is on a day or hour boundary as appropriate)
181
179
# and is time-zone-aware. It is the caller's responsibility to enforce this!
182
180
def do_fill_count_stat_at_hour (
183
- stat : CountStat , end_time : datetime , realm : Optional [ Realm ] = None
181
+ stat : CountStat , end_time : datetime , realm : Realm | None = None
184
182
) -> None :
185
183
start_time = end_time - stat .interval
186
184
if not isinstance (stat , LoggingCountStat ):
@@ -209,7 +207,7 @@ def do_delete_counts_at_hour(stat: CountStat, end_time: datetime) -> None:
209
207
210
208
211
209
def do_aggregate_to_summary_table (
212
- stat : CountStat , end_time : datetime , realm : Optional [ Realm ] = None
210
+ stat : CountStat , end_time : datetime , realm : Realm | None = None
213
211
) -> None :
214
212
cursor = connection .cursor ()
215
213
@@ -303,15 +301,15 @@ def do_aggregate_to_summary_table(
303
301
def do_increment_logging_stat (
304
302
model_object_for_bucket : Union [Realm , UserProfile , Stream , "RemoteRealm" , "RemoteZulipServer" ],
305
303
stat : CountStat ,
306
- subgroup : Optional [ Union [ str , int , bool ]] ,
304
+ subgroup : str | int | bool | None ,
307
305
event_time : datetime ,
308
306
increment : int = 1 ,
309
307
) -> None :
310
308
if not increment :
311
309
return
312
310
313
311
table = stat .data_collector .output_table
314
- id_args : dict [str , Union [ int , None ] ] = {}
312
+ id_args : dict [str , int | None ] = {}
315
313
conflict_args : list [str ] = []
316
314
if table == RealmCount :
317
315
assert isinstance (model_object_for_bucket , Realm )
@@ -433,7 +431,7 @@ def do_pull_by_sql_query(
433
431
start_time : datetime ,
434
432
end_time : datetime ,
435
433
query : QueryFn ,
436
- group_by : Optional [ tuple [type [models .Model ], str ]] ,
434
+ group_by : tuple [type [models .Model ], str ] | None ,
437
435
) -> int :
438
436
if group_by is None :
439
437
subgroup : Composable = SQL ("NULL" )
@@ -469,10 +467,10 @@ def do_pull_by_sql_query(
469
467
def sql_data_collector (
470
468
output_table : type [BaseCount ],
471
469
query : QueryFn ,
472
- group_by : Optional [ tuple [type [models .Model ], str ]] ,
470
+ group_by : tuple [type [models .Model ], str ] | None ,
473
471
) -> DataCollector :
474
472
def pull_function (
475
- property : str , start_time : datetime , end_time : datetime , realm : Optional [ Realm ] = None
473
+ property : str , start_time : datetime , end_time : datetime , realm : Realm | None = None
476
474
) -> int :
477
475
# The pull function type needs to accept a Realm argument
478
476
# because the 'minutes_active::day' CountStat uses
@@ -485,7 +483,7 @@ def pull_function(
485
483
return DataCollector (output_table , pull_function )
486
484
487
485
488
- def count_upload_space_used_by_realm_query (realm : Optional [ Realm ] ) -> QueryFn :
486
+ def count_upload_space_used_by_realm_query (realm : Realm | None ) -> QueryFn :
489
487
if realm is None :
490
488
realm_clause : Composable = SQL ("" )
491
489
else :
@@ -520,7 +518,7 @@ def count_upload_space_used_by_realm_query(realm: Optional[Realm]) -> QueryFn:
520
518
521
519
522
520
def do_pull_minutes_active (
523
- property : str , start_time : datetime , end_time : datetime , realm : Optional [ Realm ] = None
521
+ property : str , start_time : datetime , end_time : datetime , realm : Realm | None = None
524
522
) -> int :
525
523
user_activity_intervals = (
526
524
UserActivityInterval .objects .filter (
@@ -555,7 +553,7 @@ def do_pull_minutes_active(
555
553
return len (rows )
556
554
557
555
558
- def count_message_by_user_query (realm : Optional [ Realm ] ) -> QueryFn :
556
+ def count_message_by_user_query (realm : Realm | None ) -> QueryFn :
559
557
if realm is None :
560
558
realm_clause : Composable = SQL ("" )
561
559
else :
@@ -588,7 +586,7 @@ def count_message_by_user_query(realm: Optional[Realm]) -> QueryFn:
588
586
589
587
590
588
# Note: ignores the group_by / group_by_clause.
591
- def count_message_type_by_user_query (realm : Optional [ Realm ] ) -> QueryFn :
589
+ def count_message_type_by_user_query (realm : Realm | None ) -> QueryFn :
592
590
if realm is None :
593
591
realm_clause : Composable = SQL ("" )
594
592
else :
@@ -643,7 +641,7 @@ def count_message_type_by_user_query(realm: Optional[Realm]) -> QueryFn:
643
641
# use this also subgroup on UserProfile.is_bot. If in the future there is a
644
642
# stat that counts messages by stream and doesn't need the UserProfile
645
643
# table, consider writing a new query for efficiency.
646
- def count_message_by_stream_query (realm : Optional [ Realm ] ) -> QueryFn :
644
+ def count_message_by_stream_query (realm : Realm | None ) -> QueryFn :
647
645
if realm is None :
648
646
realm_clause : Composable = SQL ("" )
649
647
else :
@@ -683,7 +681,7 @@ def count_message_by_stream_query(realm: Optional[Realm]) -> QueryFn:
683
681
# same event_time and event_type in [RealmAuditLog.USER_CREATED,
684
682
# USER_DEACTIVATED, etc]. In particular, it's important to ensure
685
683
# that migrations don't cause that to happen.
686
- def check_realmauditlog_by_user_query (realm : Optional [ Realm ] ) -> QueryFn :
684
+ def check_realmauditlog_by_user_query (realm : Realm | None ) -> QueryFn :
687
685
if realm is None :
688
686
realm_clause : Composable = SQL ("" )
689
687
else :
@@ -722,7 +720,7 @@ def check_realmauditlog_by_user_query(realm: Optional[Realm]) -> QueryFn:
722
720
)
723
721
724
722
725
- def check_useractivityinterval_by_user_query (realm : Optional [ Realm ] ) -> QueryFn :
723
+ def check_useractivityinterval_by_user_query (realm : Realm | None ) -> QueryFn :
726
724
if realm is None :
727
725
realm_clause : Composable = SQL ("" )
728
726
else :
@@ -746,7 +744,7 @@ def check_useractivityinterval_by_user_query(realm: Optional[Realm]) -> QueryFn:
746
744
).format (** kwargs , realm_clause = realm_clause )
747
745
748
746
749
- def count_realm_active_humans_query (realm : Optional [ Realm ] ) -> QueryFn :
747
+ def count_realm_active_humans_query (realm : Realm | None ) -> QueryFn :
750
748
if realm is None :
751
749
realm_clause : Composable = SQL ("" )
752
750
else :
@@ -817,7 +815,7 @@ def count_realm_active_humans_query(realm: Optional[Realm]) -> QueryFn:
817
815
).format (** kwargs )
818
816
819
817
820
- def get_count_stats (realm : Optional [ Realm ] = None ) -> dict [str , CountStat ]:
818
+ def get_count_stats (realm : Realm | None = None ) -> dict [str , CountStat ]:
821
819
## CountStat declarations ##
822
820
823
821
count_stats_ = [
0 commit comments