20
20
from ._db import metadata
21
21
from ._printer import create_printer , APrinter
22
22
from ._exceptions import DatabaseErrorException
23
- from ._validate import DateRange , extract_strings
23
+ from ._validate import extract_strings
24
24
from ._params import GeoPair , SourceSignalPair , TimePair
25
- from .utils import time_values_to_ranges , days_to_ranges , weeks_to_ranges
25
+ from .utils import time_values_to_ranges , TimeValues
26
26
27
27
28
28
def date_string (value : int ) -> str :
@@ -36,7 +36,7 @@ def date_string(value: int) -> str:
36
36
37
37
def to_condition (
38
38
field : str ,
39
- value : Union [Tuple [ str , str ], str , Tuple [int , int ], int ],
39
+ value : Union [str , Tuple [int , int ], int ],
40
40
param_key : str ,
41
41
params : Dict [str , Any ],
42
42
formatter = lambda x : x ,
@@ -52,7 +52,7 @@ def to_condition(
52
52
53
53
def filter_values (
54
54
field : str ,
55
- values : Optional [Sequence [Union [Tuple [ str , str ], str , Tuple [int , int ], int ]]],
55
+ values : Optional [Sequence [Union [str , Tuple [int , int ], int ]]],
56
56
param_key : str ,
57
57
params : Dict [str , Any ],
58
58
formatter = lambda x : x ,
@@ -68,7 +68,7 @@ def filter_values(
68
68
69
69
def filter_strings (
70
70
field : str ,
71
- values : Optional [Sequence [Union [ Tuple [ str , str ], str ] ]],
71
+ values : Optional [Sequence [str ]],
72
72
param_key : str ,
73
73
params : Dict [str , Any ],
74
74
):
@@ -86,7 +86,7 @@ def filter_integers(
86
86
87
87
def filter_dates (
88
88
field : str ,
89
- values : Optional [Sequence [ Union [ Tuple [ int , int ], int ]] ],
89
+ values : Optional [TimeValues ],
90
90
param_key : str ,
91
91
params : Dict [str , Any ],
92
92
):
@@ -171,32 +171,29 @@ def filter_pair(pair: SourceSignalPair, i) -> str:
171
171
return f"({ ' OR ' .join (parts )} )"
172
172
173
173
174
- def filter_time_pairs (
174
+ def filter_time_pair (
175
175
type_field : str ,
176
176
time_field : str ,
177
- values : Sequence [TimePair ],
177
+ pair : Optional [TimePair ],
178
178
param_key : str ,
179
179
params : Dict [str , Any ],
180
180
) -> str :
181
181
"""
182
- returns the SQL sub query to filter by the given time pairs
182
+ returns the SQL sub query to filter by the given time pair
183
183
"""
184
-
185
- def filter_pair (pair : TimePair , i ) -> str :
186
- type_param = f"{ param_key } _{ i } t"
187
- params [type_param ] = pair .time_type
188
- if isinstance (pair .time_values , bool ) and pair .time_values :
189
- return f"{ type_field } = :{ type_param } "
190
- ranges = weeks_to_ranges (pair .time_values ) if pair .is_week else days_to_ranges (pair .time_values )
191
- return f"({ type_field } = :{ type_param } AND { filter_integers (time_field , cast (Sequence [Union [int , Tuple [int ,int ]]], ranges ), type_param , params )} )"
192
-
193
- parts = [filter_pair (p , i ) for i , p in enumerate (values )]
194
-
195
- if not parts :
196
- # something has to be selected
184
+ # safety path; should normally not be reached as time pairs are enforced by the API
185
+ if not pair :
197
186
return "FALSE"
198
187
199
- return f"({ ' OR ' .join (parts )} )"
188
+ type_param = f"{ param_key } _0t"
189
+ params [type_param ] = pair .time_type
190
+ if isinstance (pair .time_values , bool ) and pair .time_values :
191
+ parts = f"{ type_field } = :{ type_param } "
192
+ else :
193
+ ranges = pair .to_ranges ().time_values
194
+ parts = f"({ type_field } = :{ type_param } AND { filter_integers (time_field , ranges , type_param , params )} )"
195
+
196
+ return f"({ parts } )"
200
197
201
198
202
199
def parse_row (
@@ -393,7 +390,7 @@ def where(self, **kvargs: Dict[str, Any]) -> "QueryBuilder":
393
390
def where_strings (
394
391
self ,
395
392
field : str ,
396
- values : Optional [Sequence [Union [ Tuple [ str , str ], str ] ]],
393
+ values : Optional [Sequence [str ]],
397
394
param_key : Optional [str ] = None ,
398
395
) -> "QueryBuilder" :
399
396
fq_field = f"{ self .alias } .{ field } " if "." not in field else field
@@ -413,16 +410,6 @@ def where_integers(
413
410
self .conditions .append (filter_integers (fq_field , values , param_key or field , self .params ))
414
411
return self
415
412
416
- def where_dates (
417
- self ,
418
- field : str ,
419
- values : Optional [Sequence [Union [Tuple [int , int ], int ]]],
420
- param_key : Optional [str ] = None ,
421
- ) -> "QueryBuilder" :
422
- fq_field = self ._fq_field (field )
423
- self .conditions .append (filter_dates (fq_field , values , param_key or field , self .params ))
424
- return self
425
-
426
413
def where_geo_pairs (
427
414
self ,
428
415
type_field : str ,
@@ -463,17 +450,17 @@ def where_source_signal_pairs(
463
450
)
464
451
return self
465
452
466
- def where_time_pairs (
453
+ def where_time_pair (
467
454
self ,
468
455
type_field : str ,
469
456
value_field : str ,
470
- values : Sequence [TimePair ],
457
+ values : Optional [TimePair ],
471
458
param_key : Optional [str ] = None ,
472
459
) -> "QueryBuilder" :
473
460
fq_type_field = self ._fq_field (type_field )
474
461
fq_value_field = self ._fq_field (value_field )
475
462
self .conditions .append (
476
- filter_time_pairs (
463
+ filter_time_pair (
477
464
fq_type_field ,
478
465
fq_value_field ,
479
466
values ,
0 commit comments