Skip to content

Commit 010987b

Browse files
committed
perf: introduce complete_promised_list_item_value
Replicates graphql/graphql-js@6acf33f
1 parent ceafd3b commit 010987b

File tree

1 file changed

+50
-20
lines changed

1 file changed

+50
-20
lines changed

src/graphql/execution/execute.py

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -927,13 +927,12 @@ async def complete_async_iterator_value(
927927
recursively until all the results are completed.
928928
"""
929929
is_awaitable = self.is_awaitable
930-
complete_awaitable_value = self.complete_awaitable_value
931930
complete_list_item_value = self.complete_list_item_value
931+
complete_awaitable_list_item_value = self.complete_awaitable_list_item_value
932932
graphql_wrapped_result: GraphQLWrappedResult[list[Any]] = ([], [])
933933
completed_results, incomplete_results = graphql_wrapped_result
934934
append_completed = completed_results.append
935935
append_incomplete = incomplete_results.append
936-
extend_incomplete = incomplete_results.extend
937936
awaitable_indices: list[int] = []
938937
append_awaitable = awaitable_indices.append
939938
stream_usage = self.get_stream_usage(field_group, path)
@@ -978,21 +977,18 @@ async def complete_async_iterator_value(
978977
) from raw_error
979978

980979
if is_awaitable(item):
981-
982-
async def resolve_item(item: Any, item_path: Path) -> Any:
983-
resolved = await complete_awaitable_value(
980+
append_completed(
981+
complete_awaitable_list_item_value(
982+
item,
983+
graphql_wrapped_result,
984984
item_type,
985985
field_group,
986986
info,
987987
item_path,
988-
item,
989988
incremental_context,
990989
defer_map,
991990
)
992-
extend_incomplete(resolved[1]) # pragma: no cover
993-
return resolved[0] # pragma: no cover
994-
995-
append_completed(resolve_item(item, item_path))
991+
)
996992
append_awaitable(index)
997993

998994
elif complete_list_item_value(
@@ -1065,13 +1061,12 @@ def complete_list_value(
10651061
# the list contains no coroutine objects by avoiding creating another coroutine
10661062
# object.
10671063
is_awaitable = self.is_awaitable
1068-
complete_awaitable_value = self.complete_awaitable_value
10691064
complete_list_item_value = self.complete_list_item_value
1065+
complete_awaitable_list_item_value = self.complete_awaitable_list_item_value
10701066
graphql_wrapped_result: GraphQLWrappedResult[list[Any]] = ([], [])
10711067
completed_results, incomplete_results = graphql_wrapped_result
10721068
append_completed = completed_results.append
10731069
append_incomplete = incomplete_results.append
1074-
extend_incomplete = incomplete_results.extend
10751070
awaitable_indices: list[int] = []
10761071
append_awaitable = awaitable_indices.append
10771072
stream_usage = self.get_stream_usage(field_group, path)
@@ -1102,21 +1097,18 @@ def complete_list_value(
11021097
item_path = path.add_key(index, None)
11031098

11041099
if is_awaitable(item):
1105-
1106-
async def resolve_item(item: Any, item_path: Path) -> Any:
1107-
resolved = await complete_awaitable_value(
1100+
append_completed(
1101+
complete_awaitable_list_item_value(
1102+
item,
1103+
graphql_wrapped_result,
11081104
item_type,
11091105
field_group,
11101106
info,
11111107
item_path,
1112-
item,
11131108
incremental_context,
11141109
defer_map,
11151110
)
1116-
extend_incomplete(resolved[1])
1117-
return resolved[0]
1118-
1119-
append_completed(resolve_item(item, item_path))
1111+
)
11201112
append_awaitable(index)
11211113

11221114
elif complete_list_item_value(
@@ -1220,6 +1212,44 @@ async def await_completed() -> Any:
12201212

12211213
return False
12221214

1215+
async def complete_awaitable_list_item_value(
1216+
self,
1217+
item: Any,
1218+
parent: GraphQLWrappedResult[list[Any]],
1219+
item_type: GraphQLOutputType,
1220+
field_group: FieldGroup,
1221+
info: GraphQLResolveInfo,
1222+
item_path: Path,
1223+
incremental_context: IncrementalContext | None,
1224+
defer_map: RefMap[DeferUsage, DeferredFragmentRecord] | None,
1225+
) -> Any:
1226+
"""Complete an awaitable list item value."""
1227+
try:
1228+
resolved = await item
1229+
completed = self.complete_value(
1230+
item_type,
1231+
field_group,
1232+
info,
1233+
item_path,
1234+
resolved,
1235+
incremental_context,
1236+
defer_map,
1237+
)
1238+
if self.is_awaitable(completed):
1239+
completed = await completed # type: ignore
1240+
parent[1].extend(completed[1]) # type: ignore
1241+
return completed[0] # type: ignore
1242+
except Exception as raw_error:
1243+
errors = (incremental_context or self).errors
1244+
self.handle_field_error(
1245+
raw_error,
1246+
item_type,
1247+
field_group,
1248+
item_path,
1249+
errors,
1250+
)
1251+
return None
1252+
12231253
@staticmethod
12241254
def complete_leaf_value(return_type: GraphQLLeafType, result: Any) -> Any:
12251255
"""Complete a leaf value.

0 commit comments

Comments
 (0)