@@ -10,6 +10,16 @@ class OrderByMetric:
10
10
descending : bool = False
11
11
12
12
13
+ @dataclass (frozen = True )
14
+ class GroupByParam :
15
+ """Spec for a group_by, i.e a dimension or an entity.
16
+
17
+ Not specifying a grain will defer the grain choice to the server.
18
+ """
19
+
20
+ name : str
21
+ grain : Optional [str ]
22
+
13
23
@dataclass (frozen = True )
14
24
class OrderByGroupBy :
15
25
"""Spec for ordering by a group_by, i.e a dimension or an entity.
@@ -21,7 +31,6 @@ class OrderByGroupBy:
21
31
grain : Optional [str ]
22
32
descending : bool = False
23
33
24
-
25
34
OrderBySpec = Union [OrderByMetric , OrderByGroupBy ]
26
35
27
36
@@ -33,7 +42,7 @@ class QueryParameters(TypedDict, total=False):
33
42
34
43
saved_query : str
35
44
metrics : List [str ]
36
- group_by : List [str ]
45
+ group_by : List [Union [ GroupByParam , str ] ]
37
46
limit : int
38
47
order_by : List [Union [OrderBySpec , str ]]
39
48
where : List [str ]
@@ -44,8 +53,8 @@ class QueryParameters(TypedDict, total=False):
44
53
class AdhocQueryParametersStrict :
45
54
"""The parameters of an adhoc query, strictly validated."""
46
55
47
- metrics : Optional [List [str ]]
48
- group_by : Optional [List [str ]]
56
+ metrics : Optional [List [Union [ str , OrderByMetric ] ]]
57
+ group_by : Optional [List [Union [ str , OrderByGroupBy ] ]]
49
58
limit : Optional [int ]
50
59
order_by : Optional [List [OrderBySpec ]]
51
60
where : Optional [List [str ]]
@@ -64,7 +73,9 @@ class SavedQueryQueryParametersStrict:
64
73
65
74
66
75
def validate_order_by (
67
- known_metrics : List [str ], known_group_bys : List [str ], clause : Union [OrderBySpec , str ]
76
+ known_metrics : List [Union [str , OrderByMetric ]],
77
+ known_group_bys : List [Union [str , OrderByGroupBy ]],
78
+ clause : Union [OrderBySpec , str ],
68
79
) -> OrderBySpec :
69
80
"""Validate an order by clause like `-metric_name`."""
70
81
if isinstance (clause , OrderByMetric ) or isinstance (clause , OrderByGroupBy ):
@@ -74,10 +85,23 @@ def validate_order_by(
74
85
if descending or clause .startswith ("+" ):
75
86
clause = clause [1 :]
76
87
77
- if clause in known_metrics :
88
+ normalized_known_metrics : list [str ] = []
89
+ for known_metric in known_metrics :
90
+ if isinstance (known_metric , OrderByMetric ):
91
+ normalized_known_metrics .append (known_metric .name )
92
+ else :
93
+ normalized_known_metrics .append (known_metric )
94
+
95
+ if clause in normalized_known_metrics :
78
96
return OrderByMetric (name = clause , descending = descending )
79
97
80
- if clause in known_group_bys or clause == "metric_time" :
98
+ normalized_known_group_bys : list [str ] = []
99
+ for known_group_by in known_group_bys :
100
+ if isinstance (known_group_by , OrderByGroupBy ):
101
+ normalized_known_group_bys .append (known_group_by .name )
102
+ else :
103
+ normalized_known_group_bys .append (known_group_by )
104
+ if clause in normalized_known_group_bys or clause == "metric_time" :
81
105
return OrderByGroupBy (name = clause , descending = descending , grain = None )
82
106
83
107
# TODO: make this error less strict when server supports order_by type inference.
0 commit comments