|
3 | 3 | import http |
4 | 4 | import json |
5 | 5 | from typing import Optional, List |
6 | | -from typing import TYPE_CHECKING |
7 | 6 | import requests |
8 | 7 |
|
9 | | -from ravendb import constants |
| 8 | +from ravendb.documents.session.time_series import ( |
| 9 | + TimeSeriesRange, |
| 10 | + TimeSeriesTimeRange, |
| 11 | + TimeSeriesCountRange, |
| 12 | + AbstractTimeSeriesRange, |
| 13 | +) |
| 14 | +from ravendb.primitives import constants |
10 | 15 | from ravendb.documents.commands.results import GetDocumentsResult |
11 | 16 | from ravendb.documents.queries.utils import HashCalculator |
12 | 17 | from ravendb.http.misc import ResponseDisposeHandling |
|
18 | 23 | from ravendb.http.server_node import ServerNode |
19 | 24 | from ravendb.tools.utils import Utils |
20 | 25 |
|
21 | | -if TYPE_CHECKING: |
22 | | - from ravendb.documents.conventions import DocumentConventions |
23 | | - |
24 | 26 |
|
25 | 27 | class PutResult: |
26 | 28 | def __init__(self, key: Optional[str] = None, change_vector: Optional[str] = None): |
@@ -76,7 +78,7 @@ def create_request(self, node: ServerNode) -> requests.Request: |
76 | 78 |
|
77 | 79 |
|
78 | 80 | class HeadDocumentCommand(RavenCommand[str]): |
79 | | - def __init__(self, key: str, change_vector: str): |
| 81 | + def __init__(self, key: str, change_vector: Optional[str]): |
80 | 82 | super(HeadDocumentCommand, self).__init__(str) |
81 | 83 | if key is None: |
82 | 84 | raise ValueError("Key cannot be None") |
@@ -124,7 +126,7 @@ def __init__(self): |
124 | 126 | self._key: Optional[str] = None |
125 | 127 | self._counters: Optional[List[str]] = None |
126 | 128 | self._include_all_counters: Optional[bool] = None |
127 | | - self._time_series_includes: Optional[List] = None # todo: AbstractTimeSeriesRange |
| 129 | + self._time_series_includes: Optional[List[AbstractTimeSeriesRange]] = None |
128 | 130 |
|
129 | 131 | self._compare_exchange_value_includes: Optional[List[str]] = None |
130 | 132 |
|
@@ -248,19 +250,38 @@ def create_request(self, node: ServerNode) -> requests.Request: |
248 | 250 | for include in self._includes: |
249 | 251 | path_builder.append(f"&include={include}") |
250 | 252 |
|
251 | | - # todo: counters |
252 | 253 | if self._include_all_counters: |
253 | 254 | path_builder.append(f"&counter={constants.Counters.ALL}") |
254 | 255 | elif self._counters: |
255 | 256 | for counter in self._counters: |
256 | 257 | path_builder.append(f"&counter={counter}") |
257 | 258 |
|
258 | | - # todo: time series |
259 | 259 | if self._time_series_includes is not None: |
260 | | - for time_series in self._time_series_includes: |
261 | | - path_builder.append( |
262 | | - f"×eries={time_series.name}&from={time_series.from_date}&to={time_series.to_date}" |
263 | | - ) |
| 260 | + for ts_include in self._time_series_includes: |
| 261 | + if isinstance(ts_include, TimeSeriesRange): |
| 262 | + range_: TimeSeriesRange = ts_include |
| 263 | + path_builder.append( |
| 264 | + f"×eries={range_.name}" |
| 265 | + f"&from={Utils.datetime_to_string(range_.from_date) if range_.from_date else ''}" |
| 266 | + f"&to={Utils.datetime_to_string(range_.to_date) if range_.to_date else ''}" |
| 267 | + ) |
| 268 | + elif isinstance(ts_include, TimeSeriesTimeRange): |
| 269 | + time_range: TimeSeriesTimeRange = ts_include |
| 270 | + path_builder.append( |
| 271 | + f"×eriestime={time_range.name}" |
| 272 | + f"&timeType={time_range.type.value}" |
| 273 | + f"&timeValue={time_range.time.value}" |
| 274 | + f"&timeUnit={time_range.time.unit.value}" |
| 275 | + ) |
| 276 | + elif isinstance(ts_include, TimeSeriesCountRange): |
| 277 | + count_range: TimeSeriesCountRange = ts_include |
| 278 | + path_builder.append( |
| 279 | + f"×eriescount={count_range.name}" |
| 280 | + f"&countType={count_range.type.value}" |
| 281 | + f"&countValue={count_range.count}" |
| 282 | + ) |
| 283 | + else: |
| 284 | + raise TypeError(f"Unexpected TimeSeries range {ts_include.__class__.__name__}") |
264 | 285 |
|
265 | 286 | if self._compare_exchange_value_includes is not None: |
266 | 287 | for compare_exchange_value in self._compare_exchange_value_includes: |
@@ -368,7 +389,7 @@ def create_request(self, node: ServerNode) -> requests.Request: |
368 | 389 |
|
369 | 390 |
|
370 | 391 | class HeadAttachmentCommand(RavenCommand[str]): |
371 | | - def __init__(self, document_id: str, name: str, change_vector: str): |
| 392 | + def __init__(self, document_id: str, name: str, change_vector: Optional[str]): |
372 | 393 | super().__init__(str) |
373 | 394 |
|
374 | 395 | if document_id.isspace(): |
|
0 commit comments