Skip to content

Commit 18eb809

Browse files
committed
incremental: optimize build field plan
Replicates graphql/graphql-js@25be244
1 parent a41a0de commit 18eb809

File tree

2 files changed

+31
-42
lines changed

2 files changed

+31
-42
lines changed

src/graphql/execution/build_field_plan.py

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,48 +34,47 @@ def build_field_plan(
3434
parent_defer_usages = RefSet()
3535

3636
grouped_field_set: GroupedFieldSet = {}
37-
3837
new_grouped_field_sets: RefMap[DeferUsageSet, GroupedFieldSet] = RefMap()
3938

40-
map_: dict[str, tuple[DeferUsageSet, FieldGroup]] = {}
41-
4239
for response_key, field_group in original_grouped_field_set.items():
43-
defer_usage_set: RefSet[DeferUsage] = RefSet()
44-
in_original_result = False
45-
for field_details in field_group:
46-
defer_usage = field_details.defer_usage
47-
if defer_usage is None:
48-
in_original_result = True
49-
continue
50-
defer_usage_set.add(defer_usage)
51-
if in_original_result:
52-
defer_usage_set.clear()
53-
else:
54-
defer_usage_set -= {
55-
defer_usage
56-
for defer_usage in defer_usage_set
57-
if any(
58-
ancestor in defer_usage_set for ancestor in defer_usage.ancestors
59-
)
60-
}
61-
map_[response_key] = (defer_usage_set, field_group)
62-
63-
for response_key, [defer_usage_set, field_group] in map_.items():
64-
if defer_usage_set == parent_defer_usages:
40+
filtered_defer_usage_set = get_filtered_defer_usage_set(field_group)
41+
42+
if filtered_defer_usage_set == parent_defer_usages:
6543
grouped_field_set[response_key] = field_group
6644
continue
6745

68-
for (
69-
new_grouped_field_set_defer_usage_set,
70-
new_grouped_field_set_field_group,
71-
) in new_grouped_field_sets.items(): # pragma: no branch
72-
if new_grouped_field_set_defer_usage_set == defer_usage_set:
73-
new_grouped_field_set = new_grouped_field_set_field_group
46+
for defer_usage_set in new_grouped_field_sets:
47+
if defer_usage_set == filtered_defer_usage_set:
48+
new_grouped_field_set = new_grouped_field_sets[defer_usage_set]
7449
break
7550
else:
7651
new_grouped_field_set = {}
77-
new_grouped_field_sets[defer_usage_set] = new_grouped_field_set
52+
new_grouped_field_sets[filtered_defer_usage_set] = new_grouped_field_set
7853

7954
new_grouped_field_set[response_key] = field_group
8055

8156
return FieldPlan(grouped_field_set, new_grouped_field_sets)
57+
58+
59+
def get_filtered_defer_usage_set(field_group: FieldGroup) -> RefSet[DeferUsage]:
60+
"""Get a filtered set of defer usages."""
61+
# Create the set of defer usages for the field group.
62+
filtered_defer_usage_set: RefSet[DeferUsage] = RefSet()
63+
for field_details in field_group:
64+
defer_usage = field_details.defer_usage
65+
if defer_usage is None:
66+
filtered_defer_usage_set.clear()
67+
return filtered_defer_usage_set
68+
filtered_defer_usage_set.add(defer_usage)
69+
70+
# Remove defer usages that have a parent defer usage in the set.
71+
# Since we remove in place, we need to iterate over a copy of the set.
72+
for defer_usage in tuple(filtered_defer_usage_set):
73+
parent_defer_usage: DeferUsage | None = defer_usage.parent_defer_usage
74+
while parent_defer_usage is not None:
75+
if parent_defer_usage in filtered_defer_usage_set:
76+
filtered_defer_usage_set.discard(defer_usage)
77+
break
78+
parent_defer_usage = parent_defer_usage.parent_defer_usage
79+
80+
return filtered_defer_usage_set

src/graphql/execution/collect_fields.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,6 @@ class DeferUsage(NamedTuple):
4343
label: str | None
4444
parent_defer_usage: DeferUsage | None
4545

46-
@property
47-
def ancestors(self) -> list[DeferUsage]:
48-
"""Get the ancestors of this defer usage."""
49-
ancestors: list[DeferUsage] = []
50-
parent_defer_usage = self.parent_defer_usage
51-
while parent_defer_usage is not None:
52-
ancestors.append(parent_defer_usage)
53-
parent_defer_usage = parent_defer_usage.parent_defer_usage
54-
return ancestors[::-1]
55-
5646

5747
class FieldDetails(NamedTuple):
5848
"""A field node and its defer usage."""

0 commit comments

Comments
 (0)