From 65d9472b0b4fd603a2494c9d70e859e05fa25111 Mon Sep 17 00:00:00 2001 From: Vladimir Razuvaev Date: Wed, 12 Jul 2017 19:44:04 +0700 Subject: [PATCH] Moved PromiseAdapter to ExecutionContext; allow passing it to Executor::execute() directly vs setting statically --- src/Config.php | 33 ----------------------- src/Executor/ExecutionContext.php | 13 ++++++++- src/Executor/Executor.php | 45 ++++++++++++++++++------------- src/GraphQL.php | 16 ++++++++--- 4 files changed, 50 insertions(+), 57 deletions(-) diff --git a/src/Config.php b/src/Config.php index f908980..9d91b4f 100644 --- a/src/Config.php +++ b/src/Config.php @@ -1,7 +1,6 @@ setDescriptor($options['descriptor']); } - - if (isset($options['promiseAdapter'])) { - Utils::invariant( - $options['promiseAdapter'] instanceof PromiseAdapter, - 'Promise adapter must be an instance of GraphQL\Executor\Promise\PromiseAdapter but got: %s', - Utils::getVariableType($options['promiseAdapter']) - ); - $config->setPromiseAdapter($options['promiseAdapter']); - } } return $config; @@ -283,22 +268,4 @@ class Config $this->typeLoader = $typeLoader; return $this; } - - /** - * @return PromiseAdapter - */ - public function getPromiseAdapter() - { - return $this->promiseAdapter; - } - - /** - * @param PromiseAdapter $promiseAdapter - * @return Config - */ - public function setPromiseAdapter($promiseAdapter) - { - $this->promiseAdapter = $promiseAdapter; - return $this; - } } diff --git a/src/Executor/ExecutionContext.php b/src/Executor/ExecutionContext.php index c068bc9..5a61e9e 100644 --- a/src/Executor/ExecutionContext.php +++ b/src/Executor/ExecutionContext.php @@ -54,7 +54,17 @@ class ExecutionContext */ public $errors; - public function __construct($schema, $fragments, $root, $contextValue, $operation, $variables, $errors, $fieldResolver) + public function __construct( + $schema, + $fragments, + $root, + $contextValue, + $operation, + $variables, + $errors, + $fieldResolver, + $promiseAdapter + ) { $this->schema = $schema; $this->fragments = $fragments; @@ -64,6 +74,7 @@ class ExecutionContext $this->variableValues = $variables; $this->errors = $errors ?: []; $this->fieldResolver = $fieldResolver; + $this->promises = $promiseAdapter; } public function addError(Error $error) diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php index 59079b0..e97a0ff 100644 --- a/src/Executor/Executor.php +++ b/src/Executor/Executor.php @@ -88,6 +88,8 @@ class Executor } /** + * Executes DocumentNode against given schema + * * @param Schema $schema * @param DocumentNode $ast * @param $rootValue @@ -95,6 +97,8 @@ class Executor * @param array|\ArrayAccess $variableValues * @param null $operationName * @param callable $fieldResolver + * @param PromiseAdapter $promiseAdapter + * * @return ExecutionResult|Promise */ public static function execute( @@ -104,7 +108,8 @@ class Executor $contextValue = null, $variableValues = null, $operationName = null, - $fieldResolver = null + callable $fieldResolver = null, + PromiseAdapter $promiseAdapter = null ) { if (null !== $variableValues) { @@ -120,7 +125,7 @@ class Executor ); } - $promiseAdapter = self::getPromiseAdapter(); + $promiseAdapter = $promiseAdapter ?: self::getPromiseAdapter(); try { $exeContext = self::buildExecutionContext( @@ -130,7 +135,8 @@ class Executor $contextValue, $variableValues, $operationName, - $fieldResolver + $fieldResolver, + $promiseAdapter ); } catch (Error $e) { if ($promiseAdapter instanceof SyncPromiseAdapter) { @@ -151,7 +157,7 @@ class Executor } /** - * Constructs a ExecutionContext object from the arguments passed to + * Constructs an ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * @param Schema $schema @@ -161,6 +167,7 @@ class Executor * @param $rawVariableValues * @param string $operationName * @param callable $fieldResolver + * @param PromiseAdapter $promiseAdapter * * @return ExecutionContext * @throws Error @@ -172,7 +179,8 @@ class Executor $contextValue, $rawVariableValues, $operationName = null, - $fieldResolver = null + callable $fieldResolver = null, + PromiseAdapter $promiseAdapter = null ) { $errors = []; @@ -225,7 +233,8 @@ class Executor $operation, $variableValues, $errors, - $fieldResolver ?: self::$defaultFieldResolver + $fieldResolver ?: self::$defaultFieldResolver, + $promiseAdapter ?: self::getPromiseAdapter() ); return $exeContext; } @@ -244,16 +253,14 @@ class Executor * Executor constructor. * * @param ExecutionContext $context - * @param PromiseAdapter $promiseAdapter */ - private function __construct(ExecutionContext $context, PromiseAdapter $promiseAdapter) + private function __construct(ExecutionContext $context) { if (!self::$UNDEFINED) { self::$UNDEFINED = Utils::undefined(); } $this->exeContext = $context; - $this->promises = $promiseAdapter; } /** @@ -268,7 +275,7 @@ class Executor // field and its descendants will be omitted, and sibling fields will still // be executed. An execution which encounters errors will still result in a // resolved Promise. - $result = $this->promises->create(function (callable $resolve) { + $result = $this->exeContext->promises->create(function (callable $resolve) { return $resolve($this->executeOperation($this->exeContext->operation, $this->exeContext->rootValue)); }); return $result @@ -375,7 +382,7 @@ class Executor */ private function executeFieldsSerially(ObjectType $parentType, $sourceValue, $path, $fields) { - $prevPromise = $this->promises->createFulfilled([]); + $prevPromise = $this->exeContext->promises->createFulfilled([]); $process = function ($results, $responseName, $path, $parentType, $sourceValue, $fieldNodes) { $fieldPath = $path; @@ -461,7 +468,7 @@ class Executor $keys = array_keys($assoc); $valuesAndPromises = array_values($assoc); - $promise = $this->promises->all($valuesAndPromises); + $promise = $this->exeContext->promises->all($valuesAndPromises); return $promise->then(function($values) use ($keys) { $resolvedResults = []; @@ -788,7 +795,7 @@ class Executor if ($promise) { return $promise->then(null, function ($error) use ($exeContext) { $exeContext->addError($error); - return $this->promises->createFulfilled(null); + return $this->exeContext->promises->createFulfilled(null); }); } return $completed; @@ -832,7 +839,7 @@ class Executor $promise = $this->getPromise($completed); if ($promise) { return $promise->then(null, function ($error) use ($fieldNodes, $path) { - return $this->promises->createRejected(Error::createLocatedError($error, $fieldNodes, $path)); + return $this->exeContext->promises->createRejected(Error::createLocatedError($error, $fieldNodes, $path)); }); } return $completed; @@ -1142,7 +1149,7 @@ class Executor } $completedItems[] = $completedItem; } - return $containsPromise ? $this->promises->all($completedItems) : $completedItems; + return $containsPromise ? $this->exeContext->promises->all($completedItems) : $completedItems; } /** @@ -1299,7 +1306,7 @@ class Executor } if (!empty($promisedIsTypeOfResults)) { - return $this->promises->all($promisedIsTypeOfResults) + return $this->exeContext->promises->all($promisedIsTypeOfResults) ->then(function($isTypeOfResults) use ($possibleTypes) { foreach ($isTypeOfResults as $index => $result) { if ($result) { @@ -1325,12 +1332,12 @@ class Executor if (null === $value || $value instanceof Promise) { return $value; } - if ($this->promises->isThenable($value)) { - $promise = $this->promises->convertThenable($value); + if ($this->exeContext->promises->isThenable($value)) { + $promise = $this->exeContext->promises->convertThenable($value); if (!$promise instanceof Promise) { throw new InvariantViolation(sprintf( '%s::convertThenable is expected to return instance of GraphQL\Executor\Promise\Promise, got: %s', - get_class($this->promises), + get_class($this->exeContext->promises), Utils::printSafe($promise) )); } diff --git a/src/GraphQL.php b/src/GraphQL.php index 3417d49..ad09dd9 100644 --- a/src/GraphQL.php +++ b/src/GraphQL.php @@ -50,6 +50,8 @@ class GraphQL * @param array|null $variableValues * @param string|null $operationName * @param callable $fieldResolver + * @param PromiseAdapter $promiseAdapter + * * @return Promise|array */ public static function execute( @@ -59,7 +61,8 @@ class GraphQL $contextValue = null, $variableValues = null, $operationName = null, - callable $fieldResolver = null + callable $fieldResolver = null, + PromiseAdapter $promiseAdapter = null ) { $result = self::executeAndReturnResult( @@ -69,7 +72,8 @@ class GraphQL $contextValue, $variableValues, $operationName, - $fieldResolver + $fieldResolver, + $promiseAdapter ); if ($result instanceof ExecutionResult) { @@ -94,6 +98,8 @@ class GraphQL * @param array|null $variableValues * @param string|null $operationName * @param callable $fieldResolver + * @param PromiseAdapter $promiseAdapter + * * @return ExecutionResult|Promise */ public static function executeAndReturnResult( @@ -103,7 +109,8 @@ class GraphQL $contextValue = null, $variableValues = null, $operationName = null, - callable $fieldResolver = null + callable $fieldResolver = null, + PromiseAdapter $promiseAdapter = null ) { try { @@ -129,7 +136,8 @@ class GraphQL $contextValue, $variableValues, $operationName, - $fieldResolver + $fieldResolver, + $promiseAdapter ); } } catch (Error $e) {