Skip to content

Commit 9274383

Browse files
authored
Merge pull request #330 from ynput/enhancement/nested-edge-fetching-enhancement
Faster tasks by folder path fetching
2 parents 2cdf288 + a0b91ef commit 9274383

2 files changed

Lines changed: 32 additions & 99 deletions

File tree

ayon_api/_api_helpers/tasks.py

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@
99
create_entity_id,
1010
NOT_SET,
1111
)
12-
from ayon_api.graphql_queries import (
13-
tasks_graphql_query,
14-
tasks_by_folder_paths_graphql_query,
15-
)
12+
from ayon_api.graphql_queries import tasks_graphql_query
1613

1714
from .base import BaseServerAPI
1815

@@ -236,61 +233,47 @@ def get_tasks_by_folder_paths(
236233
folder path.
237234
238235
"""
239-
folder_paths = set(folder_paths)
240-
if not project_name or not folder_paths:
241-
return {}
242-
243-
graphql_filters = {
244-
"projectName": project_name,
245-
"folderPaths": list(folder_paths),
236+
output = {
237+
folder_path: []
238+
for folder_path in folder_paths
239+
}
240+
if not project_name or not output:
241+
return output
242+
243+
folder_path_by_id = {
244+
folder["id"]: folder["path"]
245+
for folder in self.get_folders(
246+
project_name,
247+
folder_paths=output.keys(),
248+
fields={"id", "path"},
249+
)
246250
}
247-
248-
if not prepare_list_filters(
249-
graphql_filters,
250-
("taskNames", task_names),
251-
("taskTypes", task_types),
252-
("taskAssigneesAny", assignees),
253-
("taskAssigneesAll", assignees_all),
254-
("taskStatuses", statuses),
255-
("taskTags", tags),
256-
):
257-
return {}
258-
259-
filters = self._prepare_advanced_filters(filters)
260-
if filters:
261-
graphql_filters["filter"] = filters
262251

263252
if not fields:
264253
fields = self.get_default_fields_for_type("task")
265254
else:
266255
fields = set(fields)
267256
self._prepare_fields("task", fields, own_attributes)
268257

269-
if active is not None:
270-
fields.add("active")
271-
272-
self._prepare_link_fields(fields)
273-
274-
query = tasks_by_folder_paths_graphql_query(fields)
275-
for attr, filter_value in graphql_filters.items():
276-
query.set_variable_value(attr, filter_value)
258+
fields.add("folderId")
277259

278-
output = {
279-
folder_path: []
280-
for folder_path in folder_paths
281-
}
282-
for parsed_data in query.continuous_query(self):
283-
for folder in parsed_data["project"]["folders"]:
284-
folder_path = folder["path"]
285-
for task in folder["tasks"]:
286-
if active is not None and active is not task["active"]:
287-
continue
288-
289-
self._convert_entity_data(task)
260+
for task_entity in self.get_tasks(
261+
project_name,
262+
folder_ids=folder_path_by_id.keys(),
263+
task_names=task_names,
264+
task_types=task_types,
265+
assignees=assignees,
266+
assignees_all=assignees_all,
267+
statuses=statuses,
268+
tags=tags,
269+
active=active,
270+
filters=filters,
271+
fields=fields,
272+
):
273+
folder_id = task_entity["folderId"]
274+
folder_path = folder_path_by_id[folder_id]
275+
output[folder_path].append(task_entity)
290276

291-
if own_attributes:
292-
fill_own_attribs(task)
293-
output[folder_path].append(task)
294277
return output
295278

296279
def get_tasks_by_folder_path(

ayon_api/graphql_queries.py

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -243,56 +243,6 @@ def tasks_graphql_query(fields: set[str]) -> GraphQlQuery:
243243
return query
244244

245245

246-
def tasks_by_folder_paths_graphql_query(fields: set[str]) -> GraphQlQuery:
247-
query = GraphQlQuery("TasksByFolderPathQuery")
248-
project_name_var = query.add_variable("projectName", "String!")
249-
task_names_var = query.add_variable("taskNames", "[String!]")
250-
task_types_var = query.add_variable("taskTypes", "[String!]")
251-
folder_paths_var = query.add_variable("folderPaths", "[String!]")
252-
assignees_any_var = query.add_variable("taskAssigneesAny", "[String!]")
253-
assignees_all_var = query.add_variable("taskAssigneesAll", "[String!]")
254-
statuses_var = query.add_variable("taskStatuses", "[String!]")
255-
tags_var = query.add_variable("taskTags", "[String!]")
256-
filter_var = query.add_variable("filter", "String!")
257-
258-
project_field = query.add_field("project")
259-
project_field.set_filter("name", project_name_var)
260-
261-
folders_field = project_field.add_field_with_edges("folders")
262-
folders_field.add_field("path")
263-
folders_field.set_filter("paths", folder_paths_var)
264-
265-
tasks_field = folders_field.add_field_with_edges("tasks")
266-
# WARNING: At the moment when this been created 'names' filter
267-
# is not supported
268-
tasks_field.set_filter("names", task_names_var)
269-
tasks_field.set_filter("taskTypes", task_types_var)
270-
tasks_field.set_filter("assigneesAny", assignees_any_var)
271-
tasks_field.set_filter("assignees", assignees_all_var)
272-
tasks_field.set_filter("statuses", statuses_var)
273-
tasks_field.set_filter("tags", tags_var)
274-
tasks_field.set_filter("filter", filter_var)
275-
276-
nested_fields = fields_to_dict(fields)
277-
278-
add_links_fields(tasks_field, nested_fields)
279-
280-
query_queue = collections.deque()
281-
for key, value in nested_fields.items():
282-
query_queue.append((key, value, tasks_field))
283-
284-
while query_queue:
285-
item = query_queue.popleft()
286-
key, value, parent = item
287-
field = parent.add_field(key)
288-
if value is FIELD_VALUE:
289-
continue
290-
291-
for k, v in value.items():
292-
query_queue.append((k, v, field))
293-
return query
294-
295-
296246
def products_graphql_query(fields: set[str]) -> GraphQlQuery:
297247
query = GraphQlQuery("ProductsQuery")
298248

0 commit comments

Comments
 (0)