@@ -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