Custom GraphQlQuery using set_limit on nested edge field can result in the limit turning negative when querying
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 16
- フォーク
- 15
- 平均マージ
- 1日 9時間
- マージ済み PR(30日)
- 10
説明
Is there an existing issue for this?
- I have searched the existing issues and added correct labels.
Description
Current Behavior
When creating a custom GraphQlQuery object, if you use set_limit on a nested edge field (e.g products in folders), the edge field limit can turn negative unexpectedly if you query some amount of entities from the parent edge field and will raise this error.
File "C:\Users\user\AppData\Local\Ynput\AYON\app\AYON 1.6.3\dependencies\ayon_api\graphql.py", line 376, in query
raise GraphQlQueryFailed(response.errors, query_str, variables)
ayon_api.exceptions.GraphQlQueryFailed: GraphQl query Failed: LIMIT must not be negative on item 'project/folders/edges/0/node/products' (Line 7 Column 11)
Expected Behavior
The limit should be calculated correctly when querying the server and match the one given.
Steps To Reproduce:
Here is a script you can use in the AYON Launcher's Console or with ayon_api with the right env vars set up. This assumes you have a project already containing a certain amount folders and products, this example uses folder and products but you can apply it to any parent/child edge field case.
Exact conditions in which the error occur seem to depend on the contents of the project, however running the script as is should trigger it, as it queries all folders from the project and sets a limit to queried products. Setting a high limit for the parent field and a lower one for the child field should also trigger it. You can mess with the folder_limit and product_limit arguments to see different results.
from ayon_api.graphql import GraphQlQuery
from ayon_api import get_server_api_connection, get_folders
from pprint import pprint
project_name = "projectname"
def simple_graphql_query(
project_name,
folder_limit=None,
product_limit=None,
):
"""Creates a simple GraphQL query to get products from
a list of folder ids.
"""
simple_query = GraphQlQuery("SimpleQuery")
# Project field
project_field = simple_query.add_field("project")
project_field.set_filter("name", project_name)
# Folders field
folders_field = project_field.add_field_with_edges("folders")
if folder_limit:
folders_field.set_limit(folder_limit)
folders_field.add_field("name")
# Products field
products_field = folders_field.add_field_with_edges("products")
if product_limit:
products_field.set_limit(product_limit)
products_field.add_field("name")
return simple_query
my_query = simple_graphql_query(
project_name=project_name,
folder_limit=None, # parent edge field
product_limit=5 # nested child edge field
)
con = get_server_api_connection()
my_query_data = my_query.query(con)
pprint(my_query_data)
The conditions in which the problem manifest depend also on the ayon_api version coming with the launcher :
- 1.2.4 (1.4.2 launcher) : If the number of parent edge field entities queried is strictly superior to 300 then
ayon_api.exceptions.GraphQlQueryFailedwill be raised. - 1.2.22 (1.6.3 launcher) and 1.2.23 : condition seem to vary much more but a parent edge field amount higher than that of the nested child edge seem to trigger it.
Additional context:
Version
Server : 1.15.17
Launcher : 1.4.2 and 1.6.3
ayon-python-api : 1.2.4, 1.2.22 and 1.2.23
Platforms
Windows, Mac
Relevant log output:
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
ayon_api/graphql.py から開始し、特に 376 行目の失敗するクエリ呼び出し周辺にあるクエリ構築パスを確認します。入れ子になったフォルダー/製品の提供された再現手順を、folder_limit と product_limit に異なる値を設定して実行し、生成される limit が決して負にならないこと、またサーバーが GraphQlQueryFailed なしで要求された子要素の limit を受け取ることを確認します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- graphql, python
- 領域
- api
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 活発
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 68/100