Skip to content

Commit 026044f

Browse files
committed
collapsed nested defers due to empty parents should be published last
also reduces code duplication
1 parent c350599 commit 026044f

File tree

2 files changed

+40
-49
lines changed

2 files changed

+40
-49
lines changed

src/execution/IncrementalPublisher.ts

Lines changed: 37 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -301,16 +301,7 @@ export class IncrementalPublisher {
301301
initialResultRecord: InitialResultRecord,
302302
data: ObjMap<unknown> | null,
303303
): ExecutionResult | ExperimentalIncrementalExecutionResults {
304-
const pendingSources = new Set<DeferredFragmentRecord | StreamRecord>();
305-
for (const child of initialResultRecord.children) {
306-
if (child.filtered) {
307-
continue;
308-
}
309-
const maybePendingSources = this._publish(child);
310-
for (const maybePendingSource of maybePendingSources) {
311-
pendingSources.add(maybePendingSource);
312-
}
313-
}
304+
const pendingSources = this._publish(initialResultRecord.children);
314305

315306
const errors = initialResultRecord.errors;
316307
const initialResult = errors.length === 0 ? { data } : { errors, data };
@@ -533,15 +524,7 @@ export class IncrementalPublisher {
533524
const incrementalResults: Array<IncrementalResult> = [];
534525
const completedResults: Array<CompletedResult> = [];
535526
for (const subsequentResultRecord of completedRecords) {
536-
for (const child of subsequentResultRecord.children) {
537-
if (child.filtered) {
538-
continue;
539-
}
540-
const maybePendingSources = this._publish(child);
541-
for (const maybePendingSource of maybePendingSources) {
542-
newPendingSources.add(maybePendingSource);
543-
}
544-
}
527+
this._publish(subsequentResultRecord.children, newPendingSources);
545528
if (isStreamItemsRecord(subsequentResultRecord)) {
546529
if (subsequentResultRecord.isFinalRecord) {
547530
newPendingSources.delete(subsequentResultRecord.streamRecord);
@@ -648,42 +631,50 @@ export class IncrementalPublisher {
648631
}
649632

650633
private _publish(
651-
subsequentResultRecord: SubsequentResultRecord,
652-
): ReadonlyArray<DeferredFragmentRecord | StreamRecord> {
653-
if (isStreamItemsRecord(subsequentResultRecord)) {
654-
if (subsequentResultRecord.isCompleted) {
655-
this._push(subsequentResultRecord);
656-
} else {
657-
this._introduce(subsequentResultRecord);
634+
subsequentResultRecords: ReadonlySet<SubsequentResultRecord>,
635+
pendingSources = new Set<DeferredFragmentRecord | StreamRecord>(),
636+
): Set<DeferredFragmentRecord | StreamRecord> {
637+
const emptyRecords: Array<SubsequentResultRecord> = [];
638+
639+
for (const subsequentResultRecord of subsequentResultRecords) {
640+
if (subsequentResultRecord.filtered) {
641+
continue;
658642
}
643+
if (isStreamItemsRecord(subsequentResultRecord)) {
644+
if (subsequentResultRecord.isCompleted) {
645+
this._push(subsequentResultRecord);
646+
} else {
647+
this._introduce(subsequentResultRecord);
648+
}
659649

660-
const stream = subsequentResultRecord.streamRecord;
661-
if (!stream.pendingSent) {
662-
return [stream];
650+
const stream = subsequentResultRecord.streamRecord;
651+
if (!stream.pendingSent) {
652+
pendingSources.add(stream);
653+
}
654+
continue;
663655
}
664-
return [];
665-
}
666656

667-
if (subsequentResultRecord._pending.size > 0) {
668-
this._introduce(subsequentResultRecord);
669-
} else if (
670-
subsequentResultRecord.deferredGroupedFieldSetRecords.size === 0
671-
) {
672-
const newPendingSources = [];
673-
for (const child of subsequentResultRecord.children) {
674-
const maybeNewPendingSources = this._publish(child);
675-
newPendingSources.push(...maybeNewPendingSources);
657+
if (subsequentResultRecord._pending.size > 0) {
658+
this._introduce(subsequentResultRecord);
659+
} else if (
660+
subsequentResultRecord.deferredGroupedFieldSetRecords.size === 0
661+
) {
662+
emptyRecords.push(subsequentResultRecord);
663+
continue;
664+
} else {
665+
this._push(subsequentResultRecord);
666+
}
667+
668+
if (!subsequentResultRecord.pendingSent) {
669+
pendingSources.add(subsequentResultRecord);
676670
}
677-
return newPendingSources;
678-
} else {
679-
this._push(subsequentResultRecord);
680671
}
681672

682-
if (!subsequentResultRecord.pendingSent) {
683-
return [subsequentResultRecord];
673+
for (const emptyRecord of emptyRecords) {
674+
this._publish(emptyRecord.children, pendingSources);
684675
}
685676

686-
return [];
677+
return pendingSources;
687678
}
688679

689680
private _getChildren(

src/execution/__tests__/defer-test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,16 +1088,16 @@ describe('Execute: defer directive', () => {
10881088
data: {
10891089
foo: 'foo',
10901090
},
1091-
id: '1',
1091+
id: '0',
10921092
},
10931093
{
10941094
data: {
10951095
bar: 'bar',
10961096
},
1097-
id: '0',
1097+
id: '1',
10981098
},
10991099
],
1100-
completed: [{ id: '1' }, { id: '0' }],
1100+
completed: [{ id: '0' }, { id: '1' }],
11011101
hasNext: false,
11021102
},
11031103
]);

0 commit comments

Comments
 (0)