GraphQL\Language\Visitor::visitInParallel PHP Method

visitInParallel() static public method

static public visitInParallel ( $visitors ) : array
$visitors
return array
    static function visitInParallel($visitors)
    {
        $visitorsCount = count($visitors);
        $skipping = new \SplFixedArray($visitorsCount);
        return ['enter' => function ($node) use($visitors, $skipping, $visitorsCount) {
            for ($i = 0; $i < $visitorsCount; $i++) {
                if (empty($skipping[$i])) {
                    $fn = self::getVisitFn($visitors[$i], $node->kind, false);
                    if ($fn) {
                        $result = call_user_func_array($fn, func_get_args());
                        if ($result instanceof VisitorOperation) {
                            if ($result->doContinue) {
                                $skipping[$i] = $node;
                            } else {
                                if ($result->doBreak) {
                                    $skipping[$i] = $result;
                                } else {
                                    if ($result->removeNode) {
                                        return $result;
                                    }
                                }
                            }
                        } else {
                            if ($result !== null) {
                                return $result;
                            }
                        }
                    }
                }
            }
        }, 'leave' => function ($node) use($visitors, $skipping, $visitorsCount) {
            for ($i = 0; $i < $visitorsCount; $i++) {
                if (empty($skipping[$i])) {
                    $fn = self::getVisitFn($visitors[$i], $node->kind, true);
                    if ($fn) {
                        $result = call_user_func_array($fn, func_get_args());
                        if ($result instanceof VisitorOperation) {
                            if ($result->doBreak) {
                                $skipping[$i] = $result;
                            } else {
                                if ($result->removeNode) {
                                    return $result;
                                }
                            }
                        } else {
                            if ($result !== null) {
                                return $result;
                            }
                        }
                    }
                } else {
                    if ($skipping[$i] === $node) {
                        $skipping[$i] = null;
                    }
                }
            }
        }];
    }

Usage Example

Ejemplo n.º 1
0
 /**
  * This uses a specialized visitor which runs multiple visitors in parallel,
  * while maintaining the visitor skip and break API.
  *
  * @param Schema $schema
  * @param TypeInfo $typeInfo
  * @param DocumentNode $documentNode
  * @param array $rules
  * @return array
  */
 public static function visitUsingRules(Schema $schema, TypeInfo $typeInfo, DocumentNode $documentNode, array $rules)
 {
     $context = new ValidationContext($schema, $documentNode, $typeInfo);
     $visitors = [];
     foreach ($rules as $rule) {
         $visitors[] = $rule($context);
     }
     Visitor::visit($documentNode, Visitor::visitWithTypeInfo($typeInfo, Visitor::visitInParallel($visitors)));
     return $context->getErrors();
 }
All Usage Examples Of GraphQL\Language\Visitor::visitInParallel