Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion ayon_api/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,11 @@ class HTTPRequestError(RequestError):
pass


class GraphQlQueryFailed(Exception):
class GraphQlQueryError(Exception):
pass


class GraphQlQueryFailed(GraphQlQueryError):
def __init__(self, errors, query, variables):
if variables is None:
variables = {}
Expand Down
48 changes: 33 additions & 15 deletions ayon_api/graphql.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import typing
from typing import Optional, Iterable, Any, Generator

from .exceptions import GraphQlQueryFailed
from .exceptions import GraphQlQueryError, GraphQlQueryFailed
from .utils import SortOrder

if typing.TYPE_CHECKING:
Expand Down Expand Up @@ -304,7 +304,7 @@ def calculate_query(self) -> str:
str: GraphQl string with variables and headers.

Raises:
ValueError: Query has no fiels.
ValueError: Query has no fields.

"""
if not self._children:
Expand Down Expand Up @@ -370,7 +370,7 @@ def query(self, con: ServerAPI) -> dict[str, Any]:
variables = self.get_variables_values()
response = con.query_graphql(
query_str,
self.get_variables_values()
variables
)
if response.errors:
raise GraphQlQueryFailed(response.errors, query_str, variables)
Expand All @@ -396,6 +396,7 @@ def continuous_query(
while self.need_query:
query_str = self.calculate_query()
variables = self.get_variables_values()

response = con.query_graphql(query_str, variables)
if response.errors:
raise GraphQlQueryFailed(
Expand Down Expand Up @@ -902,8 +903,13 @@ def parse_result(
progress_data[cursor_key] = nodes_by_cursor

page_info = value["pageInfo"]
new_cursor = page_info["endCursor"]
self._need_query = page_info["hasNextPage"]
if self._order == SortOrder.ascending:
new_cursor = page_info["endCursor"]
self._need_query = page_info["hasNextPage"]
else:
new_cursor = page_info["startCursor"]
self._need_query = page_info["hasPreviousPage"]

edges = value["edges"]
# Fake result parse
if not edges:
Expand Down Expand Up @@ -931,15 +937,18 @@ def parse_result(
for child in self._children:
child.parse_result(edge["node"], edge_value, progress_data)

if not self._need_query:
return

change_cursor = True
for child in self._children_iter():
if child.need_query:
change_cursor = False

if change_cursor:
if change_cursor and self._need_query:
if new_cursor == self._cursor:
raise GraphQlQueryError(
"Cursor didn't change during pagination."
" This can cause infinite loop."
)

for child in self._children_iter():
child.reset_cursor()
self._cursor = new_cursor
Expand All @@ -949,9 +958,7 @@ def _get_cursor_key(self) -> str:

def get_filters(self) -> dict[str, Any]:
filters = super().get_filters()
limit_key = "first"
if self._order == SortOrder.descending:
limit_key = "last"
limit_key = "first" if self._order == SortOrder.ascending else "last"

limit_amount = 300
if self._limit:
Expand All @@ -968,7 +975,10 @@ def get_filters(self) -> dict[str, Any]:
filters[limit_key] = limit_amount

if self._cursor:
filters["after"] = self._cursor
cursor_key = (
"after" if self._order == SortOrder.ascending else "before"
)
filters[cursor_key] = self._cursor
return filters

def calculate_query(self) -> str:
Expand Down Expand Up @@ -1006,8 +1016,16 @@ def calculate_query(self) -> str:
# Add page information
output.append(edges_offset + "pageInfo {")
for page_key in (
"endCursor",
"hasNextPage",
(
"endCursor"
if self._order == SortOrder.ascending
else "startCursor"
),
(
"hasNextPage"
if self._order == SortOrder.ascending
else "hasPreviousPage"
),
):
output.append(node_offset + page_key)
output.append(edges_offset + "}")
Expand Down
Loading