Skip to content

Commit 9596293

Browse files
committed
simplify FieldGroup
1 parent bf20902 commit 9596293

File tree

6 files changed

+92
-120
lines changed

6 files changed

+92
-120
lines changed

src/execution/IncrementalPublisher.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import type {
88
GraphQLFormattedError,
99
} from '../error/GraphQLError.js';
1010

11-
import type { GroupedFieldSet } from './buildFieldPlan.js';
11+
import type { DeferUsageSet } from './buildFieldPlan.js';
12+
import type { GroupedFieldSet } from './collectFields.js';
1213

1314
interface IncrementalUpdate<TData = unknown, TExtensions = ObjMap<unknown>> {
1415
pending: ReadonlyArray<PendingResult>;
@@ -739,7 +740,7 @@ export class IncrementalPublisher {
739740
}
740741
}
741742

742-
function isDeferredGroupedFieldSetRecord(
743+
export function isDeferredGroupedFieldSetRecord(
743744
incrementalDataRecord: unknown,
744745
): incrementalDataRecord is DeferredGroupedFieldSetRecord {
745746
return incrementalDataRecord instanceof DeferredGroupedFieldSetRecord;
@@ -764,6 +765,7 @@ export class InitialResultRecord {
764765
/** @internal */
765766
export class DeferredGroupedFieldSetRecord {
766767
path: ReadonlyArray<string | number>;
768+
deferUsageSet: DeferUsageSet;
767769
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
768770
groupedFieldSet: GroupedFieldSet;
769771
shouldInitiateDefer: boolean;
@@ -773,11 +775,13 @@ export class DeferredGroupedFieldSetRecord {
773775

774776
constructor(opts: {
775777
path: Path | undefined;
778+
deferUsageSet: DeferUsageSet;
776779
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
777780
groupedFieldSet: GroupedFieldSet;
778781
shouldInitiateDefer: boolean;
779782
}) {
780783
this.path = pathToArray(opts.path);
784+
this.deferUsageSet = opts.deferUsageSet;
781785
this.deferredFragmentRecords = opts.deferredFragmentRecords;
782786
this.groupedFieldSet = opts.groupedFieldSet;
783787
this.shouldInitiateDefer = opts.shouldInitiateDefer;

src/execution/buildFieldPlan.ts

+22-62
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,47 @@
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-
1512
export interface NewGroupedFieldSetDetails {
1613
groupedFieldSet: GroupedFieldSet;
1714
shouldInitiateDefer: boolean;
1815
}
1916

20-
export function buildFieldPlan(
21-
fields: Map<string, ReadonlyArray<FieldDetails>>,
22-
parentDeferUsages: DeferUsageSet = new Set<DeferUsage>(),
23-
): {
17+
export interface FieldPlan {
2418
groupedFieldSet: GroupedFieldSet;
2519
newGroupedFieldSetDetailsMap: Map<DeferUsageSet, NewGroupedFieldSetDetails>;
26-
} {
27-
const groupedFieldSet = new Map<
28-
string,
29-
{
30-
fields: Array<FieldDetails>;
31-
deferUsages: DeferUsageSet;
32-
}
33-
>();
20+
}
21+
22+
export function buildFieldPlan(
23+
originalGroupedFieldSet: GroupedFieldSet,
24+
parentDeferUsages: DeferUsageSet = new Set<DeferUsage>(),
25+
): FieldPlan {
26+
const groupedFieldSet: GroupedFieldSet = new Map();
3427

3528
const newGroupedFieldSetDetailsMap = new Map<
3629
DeferUsageSet,
37-
{
38-
groupedFieldSet: Map<
39-
string,
40-
{
41-
fields: Array<FieldDetails>;
42-
deferUsages: DeferUsageSet;
43-
}
44-
>;
45-
shouldInitiateDefer: boolean;
46-
}
30+
NewGroupedFieldSetDetails
4731
>();
4832

4933
const map = new Map<
5034
string,
5135
{
5236
deferUsageSet: DeferUsageSet;
53-
fieldDetailsList: ReadonlyArray<FieldDetails>;
37+
fieldGroup: FieldGroup;
5438
}
5539
>();
5640

57-
for (const [responseKey, fieldDetailsList] of fields) {
41+
for (const [responseKey, fieldGroup] of originalGroupedFieldSet) {
5842
const deferUsageSet = new Set<DeferUsage>();
5943
let inOriginalResult = false;
60-
for (const fieldDetails of fieldDetailsList) {
44+
for (const fieldDetails of fieldGroup) {
6145
const deferUsage = fieldDetails.deferUsage;
6246
if (deferUsage === undefined) {
6347
inOriginalResult = true;
@@ -77,20 +61,12 @@ export function buildFieldPlan(
7761
}
7862
});
7963
}
80-
map.set(responseKey, { deferUsageSet, fieldDetailsList });
64+
map.set(responseKey, { deferUsageSet, fieldGroup });
8165
}
8266

83-
for (const [responseKey, { deferUsageSet, fieldDetailsList }] of map) {
67+
for (const [responseKey, { deferUsageSet, fieldGroup }] of map) {
8468
if (isSameSet(deferUsageSet, parentDeferUsages)) {
85-
let fieldGroup = groupedFieldSet.get(responseKey);
86-
if (fieldGroup === undefined) {
87-
fieldGroup = {
88-
fields: [],
89-
deferUsages: deferUsageSet,
90-
};
91-
groupedFieldSet.set(responseKey, fieldGroup);
92-
}
93-
fieldGroup.fields.push(...fieldDetailsList);
69+
groupedFieldSet.set(responseKey, fieldGroup);
9470
continue;
9571
}
9672

@@ -100,15 +76,7 @@ export function buildFieldPlan(
10076
);
10177
let newGroupedFieldSet;
10278
if (newGroupedFieldSetDetails === undefined) {
103-
newGroupedFieldSet = new Map<
104-
string,
105-
{
106-
fields: Array<FieldDetails>;
107-
deferUsages: DeferUsageSet;
108-
knownDeferUsages: DeferUsageSet;
109-
}
110-
>();
111-
79+
newGroupedFieldSet = new Map();
11280
newGroupedFieldSetDetails = {
11381
groupedFieldSet: newGroupedFieldSet,
11482
shouldInitiateDefer: Array.from(deferUsageSet).some(
@@ -122,15 +90,7 @@ export function buildFieldPlan(
12290
} else {
12391
newGroupedFieldSet = newGroupedFieldSetDetails.groupedFieldSet;
12492
}
125-
let fieldGroup = newGroupedFieldSet.get(responseKey);
126-
if (fieldGroup === undefined) {
127-
fieldGroup = {
128-
fields: [],
129-
deferUsages: deferUsageSet,
130-
};
131-
newGroupedFieldSet.set(responseKey, fieldGroup);
132-
}
133-
fieldGroup.fields.push(...fieldDetailsList);
93+
newGroupedFieldSet.set(responseKey, fieldGroup);
13494
}
13595

13696
return {

src/execution/collectFields.ts

+10-6
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 = Map<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)