|
1 | 1 | # SPDX-License-Identifier: Apache-2.0
|
2 | 2 | # Copyright 2022 Atlan Pte. Ltd.
|
3 |
| -from typing import Any, Dict, List, Optional |
| 3 | +from typing import Any, Dict, Generator, List, Optional |
4 | 4 |
|
5 |
| -from pydantic.v1 import Field |
| 5 | +from pydantic.v1 import Field, PrivateAttr, ValidationError, parse_obj_as |
6 | 6 |
|
| 7 | +from pyatlan.client.common import ApiCaller |
| 8 | +from pyatlan.errors import ErrorCode |
7 | 9 | from pyatlan.model.core import AtlanObject
|
8 | 10 | from pyatlan.model.enums import AtlanWorkflowPhase, SortOrder
|
9 | 11 | from pyatlan.model.search import Query, SortItem
|
| 12 | +from pyatlan.utils import API |
10 | 13 |
|
11 | 14 |
|
12 | 15 | class PackageParameter(AtlanObject):
|
@@ -132,12 +135,6 @@ class WorkflowSearchHits(AtlanObject):
|
132 | 135 | hits: Optional[List[WorkflowSearchResult]] = Field(default=None)
|
133 | 136 |
|
134 | 137 |
|
135 |
| -class WorkflowSearchResponse(AtlanObject): |
136 |
| - took: Optional[int] = Field(default=None) |
137 |
| - hits: Optional[WorkflowSearchHits] = Field(default=None) |
138 |
| - shards: Optional[Dict[str, Any]] = Field(alias="_shards", default=None) |
139 |
| - |
140 |
| - |
141 | 138 | class ReRunRequest(AtlanObject):
|
142 | 139 | namespace: Optional[str] = Field(default="default")
|
143 | 140 | resource_kind: Optional[str] = Field(default="WorkflowTemplate")
|
@@ -217,3 +214,57 @@ def __init__(__pydantic_self__, **data: Any) -> None:
|
217 | 214 | __pydantic_self__.__fields_set__.update(
|
218 | 215 | ["from_", "size", "track_total_hits", "sort"]
|
219 | 216 | )
|
| 217 | + |
| 218 | + |
| 219 | +class WorkflowSearchResponse(AtlanObject): |
| 220 | + _size: int = PrivateAttr() |
| 221 | + _start: int = PrivateAttr() |
| 222 | + _endpoint: API = PrivateAttr() |
| 223 | + _client: ApiCaller = PrivateAttr() |
| 224 | + _criteria: WorkflowSearchRequest = PrivateAttr() |
| 225 | + took: Optional[int] = Field(default=None) |
| 226 | + hits: Optional[WorkflowSearchHits] = Field(default=None) |
| 227 | + shards: Optional[Dict[str, Any]] = Field(alias="_shards", default=None) |
| 228 | + |
| 229 | + def __init__(self, **data: Any): |
| 230 | + super().__init__(**data) |
| 231 | + self._endpoint = data.get("endpoint") # type: ignore[assignment] |
| 232 | + self._client = data.get("client") # type: ignore[assignment] |
| 233 | + self._criteria = data.get("criteria") # type: ignore[assignment] |
| 234 | + self._size = data.get("size") # type: ignore[assignment] |
| 235 | + self._start = data.get("from") # type: ignore[assignment] |
| 236 | + |
| 237 | + def current_page(self) -> Optional[List[WorkflowSearchResult]]: |
| 238 | + return self.records |
| 239 | + |
| 240 | + def next_page(self, start=None, size=None) -> bool: |
| 241 | + self._start = start or self._start + self._size |
| 242 | + if size: |
| 243 | + self._size = size |
| 244 | + return self._get_next_page() if self.records else False |
| 245 | + |
| 246 | + def _get_next_page(self): |
| 247 | + self._criteria.from_ = self._start |
| 248 | + self._criteria.size = self._size |
| 249 | + raw_json = self._client._call_api( |
| 250 | + api=self._endpoint.format_path_with_params(), |
| 251 | + query_params=self._criteria, |
| 252 | + ) |
| 253 | + if not raw_json.get("records"): |
| 254 | + self.records = [] |
| 255 | + return False |
| 256 | + try: |
| 257 | + self.records = parse_obj_as( |
| 258 | + List[WorkflowSearchResult], raw_json.get("records") |
| 259 | + ) |
| 260 | + except ValidationError as err: |
| 261 | + raise ErrorCode.JSON_ERROR.exception_with_parameters( |
| 262 | + raw_json, 200, str(err) |
| 263 | + ) from err |
| 264 | + return True |
| 265 | + |
| 266 | + def __iter__(self) -> Generator[WorkflowSearchResult, None, None]: # type: ignore[override] |
| 267 | + while True: |
| 268 | + yield from self.current_page() or [] |
| 269 | + if not self.next_page(): |
| 270 | + break |
0 commit comments