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); }