/** * {@inheritDoc} */ public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null) { // visit the arguments array_map(function ($argument) use(&$handle, $eldnah) { return $argument->accept($this, $handle, $eldnah); }, $element->getArguments()); }
/** * {@inheritDoc} */ public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null) { $xcallable = $this->getOperator($element->getName()); $arguments = array_map(function ($argument) use(&$handle, $eldnah) { return $argument->accept($this, $handle, $eldnah); }, $element->getArguments()); return $xcallable->distributeArguments($arguments); }
/** * {@inheritDoc} */ public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null) { $parameters = []; $operator = $element->getName(); $sql = parent::visitOperator($element, $parameters, $eldnah); if (in_array($operator, ['and', 'or', 'not'])) { return $sql; } if ($this->hasOperator($operator)) { return sprintf('(new \\PommProject\\Foundation\\Where(%s, [%s]))', $sql, implode(', ', $parameters)); } return sprintf('(new \\PommProject\\Foundation\\Where("%s", [%s]))', $sql, implode(', ', $parameters)); }
/** * {@inheritDoc} */ public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null) { try { $xcallable = $this->getOperator($element->getName()); } catch (OperatorNotFoundException $e) { if (!$this->allowStarOperator) { throw $e; } $xcallable = $this->getStarOperator($element); } $parameters = []; $arguments = array_map(function ($argument) use(&$parameters) { return $argument->accept($this, $parameters); }, $element->getArguments()); $sql = $xcallable->distributeArguments($arguments); if ($sql instanceof Where) { return $sql; } return new Where($sql, $parameters); }
/** * {@inheritDoc} */ public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null) { $operatorName = $element->getName(); // the operator does not exist at all, throw an error before doing anything else. if (!$this->hasInlineOperator($operatorName) && !$this->hasOperator($operatorName)) { throw new OperatorNotFoundException($operatorName, sprintf('Operator "%s" does not exist.', $operatorName)); } // expand the arguments $arguments = array_map(function ($argument) use(&$handle, $eldnah) { return $argument->accept($this, $handle, $eldnah); }, $element->getArguments()); // and either inline the operator call if ($this->hasInlineOperator($operatorName)) { $callable = $this->getInlineOperator($operatorName); return call_user_func_array($callable, $arguments); } $inlinedArguments = empty($arguments) ? '' : ', ' . implode(', ', $arguments); // or defer it. return sprintf('call_user_func($operators["%s"]%s)', $operatorName, $inlinedArguments); }
/** * Visit an operator * * @param \Hoa\Visitor\Element $element Element to visit. * @param mixed &$handle Handle (reference). * @param mixed $eldnah Handle (not reference). * @return mixed */ protected function visitOperator(Ruler\Model\Operator $element, &$handle = null, $eldnah = null) { $name = $element->getName(); $arguments = []; foreach ($element->getArguments() as $argument) { $value = $argument->accept($this, $handle, $eldnah); $arguments[] = $value; if ($element::LAZY_BREAK === $element->shouldBreakLazyEvaluation($value)) { break; } } if (false === $this->operatorExists($name)) { throw new Ruler\Exception\Asserter('Operator %s does not exist.', 0, $name); } return $this->getOperator($name)->distributeArguments($arguments); }
/** * Return a "*" or "catch all" operator. * * @param Visitor\Element $element The node representing the operator. * * @return \Hoa\Core\Consistency\Xcallable */ protected function getStarOperator(AST\Operator $element) { return xcallable(function () use($element) { return sprintf('%s(%s)', $element->getName(), implode(', ', func_get_args())); }); }
/** * Visit an element. * * @param \Hoa\Visitor\Element $element Element to visit. * @param mixed &$handle Handle (reference). * @param mixed $eldnah Handle (not reference). * @return mixed */ public function visit(Visitor\Element $element, &$handle = null, $eldnah = null) { $out = null; if ($element instanceof Ruler\Model) { $out .= $element->getExpression()->accept($this, $handle, $eldnah); } elseif ($element instanceof Ruler\Model\Operator) { $name = $element->getName(); $arguments = []; foreach ($element->getArguments() as $argument) { $arguments[] = $argument->accept($this, $handle, $eldnah); } if (true === $element->isFunction()) { $out .= $name . '(' . implode(', ', $arguments) . ')'; } else { if (!isset($arguments[1])) { $_out = $name . ' ' . $arguments[0]; } else { $_out = $arguments[0] . ' ' . $name . ' ' . $arguments[1]; } if (false === Ruler\Model\Operator::isToken($name)) { $_out = '(' . $_out . ')'; } $out .= $_out; } } elseif ($element instanceof Ruler\Model\Bag\Scalar) { $value = $element->getValue(); if (true === $value) { $out .= 'true'; } elseif (false === $value) { $out .= 'false'; } elseif (null === $value) { $out .= 'null'; } elseif (is_numeric($value)) { $out .= (string) $value; } else { $out .= '\'' . str_replace('\\', '\\\'', $value) . '\''; } } elseif ($element instanceof Ruler\Model\Bag\RulerArray) { $values = []; foreach ($element->getArray() as $value) { $values[] = $value->accept($this, $handle, $eldnah); } $out .= '[' . implode(', ', $values) . ']'; } elseif ($element instanceof Ruler\Model\Bag\Context) { $out .= $element->getId(); foreach ($element->getDimensions() as $dimension) { $value = $dimension[Ruler\Model\Bag\Context::ACCESS_VALUE]; switch ($dimension[Ruler\Model\Bag\Context::ACCESS_TYPE]) { case Ruler\Model\Bag\Context::ARRAY_ACCESS: $out .= '[' . $value->accept($this, $handle, $eldnah) . ']'; break; case Ruler\Model\Bag\Context::ATTRIBUTE_ACCESS: $out .= '.' . $value; break; case Ruler\Model\Bag\Context::METHOD_ACCESS: $out .= '.' . $value->accept($this, $handle, $eldnah); break; } } } return $out; }