Skip to content

Commit ab96306

Browse files
authored
Merge selected fields in ResolveInfo::getFieldSelection()
1 parent 5616508 commit ab96306

File tree

2 files changed

+82
-3
lines changed

2 files changed

+82
-3
lines changed

src/Type/Definition/ResolveInfo.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,10 @@ private function foldSelectionSet(SelectionSetNode $selectionSet, int $descend):
227227
foreach ($selectionSet->selections as $selectionNode) {
228228
if ($selectionNode instanceof FieldNode) {
229229
$fields[$selectionNode->name->value] = $descend > 0 && $selectionNode->selectionSet !== null
230-
? $this->foldSelectionSet($selectionNode->selectionSet, $descend - 1)
230+
? \array_merge_recursive(
231+
$fields[$selectionNode->name->value] ?? [],
232+
$this->foldSelectionSet($selectionNode->selectionSet, $descend - 1)
233+
)
231234
: true;
232235
} elseif ($selectionNode instanceof FragmentSpreadNode) {
233236
$spreadName = $selectionNode->name->value;

tests/Type/ResolveInfoTest.php

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,14 +276,14 @@ public function testMergedFragmentsFieldSelection(): void
276276
fragment MyImage on Image {
277277
url
278278
}
279-
279+
280280
fragment Replies01 on Article {
281281
_replies012: replies {
282282
body
283283
}
284284
}
285285
fragment Replies02 on Article {
286-
_replies012: replies {
286+
_replies012: replies {
287287
author {
288288
id
289289
name
@@ -369,4 +369,80 @@ public function testMergedFragmentsFieldSelection(): void
369369
self::assertEquals(['data' => ['article' => null]], $result);
370370
self::assertEquals($expectedDeepSelection, $actualDeepSelection);
371371
}
372+
373+
public function testDeepFieldSelectionOnDuplicatedFields(): void
374+
{
375+
$level2 = new ObjectType([
376+
'name' => 'level2',
377+
'fields' => [
378+
'scalar1' => ['type' => Type::int()],
379+
'scalar2' => ['type' => Type::int()],
380+
],
381+
]);
382+
$level1 = new ObjectType([
383+
'name' => 'level1',
384+
'fields' => [
385+
'scalar1' => ['type' => Type::int()],
386+
'scalar2' => ['type' => Type::int()],
387+
'level2' => $level2,
388+
],
389+
]);
390+
391+
$hasCalled = false;
392+
$actualDeepSelection = null;
393+
394+
$query = new ObjectType([
395+
'name' => 'Query',
396+
'fields' => [
397+
'level1' => [
398+
'type' => $level1,
399+
'resolve' => static function (
400+
$value,
401+
array $args,
402+
$context,
403+
ResolveInfo $info
404+
) use (
405+
&$hasCalled,
406+
&$actualDeepSelection
407+
) {
408+
$hasCalled = true;
409+
$actualDeepSelection = $info->getFieldSelection(2);
410+
411+
return null;
412+
},
413+
],
414+
],
415+
]);
416+
417+
$doc = '
418+
query deepMerge {
419+
level1 {
420+
level2 {
421+
scalar1
422+
}
423+
level2 {
424+
scalar2
425+
}
426+
scalar1
427+
scalar2
428+
}
429+
}
430+
';
431+
432+
$expectedDeepSelection = [
433+
'level2' => [
434+
'scalar1' => true,
435+
'scalar2' => true,
436+
],
437+
'scalar1' => true,
438+
'scalar2' => true,
439+
];
440+
441+
$schema = new Schema(['query' => $query]);
442+
$result = GraphQL::executeQuery($schema, $doc)->toArray();
443+
444+
self::assertTrue($hasCalled);
445+
self::assertEquals(['data' => ['level1' => null]], $result);
446+
self::assertEquals($expectedDeepSelection, $actualDeepSelection);
447+
}
372448
}

0 commit comments

Comments
 (0)