. */ namespace Doctrine\ORM\Persisters; use Doctrine\Common\Collections\Expr\ExpressionVisitor; use Doctrine\Common\Collections\Expr\Comparison; use Doctrine\Common\Collections\Expr\Value; use Doctrine\Common\Collections\Expr\CompositeExpression; /** * Extract the values from a criteria/expression * * @author Benjamin Eberlei */ class SqlValueVisitor extends ExpressionVisitor { /** * @var array */ private $values = array(); /** * @var array */ private $types = array(); /** * Converts a comparison expression into the target query language output. * * @param \Doctrine\Common\Collections\Expr\Comparison $comparison * * @return mixed */ public function walkComparison(Comparison $comparison) { $value = $this->getValueFromComparison($comparison); $field = $comparison->getField(); $operator = $comparison->getOperator(); if (($operator === Comparison::EQ || $operator === Comparison::IS) && $value === null) { return; } else if ($operator === Comparison::NEQ && $value === null) { return; } $this->values[] = $value; $this->types[] = array($field, $value); } /** * Converts a composite expression into the target query language output. * * @param \Doctrine\Common\Collections\Expr\CompositeExpression $expr * * @return mixed */ public function walkCompositeExpression(CompositeExpression $expr) { foreach ($expr->getExpressionList() as $child) { $this->dispatch($child); } } /** * Converts a value expression into the target query language part. * * @param \Doctrine\Common\Collections\Expr\Value $value * * @return mixed */ public function walkValue(Value $value) { return; } /** * Returns the Parameters and Types necessary for matching the last visited expression. * * @return array */ public function getParamsAndTypes() { return array($this->values, $this->types); } /** * Returns the value from a Comparison. In case of a CONTAINS comparison, * the value is wrapped in %-signs, because it will be used in a LIKE clause. * * @param \Doctrine\Common\Collections\Expr\Comparison $comparison * @return mixed */ protected function getValueFromComparison(Comparison $comparison) { $value = $comparison->getValue()->getValue(); return $comparison->getOperator() == Comparison::CONTAINS ? "%{$value}%" : $value; } }