Skip to content

Commit 7f957df

Browse files
vaibhavatlanAryamanz29
authored andcommitted
Added for workflow search response pagination support
1 parent acf8432 commit 7f957df

File tree

1 file changed

+59
-8
lines changed

1 file changed

+59
-8
lines changed

pyatlan/model/workflow.py

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
# SPDX-License-Identifier: Apache-2.0
22
# Copyright 2022 Atlan Pte. Ltd.
3-
from typing import Any, Dict, List, Optional
3+
from typing import Any, Dict, Generator, List, Optional
44

5-
from pydantic.v1 import Field
5+
from pydantic.v1 import Field, PrivateAttr, ValidationError, parse_obj_as
66

7+
from pyatlan.client.common import ApiCaller
8+
from pyatlan.errors import ErrorCode
79
from pyatlan.model.core import AtlanObject
810
from pyatlan.model.enums import AtlanWorkflowPhase, SortOrder
911
from pyatlan.model.search import Query, SortItem
12+
from pyatlan.utils import API
1013

1114

1215
class PackageParameter(AtlanObject):
@@ -132,12 +135,6 @@ class WorkflowSearchHits(AtlanObject):
132135
hits: Optional[List[WorkflowSearchResult]] = Field(default=None)
133136

134137

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-
141138
class ReRunRequest(AtlanObject):
142139
namespace: Optional[str] = Field(default="default")
143140
resource_kind: Optional[str] = Field(default="WorkflowTemplate")
@@ -217,3 +214,57 @@ def __init__(__pydantic_self__, **data: Any) -> None:
217214
__pydantic_self__.__fields_set__.update(
218215
["from_", "size", "track_total_hits", "sort"]
219216
)
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

Comments
 (0)