Better approach for latest performance tweaks (#8)

This commit is contained in:
vladar 2015-10-25 19:08:24 +06:00
parent 3b3da9e066
commit ea4d43f00f

View File

@ -360,7 +360,7 @@ class Executor
{ {
$fieldAST = $fieldASTs[0]; $fieldAST = $fieldASTs[0];
$uid = self::getFieldUid($fieldAST); $uid = self::getFieldUid($fieldAST, $parentType);
// Get memoized variables if they exist // Get memoized variables if they exist
if (isset($exeContext->memoized['resolveField'][$uid])) { if (isset($exeContext->memoized['resolveField'][$uid])) {
@ -383,7 +383,6 @@ class Executor
// Build hash of arguments from the field.arguments AST, using the // Build hash of arguments from the field.arguments AST, using the
// variables scope to fulfill any variable references. // variables scope to fulfill any variable references.
// TODO: find a way to memoize, in case this field is within a List type.
$args = Values::getArgumentValues( $args = Values::getArgumentValues(
$fieldDef->args, $fieldDef->args,
$fieldAST->arguments, $fieldAST->arguments,
@ -406,21 +405,19 @@ class Executor
// Memoizing results for same query field // Memoizing results for same query field
// (useful for lists when several values are resolved against the same field) // (useful for lists when several values are resolved against the same field)
if ($returnType instanceof ObjectType) { $exeContext->memoized['resolveField'][$uid] = $memoized = [
$memoized = $exeContext->memoized['resolveField'][$uid] = [ 'fieldDef' => $fieldDef,
'fieldDef' => $fieldDef, 'args' => $args,
'args' => $args, 'info' => $info,
'info' => $info, 'results' => new \SplObjectStorage
'results' => new \SplObjectStorage ];
];
}
} }
// When source value is object it is possible to memoize certain subset of results // When source value is object it is possible to memoize certain subset of results
$isObject = is_object($source); $isObject = is_object($source);
if ($isObject && isset($memoized['results'][$source])) { if ($isObject && isset($memoized['results'][$source])) {
$result = $exeContext->memoized['resolveField'][$uid]['results'][$source]; $result = $memoized['results'][$source];
} else { } else {
if (isset($fieldDef->resolveFn)) { if (isset($fieldDef->resolveFn)) {
$resolveFn = $fieldDef->resolveFn; $resolveFn = $fieldDef->resolveFn;
@ -442,8 +439,8 @@ class Executor
$result $result
); );
if ($isObject && isset($memoized['results'])) { if ($isObject) {
$exeContext->memoized['resolveField'][$uid]['results'][$source] = $result; $memoized['results'][$source] = $result;
} }
} }
@ -592,7 +589,7 @@ class Executor
$visitedFragmentNames = new \ArrayObject(); $visitedFragmentNames = new \ArrayObject();
for ($i = 0; $i < count($fieldASTs); $i++) { for ($i = 0; $i < count($fieldASTs); $i++) {
// Get memoized value if it exists // Get memoized value if it exists
$uid = self::getFieldUid($fieldASTs[$i]); $uid = self::getFieldUid($fieldASTs[$i], $runtimeType);
if (isset($exeContext->memoized['collectSubFields'][$uid][$runtimeType->name])) { if (isset($exeContext->memoized['collectSubFields'][$uid][$runtimeType->name])) {
$subFieldASTs = $exeContext->memoized['collectSubFields'][$uid][$runtimeType->name]; $subFieldASTs = $exeContext->memoized['collectSubFields'][$uid][$runtimeType->name];
} }
@ -674,8 +671,8 @@ class Executor
* @param object $fieldAST * @param object $fieldAST
* @return string * @return string
*/ */
private static function getFieldUid($fieldAST) private static function getFieldUid($fieldAST, ObjectType $fieldType)
{ {
return $fieldAST->loc->start . '-' . $fieldAST->loc->end; return $fieldAST->loc->start . '-' . $fieldAST->loc->end . '-' . $fieldType->name;
} }
} }