/**
  * {@inheritDoc}
  */
 public function walkComparison(Comparison $comparison)
 {
     if (!isset($this->queryAliases[0])) {
         throw new QueryException('No aliases are set before invoking walkComparison().');
     }
     $field = $this->queryAliases[0] . '.' . $comparison->getField();
     foreach ($this->queryAliases as $alias) {
         if (strpos($comparison->getField() . '.', $alias . '.') === 0) {
             $field = $comparison->getField();
             break;
         }
     }
     $parameterName = str_replace('.', '_', $comparison->getField());
     foreach ($this->parameters as $parameter) {
         if ($parameter->getName() === $parameterName) {
             $parameterName .= '_' . count($this->parameters);
             break;
         }
     }
     $parameter = new Parameter($parameterName, $this->walkValue($comparison->getValue()));
     $placeholder = ':' . $parameterName;
     switch ($comparison->getOperator()) {
         case Comparison::IN:
             $this->parameters[] = $parameter;
             return $this->expr->in($field, $placeholder);
         case Comparison::NIN:
             $this->parameters[] = $parameter;
             return $this->expr->notIn($field, $placeholder);
         case Comparison::EQ:
         case Comparison::IS:
             if ($this->walkValue($comparison->getValue()) === null) {
                 return $this->expr->isNull($field);
             }
             $this->parameters[] = $parameter;
             return $this->expr->eq($field, $placeholder);
         case Comparison::NEQ:
             if ($this->walkValue($comparison->getValue()) === null) {
                 return $this->expr->isNotNull($field);
             }
             $this->parameters[] = $parameter;
             return $this->expr->neq($field, $placeholder);
         case Comparison::CONTAINS:
             $parameter->setValue('%' . $parameter->getValue() . '%', $parameter->getType());
             $this->parameters[] = $parameter;
             return $this->expr->like($field, $placeholder);
         default:
             $operator = self::convertComparisonOperator($comparison->getOperator());
             if ($operator) {
                 $this->parameters[] = $parameter;
                 return new Expr\Comparison($field, $operator, $placeholder);
             }
             throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator());
     }
 }
 /**
  * Adds parameter to collection and removes all other parameters with same name.
  *
  * @param ArrayCollection $parameters
  * @param Parameter $newParameter
  */
 protected function addOrReplaceParameter(ArrayCollection $parameters, Parameter $newParameter)
 {
     $removeParameters = [];
     /** @var Parameter $parameter */
     foreach ($parameters->getValues() as $parameter) {
         if ($parameter->getName() === $newParameter->getName()) {
             $removeParameters[] = $parameter;
         }
     }
     foreach ($removeParameters as $removeParameter) {
         $parameters->removeElement($removeParameter);
     }
     $parameters->add($newParameter);
 }
 /**
  * Converts a query parameter to an array.
  *
  * @param Parameter $parameter The query parameter
  *
  * @return array The array representation of the parameter
  */
 private function parameterToArray(Parameter $parameter)
 {
     return array($parameter->getName(), $parameter->getType(), $parameter->getValue());
 }