Skip to content

Commit

Permalink
Simplify collectFields for @defer & @stream
Browse files Browse the repository at this point in the history
  • Loading branch information
robrichard committed Nov 8, 2023
1 parent 2e29180 commit 355ca68
Show file tree
Hide file tree
Showing 6 changed files with 334 additions and 469 deletions.
27 changes: 17 additions & 10 deletions src/execution/IncrementalPublisher.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { invariant } from '../jsutils/invariant.js';
import type { ObjMap } from '../jsutils/ObjMap.js';
import type { Path } from '../jsutils/Path.js';
import { pathToArray } from '../jsutils/Path.js';
Expand All @@ -8,7 +9,7 @@ import type {
GraphQLFormattedError,
} from '../error/GraphQLError.js';

import type { GroupedFieldSet } from './collectFields.js';
import type { DeferUsage, GroupedFieldSet } from './collectFields.js';

interface IncrementalUpdate<TData = unknown, TExtensions = ObjMap<unknown>> {
pending: ReadonlyArray<PendingResult>;
Expand Down Expand Up @@ -609,16 +610,23 @@ export class IncrementalPublisher {
deferredGroupedFieldSetRecord: DeferredGroupedFieldSetRecord,
): IncrementalDeferResult {
const { data, deferredFragmentRecords } = deferredGroupedFieldSetRecord;
let maxLength = deferredFragmentRecords[0].path.length;
let maxIndex = 0;
for (let i = 1; i < deferredFragmentRecords.length; i++) {
let maxLength;
let maxIndex;
for (let i = 0; i < deferredFragmentRecords.length; i++) {
const deferredFragmentRecord = deferredFragmentRecords[i];
if (deferredFragmentRecord.id == null) {
continue;
}
const length = deferredFragmentRecord.path.length;
if (length > maxLength) {
if (typeof maxLength !== 'number' || length > maxLength) {
maxLength = length;
maxIndex = i;
}
}
invariant(
typeof maxIndex === 'number',
'No id for deferred incremental result',
);
const recordWithLongestPath = deferredFragmentRecords[maxIndex];
const longestPath = recordWithLongestPath.path;
const subPath = deferredGroupedFieldSetRecord.path.slice(
Expand Down Expand Up @@ -763,7 +771,6 @@ export class DeferredGroupedFieldSetRecord {
path: ReadonlyArray<string | number>;
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
groupedFieldSet: GroupedFieldSet;
shouldInitiateDefer: boolean;
errors: Array<GraphQLError>;
data: ObjMap<unknown> | undefined;
sent: boolean;
Expand All @@ -772,12 +779,10 @@ export class DeferredGroupedFieldSetRecord {
path: Path | undefined;
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
groupedFieldSet: GroupedFieldSet;
shouldInitiateDefer: boolean;
}) {
this.path = pathToArray(opts.path);
this.deferredFragmentRecords = opts.deferredFragmentRecords;
this.groupedFieldSet = opts.groupedFieldSet;
this.shouldInitiateDefer = opts.shouldInitiateDefer;
this.errors = [];
this.sent = false;
}
Expand All @@ -786,6 +791,7 @@ export class DeferredGroupedFieldSetRecord {
/** @internal */
export class DeferredFragmentRecord {
path: ReadonlyArray<string | number>;
deferUsage: DeferUsage;
label: string | undefined;
id: string | undefined;
children: Set<SubsequentResultRecord>;
Expand All @@ -795,9 +801,10 @@ export class DeferredFragmentRecord {
pendingSent?: boolean;
_pending: Set<DeferredGroupedFieldSetRecord>;

constructor(opts: { path: Path | undefined; label: string | undefined }) {
constructor(opts: { path: Path | undefined; deferUsage: DeferUsage }) {
this.path = pathToArray(opts.path);
this.label = opts.label;
this.label = opts.deferUsage.label;
this.deferUsage = opts.deferUsage;
this.children = new Set();
this.filtered = false;
this.deferredGroupedFieldSetRecords = new Set();
Expand Down
Loading

0 comments on commit 355ca68

Please sign in to comment.