Skip to content

Commit 6d777e6

Browse files
yaacovCRrobrichard
andauthored
perf: allow skipping of field plan generation (#4050)
in the non-deferred case. depends on #4026 --------- Co-authored-by: Rob Richard <[email protected]>
1 parent 05e7a29 commit 6d777e6

File tree

4 files changed

+267
-212
lines changed

4 files changed

+267
-212
lines changed

src/execution/buildFieldPlan.ts

Lines changed: 20 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +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;
12+
export interface FieldPlan {
13+
groupedFieldSet: GroupedFieldSet;
14+
newGroupedFieldSets: Map<DeferUsageSet, GroupedFieldSet>;
1115
}
1216

13-
export type GroupedFieldSet = Map<string, FieldGroup>;
14-
1517
export function buildFieldPlan(
16-
fields: Map<string, ReadonlyArray<FieldDetails>>,
18+
originalGroupedFieldSet: GroupedFieldSet,
1719
parentDeferUsages: DeferUsageSet = new Set<DeferUsage>(),
18-
): {
19-
groupedFieldSet: GroupedFieldSet;
20-
newGroupedFieldSets: Map<DeferUsageSet, GroupedFieldSet>;
21-
} {
22-
const groupedFieldSet = new Map<
23-
string,
24-
{
25-
fields: Array<FieldDetails>;
26-
deferUsages: DeferUsageSet;
27-
}
28-
>();
20+
): FieldPlan {
21+
const groupedFieldSet = new Map<string, FieldGroup>();
2922

30-
const newGroupedFieldSets = new Map<
31-
DeferUsageSet,
32-
Map<
33-
string,
34-
{
35-
fields: Array<FieldDetails>;
36-
deferUsages: DeferUsageSet;
37-
}
38-
>
39-
>();
23+
const newGroupedFieldSets = new Map<DeferUsageSet, Map<string, FieldGroup>>();
4024

4125
const map = new Map<
4226
string,
4327
{
4428
deferUsageSet: DeferUsageSet;
45-
fieldDetailsList: ReadonlyArray<FieldDetails>;
29+
fieldGroup: FieldGroup;
4630
}
4731
>();
4832

49-
for (const [responseKey, fieldDetailsList] of fields) {
33+
for (const [responseKey, fieldGroup] of originalGroupedFieldSet) {
5034
const deferUsageSet = new Set<DeferUsage>();
5135
let inOriginalResult = false;
52-
for (const fieldDetails of fieldDetailsList) {
36+
for (const fieldDetails of fieldGroup) {
5337
const deferUsage = fieldDetails.deferUsage;
5438
if (deferUsage === undefined) {
5539
inOriginalResult = true;
@@ -69,44 +53,21 @@ export function buildFieldPlan(
6953
}
7054
});
7155
}
72-
map.set(responseKey, { deferUsageSet, fieldDetailsList });
56+
map.set(responseKey, { deferUsageSet, fieldGroup });
7357
}
7458

75-
for (const [responseKey, { deferUsageSet, fieldDetailsList }] of map) {
59+
for (const [responseKey, { deferUsageSet, fieldGroup }] of map) {
7660
if (isSameSet(deferUsageSet, parentDeferUsages)) {
77-
let fieldGroup = groupedFieldSet.get(responseKey);
78-
if (fieldGroup === undefined) {
79-
fieldGroup = {
80-
fields: [],
81-
deferUsages: deferUsageSet,
82-
};
83-
groupedFieldSet.set(responseKey, fieldGroup);
84-
}
85-
fieldGroup.fields.push(...fieldDetailsList);
61+
groupedFieldSet.set(responseKey, fieldGroup);
8662
continue;
8763
}
8864

8965
let newGroupedFieldSet = getBySet(newGroupedFieldSets, deferUsageSet);
9066
if (newGroupedFieldSet === undefined) {
91-
newGroupedFieldSet = new Map<
92-
string,
93-
{
94-
fields: Array<FieldDetails>;
95-
deferUsages: DeferUsageSet;
96-
knownDeferUsages: DeferUsageSet;
97-
}
98-
>();
67+
newGroupedFieldSet = new Map();
9968
newGroupedFieldSets.set(deferUsageSet, newGroupedFieldSet);
10069
}
101-
let fieldGroup = newGroupedFieldSet.get(responseKey);
102-
if (fieldGroup === undefined) {
103-
fieldGroup = {
104-
fields: [],
105-
deferUsages: deferUsageSet,
106-
};
107-
newGroupedFieldSet.set(responseKey, fieldGroup);
108-
}
109-
fieldGroup.fields.push(...fieldDetailsList);
70+
newGroupedFieldSet.set(responseKey, fieldGroup);
11071
}
11172

11273
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)