Ejemplo n.º 1
0
 /**
  * Entry point for the `walkQuery` routine.  Execution bounces between here, where the reducer's ->visit() method
  * is invoked, and `walkQuery` where we send in the scores from the `visit` call.
  *
  * @param Query                $query
  * @param AbstractType         $currentLevelSchema
  * @param AbstractQueryVisitor $reducer
  */
 protected function doVisit(Query $query, $currentLevelSchema, $reducer)
 {
     if (!$currentLevelSchema instanceof AbstractObjectType || !$currentLevelSchema->hasField($query->getName())) {
         return;
     }
     if ($operationField = $currentLevelSchema->getField($query->getName())) {
         $coroutine = $this->walkQuery($query, $operationField);
         if ($results = $coroutine->current()) {
             $queryCost = 0;
             while ($results) {
                 // initial values come from advancing the generator via ->current, subsequent values come from ->send()
                 list($queryField, $astField, $childCost) = $results;
                 /**
                  * @var Query|FieldAst $queryField
                  * @var Field          $astField
                  */
                 $cost = $reducer->visit($queryField->getKeyValueArguments(), $astField->getConfig(), $childCost);
                 $queryCost += $cost;
                 $results = $coroutine->send($cost);
             }
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * MaxComplexityQueryVisitor constructor.
  *
  * @param int $max max allowed complexity score
  */
 public function __construct($max)
 {
     parent::__construct();
     $this->maxScore = $max;
 }