Skip to content

Commit 7f05ab8

Browse files
committed
perf: allow skipping of field plan generation
for the non-deferred case.
1 parent e6d758e commit 7f05ab8

File tree

4 files changed

+191
-155
lines changed

4 files changed

+191
-155
lines changed

src/execution/buildFieldPlan.ts

Lines changed: 19 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,39 @@
11
import { getBySet } from '../jsutils/getBySet.js';
22
import { isSameSet } from '../jsutils/isSameSet.js';
33

4-
import type { DeferUsage, FieldDetails } from './collectFields.js';
4+
import type {
5+
DeferUsage,
6+
FieldGroup,
7+
GroupedFieldSet,
8+
} from './collectFields.js';
59

610
export type DeferUsageSet = ReadonlySet<DeferUsage>;
711

8-
export interface FieldGroup {
9-
fields: ReadonlyArray<FieldDetails>;
10-
deferUsages?: DeferUsageSet | undefined;
11-
}
12-
13-
export type GroupedFieldSet = Map<string, FieldGroup>;
14-
15-
export interface NewGroupedFieldSetDetails {
12+
export interface FieldPlan {
1613
groupedFieldSet: GroupedFieldSet;
17-
shouldInitiateDefer: boolean;
14+
newGroupedFieldSets: Map<DeferUsageSet, GroupedFieldSet>;
1815
}
1916

2017
export function buildFieldPlan(
21-
fields: Map<string, ReadonlyArray<FieldDetails>>,
18+
originalGroupedFieldSet: GroupedFieldSet,
2219
parentDeferUsages: DeferUsageSet = new Set<DeferUsage>(),
23-
): {
24-
groupedFieldSet: GroupedFieldSet;
25-
newGroupedFieldSets: Map<DeferUsageSet, GroupedFieldSet>;
26-
} {
27-
const groupedFieldSet = new Map<
28-
string,
29-
{
30-
fields: Array<FieldDetails>;
31-
deferUsages: DeferUsageSet;
32-
}
33-
>();
20+
): FieldPlan {
21+
const groupedFieldSet = new Map<string, FieldGroup>();
3422

35-
const newGroupedFieldSets = new Map<
36-
DeferUsageSet,
37-
Map<
38-
string,
39-
{
40-
fields: Array<FieldDetails>;
41-
deferUsages: DeferUsageSet;
42-
}
43-
>
44-
>();
23+
const newGroupedFieldSets = new Map<DeferUsageSet, Map<string, FieldGroup>>();
4524

4625
const map = new Map<
4726
string,
4827
{
4928
deferUsageSet: DeferUsageSet;
50-
fieldDetailsList: ReadonlyArray<FieldDetails>;
29+
fieldGroup: FieldGroup;
5130
}
5231
>();
5332

54-
for (const [responseKey, fieldDetailsList] of fields) {
33+
for (const [responseKey, fieldGroup] of originalGroupedFieldSet) {
5534
const deferUsageSet = new Set<DeferUsage>();
5635
let inOriginalResult = false;
57-
for (const fieldDetails of fieldDetailsList) {
36+
for (const fieldDetails of fieldGroup) {
5837
const deferUsage = fieldDetails.deferUsage;
5938
if (deferUsage === undefined) {
6039
inOriginalResult = true;
@@ -74,44 +53,21 @@ export function buildFieldPlan(
7453
}
7554
});
7655
}
77-
map.set(responseKey, { deferUsageSet, fieldDetailsList });
56+
map.set(responseKey, { deferUsageSet, fieldGroup });
7857
}
7958

80-
for (const [responseKey, { deferUsageSet, fieldDetailsList }] of map) {
59+
for (const [responseKey, { deferUsageSet, fieldGroup }] of map) {
8160
if (isSameSet(deferUsageSet, parentDeferUsages)) {
82-
let fieldGroup = groupedFieldSet.get(responseKey);
83-
if (fieldGroup === undefined) {
84-
fieldGroup = {
85-
fields: [],
86-
deferUsages: deferUsageSet,
87-
};
88-
groupedFieldSet.set(responseKey, fieldGroup);
89-
}
90-
fieldGroup.fields.push(...fieldDetailsList);
61+
groupedFieldSet.set(responseKey, fieldGroup);
9162
continue;
9263
}
9364

9465
let newGroupedFieldSet = getBySet(newGroupedFieldSets, deferUsageSet);
9566
if (newGroupedFieldSet === undefined) {
96-
newGroupedFieldSet = new Map<
97-
string,
98-
{
99-
fields: Array<FieldDetails>;
100-
deferUsages: DeferUsageSet;
101-
knownDeferUsages: DeferUsageSet;
102-
}
103-
>();
67+
newGroupedFieldSet = new Map();
10468
newGroupedFieldSets.set(deferUsageSet, newGroupedFieldSet);
10569
}
106-
let fieldGroup = newGroupedFieldSet.get(responseKey);
107-
if (fieldGroup === undefined) {
108-
fieldGroup = {
109-
fields: [],
110-
deferUsages: deferUsageSet,
111-
};
112-
newGroupedFieldSet.set(responseKey, fieldGroup);
113-
}
114-
fieldGroup.fields.push(...fieldDetailsList);
70+
newGroupedFieldSet.set(responseKey, fieldGroup);
11571
}
11672

11773
return {

src/execution/collectFields.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ export interface FieldDetails {
3636
deferUsage: DeferUsage | undefined;
3737
}
3838

39+
export type FieldGroup = ReadonlyArray<FieldDetails>;
40+
41+
export type GroupedFieldSet = ReadonlyMap<string, FieldGroup>;
42+
3943
interface CollectFieldsContext {
4044
schema: GraphQLSchema;
4145
fragments: ObjMap<FragmentDefinitionNode>;
@@ -61,7 +65,7 @@ export function collectFields(
6165
runtimeType: GraphQLObjectType,
6266
operation: OperationDefinitionNode,
6367
): {
64-
fields: Map<string, ReadonlyArray<FieldDetails>>;
68+
groupedFieldSet: GroupedFieldSet;
6569
newDeferUsages: ReadonlyArray<DeferUsage>;
6670
} {
6771
const groupedFieldSet = new AccumulatorMap<string, FieldDetails>();
@@ -81,7 +85,7 @@ export function collectFields(
8185
groupedFieldSet,
8286
newDeferUsages,
8387
);
84-
return { fields: groupedFieldSet, newDeferUsages };
88+
return { groupedFieldSet, newDeferUsages };
8589
}
8690

8791
/**
@@ -101,9 +105,9 @@ export function collectSubfields(
101105
variableValues: { [variable: string]: unknown },
102106
operation: OperationDefinitionNode,
103107
returnType: GraphQLObjectType,
104-
fieldDetails: ReadonlyArray<FieldDetails>,
108+
fieldGroup: FieldGroup,
105109
): {
106-
fields: Map<string, ReadonlyArray<FieldDetails>>;
110+
groupedFieldSet: GroupedFieldSet;
107111
newDeferUsages: ReadonlyArray<DeferUsage>;
108112
} {
109113
const context: CollectFieldsContext = {
@@ -117,7 +121,7 @@ export function collectSubfields(
117121
const subGroupedFieldSet = new AccumulatorMap<string, FieldDetails>();
118122
const newDeferUsages: Array<DeferUsage> = [];
119123

120-
for (const fieldDetail of fieldDetails) {
124+
for (const fieldDetail of fieldGroup) {
121125
const node = fieldDetail.node;
122126
if (node.selectionSet) {
123127
collectFieldsImpl(
@@ -131,7 +135,7 @@ export function collectSubfields(
131135
}
132136

133137
return {
134-
fields: subGroupedFieldSet,
138+
groupedFieldSet: subGroupedFieldSet,
135139
newDeferUsages,
136140
};
137141
}

0 commit comments

Comments
 (0)