Skip to content

Commit ea4d43f

Browse files
committed
Better approach for latest performance tweaks (#8)
1 parent 3b3da9e commit ea4d43f

File tree

1 file changed

+13
-16
lines changed

1 file changed

+13
-16
lines changed

src/Executor/Executor.php

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ private static function resolveField(ExecutionContext $exeContext, ObjectType $p
360360
{
361361
$fieldAST = $fieldASTs[0];
362362

363-
$uid = self::getFieldUid($fieldAST);
363+
$uid = self::getFieldUid($fieldAST, $parentType);
364364

365365
// Get memoized variables if they exist
366366
if (isset($exeContext->memoized['resolveField'][$uid])) {
@@ -383,7 +383,6 @@ private static function resolveField(ExecutionContext $exeContext, ObjectType $p
383383

384384
// Build hash of arguments from the field.arguments AST, using the
385385
// variables scope to fulfill any variable references.
386-
// TODO: find a way to memoize, in case this field is within a List type.
387386
$args = Values::getArgumentValues(
388387
$fieldDef->args,
389388
$fieldAST->arguments,
@@ -406,21 +405,19 @@ private static function resolveField(ExecutionContext $exeContext, ObjectType $p
406405

407406
// Memoizing results for same query field
408407
// (useful for lists when several values are resolved against the same field)
409-
if ($returnType instanceof ObjectType) {
410-
$memoized = $exeContext->memoized['resolveField'][$uid] = [
411-
'fieldDef' => $fieldDef,
412-
'args' => $args,
413-
'info' => $info,
414-
'results' => new \SplObjectStorage
415-
];
416-
}
408+
$exeContext->memoized['resolveField'][$uid] = $memoized = [
409+
'fieldDef' => $fieldDef,
410+
'args' => $args,
411+
'info' => $info,
412+
'results' => new \SplObjectStorage
413+
];
417414
}
418415

419416
// When source value is object it is possible to memoize certain subset of results
420417
$isObject = is_object($source);
421418

422419
if ($isObject && isset($memoized['results'][$source])) {
423-
$result = $exeContext->memoized['resolveField'][$uid]['results'][$source];
420+
$result = $memoized['results'][$source];
424421
} else {
425422
if (isset($fieldDef->resolveFn)) {
426423
$resolveFn = $fieldDef->resolveFn;
@@ -442,8 +439,8 @@ private static function resolveField(ExecutionContext $exeContext, ObjectType $p
442439
$result
443440
);
444441

445-
if ($isObject && isset($memoized['results'])) {
446-
$exeContext->memoized['resolveField'][$uid]['results'][$source] = $result;
442+
if ($isObject) {
443+
$memoized['results'][$source] = $result;
447444
}
448445
}
449446

@@ -592,7 +589,7 @@ private static function completeValue(ExecutionContext $exeContext, Type $return
592589
$visitedFragmentNames = new \ArrayObject();
593590
for ($i = 0; $i < count($fieldASTs); $i++) {
594591
// Get memoized value if it exists
595-
$uid = self::getFieldUid($fieldASTs[$i]);
592+
$uid = self::getFieldUid($fieldASTs[$i], $runtimeType);
596593
if (isset($exeContext->memoized['collectSubFields'][$uid][$runtimeType->name])) {
597594
$subFieldASTs = $exeContext->memoized['collectSubFields'][$uid][$runtimeType->name];
598595
}
@@ -674,8 +671,8 @@ private static function getFieldDef(Schema $schema, ObjectType $parentType, $fie
674671
* @param object $fieldAST
675672
* @return string
676673
*/
677-
private static function getFieldUid($fieldAST)
674+
private static function getFieldUid($fieldAST, ObjectType $fieldType)
678675
{
679-
return $fieldAST->loc->start . '-' . $fieldAST->loc->end;
676+
return $fieldAST->loc->start . '-' . $fieldAST->loc->end . '-' . $fieldType->name;
680677
}
681678
}

0 commit comments

Comments
 (0)