5
5
import httpx
6
6
import json
7
7
from pydantic import BaseModel , AwareDatetime , ValidationError , model_validator
8
- from typing import AsyncGenerator , Dict , Generator , Iterator , List , Literal , Optional , Any , get_args
8
+ from typing import AsyncIterator , Dict , Iterator , List , Literal , Optional , Any , get_args
9
9
from typing_extensions import Self
10
10
from numbers import Number
11
11
@@ -90,12 +90,12 @@ def to_dict(self) -> Dict:
90
90
91
91
class ChunkedParams (BaseModel ):
92
92
dataset : str
93
- metric : str
94
93
groupBy : Optional [List [FieldName ]] = None
95
94
aggregator : Optional [Aggregator ] = None
96
95
fields : Optional [List [FieldName ]] = None
97
96
orderBy : Optional [List [str ]] = None # More complex than just FieldName, can be prefixed with - to invert sort
98
97
dataType : Optional [DataType ] = None
98
+ filter : Optional [str ] = None
99
99
start : datetime
100
100
end : datetime
101
101
jump : timedelta = timedelta (hours = 1 )
@@ -112,6 +112,9 @@ def chunks(self) -> Iterator[QueryParams]:
112
112
current_start = self .start
113
113
while current_start < self .end :
114
114
current_end = current_start + self .jump
115
+ filter = f'timestamp>={ current_start .isoformat ()} ;timestamp<{ current_end .isoformat ()} '
116
+ if self .filter :
117
+ filter += f';{ self .filter } '
115
118
116
119
yield QueryParams (
117
120
dataset = self .dataset ,
@@ -120,7 +123,7 @@ def chunks(self) -> Iterator[QueryParams]:
120
123
fields = self .fields ,
121
124
orderBy = self .orderBy ,
122
125
dataType = self .dataType ,
123
- filter = f'timestamp>= { current_start . isoformat () } and timestamp< { current_end . isoformat () } and metric== { self . metric } '
126
+ filter = filter
124
127
)
125
128
126
129
current_start += self .jump
@@ -219,12 +222,9 @@ async def query(
219
222
220
223
async def query_time_chunked (
221
224
self ,
222
- dataset : str ,
223
- params : QueryParams ,
224
- from_time : datetime ,
225
- to_time : datetime ,
226
- jump : timedelta ,
227
- filter_ : Optional [str ] = None ,
228
- direction : Literal ["asc" , "desc" ] = "asc" ,
229
- ) -> AsyncGenerator [List [Datapoint ], None ]:
230
- raise NotImplementedError ()
225
+ params : ChunkedParams
226
+ ) -> AsyncIterator [List [Datapoint ]]
227
+ for chunk in params .chunks ():
228
+ yield await self .query (
229
+ chunk
230
+ )
0 commit comments