private function walkComparisonConstraint(QOM\ComparisonInterface $constraint)
 {
     $operand1 = $this->walkOperand($constraint->getOperand1());
     $operand2 = $this->walkOperand($constraint->getOperand2());
     if (is_numeric($operand2)) {
         $pattern = '%0' . strlen(PHP_INT_MAX) . 's';
     } else {
         if (!$operand2) {
             // boolean
             $operand2 = ZendSearchAdapter::VALUE_BOOLEAN_FALSE;
         }
     }
     switch ($constraint->getOperator()) {
         case QOMConstants::JCR_OPERATOR_EQUAL_TO:
             return sprintf('%s:"%s"', $operand1, $operand2);
         case QOMConstants::JCR_OPERATOR_NOT_EQUAL_TO:
             return sprintf('NOT %s:"%s"', $operand1, $operand2);
         case QOMConstants::JCR_OPERATOR_LESS_THAN:
             return sprintf('%s:{-' . $pattern . ' TO %s}', $operand1, PHP_INT_MAX, $operand2);
         case QOMConstants::JCR_OPERATOR_LESS_THAN_OR_EQUAL_TO:
             return sprintf('%s:[-' . $pattern . ' TO %s]', $operand1, PHP_INT_MAX, $operand2);
         case QOMConstants::JCR_OPERATOR_GREATER_THAN:
             return sprintf('%s:{' . $pattern . ' TO %s}', $operand1, $operand2, PHP_INT_MAX);
         case QOMConstants::JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO:
             return sprintf('%s:[' . $pattern . ' TO %s]', $operand1, $operand2, PHP_INT_MAX);
         case QOMConstants::JCR_OPERATOR_LIKE:
             return sprintf('%s:"%s"', $operand1, str_replace('%', '*', $operand2));
     }
     throw new InvalidQueryException('Operator "' . $constraint->getOperator() . '" not yet supported.');
 }
 /**
  * This method figures out the best way to do a comparison
  * When we need to compare a property with a literal value,
  * we need to be aware of the multivalued properties, we then require
  * a different xpath statement then with other comparisons
  *
  * @param QOM\ComparisonInterface $constraint
  *
  * @return string
  */
 public function walkComparisonConstraint(QOM\ComparisonInterface $constraint)
 {
     $operator = $this->walkOperator($constraint->getOperator());
     $operator1 = $constraint->getOperand1();
     $operator2 = $constraint->getOperand2();
     // Check if we have a property and a literal value (in random order)
     if ($operator1 instanceof QOM\PropertyValueInterface && $operator2 instanceof QOM\LiteralInterface || $operator1 instanceof QOM\LiteralInterface && $operator2 instanceof QOM\PropertyValueInterface || $operator1 instanceof QOM\NodeNameInterface && $operator2 instanceof QOM\LiteralInterface || $operator1 instanceof QOM\LiteralInterface && $operator2 instanceof QOM\NodeNameInterface) {
         // Check whether the left is the literal, at this point the other always is the literal/nodename operand
         if ($operator1 instanceof QOM\LiteralInterface) {
             $operand = $operator2;
             $literalOperand = $operator1;
         } else {
             $literalOperand = $operator2;
             $operand = $operator1;
         }
         if (is_string($literalOperand->getLiteralValue()) && '=' !== $operator && '!=' !== $operator) {
             return $this->walkOperand($operator1) . " " . $operator . " " . $this->walkOperand($operator2);
         }
         if ($operand instanceof QOM\NodeNameInterface) {
             $selectorName = $operand->getSelectorName();
             $alias = $this->getTableAlias($selectorName);
             $literal = $literalOperand->getLiteralValue();
             if (false !== strpos($literal, ':')) {
                 $parts = explode(':', $literal);
                 if (!isset($this->namespaces[$parts[0]])) {
                     throw new NamespaceException('The namespace ' . $parts[0] . ' was not registered.');
                 }
                 $parts[0] = $this->namespaces[$parts[0]];
                 $literal = implode(':', $parts);
             }
             return $this->platform->getConcatExpression("{$alias}.namespace", "(CASE {$alias}.namespace WHEN '' THEN '' ELSE ':' END)", "{$alias}.local_name") . " " . $operator . " " . $this->conn->quote($literal);
         }
         if ('jcr:path' !== $operand->getPropertyName() && 'jcr:uuid' !== $operand->getPropertyName()) {
             if (is_int($literalOperand->getLiteralValue()) || is_float($literalOperand->getLiteralValue())) {
                 return $this->walkNumComparisonConstraint($operand, $literalOperand, $operator);
             }
             if (is_bool($literalOperand->getLiteralValue())) {
                 return $this->walkBoolComparisonConstraint($operand, $literalOperand, $operator);
             }
             return $this->walkTextComparisonConstraint($operand, $literalOperand, $operator);
         }
     }
     return $this->walkOperand($operator1) . " " . $operator . " " . $this->walkOperand($operator2);
 }
 /**
  * Comparison ::= DynamicOperand Operator StaticOperand
  *
  * Operator ::= EqualTo | NotEqualTo | LessThan |
  *        LessThanOrEqualTo | GreaterThan |
  *        GreaterThanOrEqualTo | Like
  * EqualTo ::= '='
  * NotEqualTo ::= '<>'
  * LessThan ::= '<'
  * LessThanOrEqualTo ::= '<='
  * GreaterThan ::= '>'
  * GreaterThanOrEqualTo ::= '>='
  * Like ::= 'LIKE'
  *
  * @param  QOM\ComparisonInterface $comparison
  * @return string
  */
 protected function convertComparison(QOM\ComparisonInterface $comparison)
 {
     $operand1 = $this->convertDynamicOperand($comparison->getOperand1());
     $operand2 = $this->convertStaticOperand($comparison->getOperand2());
     $operator = $this->generator->evalOperator($comparison->getOperator());
     return $this->generator->evalComparison($operand1, $operator, $operand2);
 }