Skip to content

Commit 7716d11

Browse files
dexhunterCito
authored andcommitted
perf: reduce type checks when collecting schema types (#301)
1 parent 37cba1c commit 7716d11

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

‎src/graphql/type/schema.py‎

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323
GraphQLAbstractType,
2424
GraphQLCompositeType,
2525
GraphQLField,
26+
GraphQLInputObjectType,
2627
GraphQLInputType,
2728
GraphQLInterfaceType,
2829
GraphQLNamedType,
2930
GraphQLObjectType,
3031
GraphQLType,
31-
get_named_type,
32+
GraphQLUnionType,
33+
GraphQLWrappingType,
3234
is_input_object_type,
3335
is_interface_type,
3436
is_object_type,
@@ -739,26 +741,36 @@ def with_initial_types(cls, types: Collection[GraphQLType]) -> TypeSet:
739741

740742
def collect_referenced_types(self, type_: GraphQLType) -> None:
741743
"""Recursive function supplementing the type starting from an initial type."""
742-
named_type = get_named_type(type_)
744+
# Hot path when building schemas: unlike GraphQL.js, we avoid get_named_type()
745+
# and the is_*_type() helpers, because function calls are costly in Python.
746+
named_type: GraphQLType | None = None
747+
if type_:
748+
named_type = type_
749+
while isinstance(named_type, GraphQLWrappingType):
750+
named_type = named_type.of_type
743751

744752
if named_type in self:
745753
return
746754

755+
if TYPE_CHECKING:
756+
named_type = cast("GraphQLNamedType", named_type)
747757
self[named_type] = None
748758

749-
collect_referenced_types = self.collect_referenced_types
750-
if is_union_type(named_type):
759+
if isinstance(named_type, GraphQLUnionType):
760+
collect_referenced_types = self.collect_referenced_types
751761
for member_type in named_type.types:
752762
collect_referenced_types(member_type)
753-
elif is_object_type(named_type) or is_interface_type(named_type):
763+
elif isinstance(named_type, (GraphQLObjectType, GraphQLInterfaceType)):
764+
collect_referenced_types = self.collect_referenced_types
754765
for interface_type in named_type.interfaces:
755766
collect_referenced_types(interface_type)
756767

757768
for field in named_type.fields.values():
758769
collect_referenced_types(field.type)
759770
for arg in field.args.values():
760771
collect_referenced_types(arg.type)
761-
elif is_input_object_type(named_type):
772+
elif isinstance(named_type, GraphQLInputObjectType):
773+
collect_referenced_types = self.collect_referenced_types
762774
for field in named_type.fields.values():
763775
collect_referenced_types(field.type)
764776

0 commit comments

Comments
 (0)