2023-03-11 12:04:29 +03:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Zend Framework (http://framework.zend.com/)
|
|
|
|
*
|
|
|
|
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
2023-04-01 09:03:34 +03:00
|
|
|
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
2023-03-11 12:04:29 +03:00
|
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Zend\Db\Sql\Predicate;
|
|
|
|
|
|
|
|
use Zend\Db\Sql\Exception\RuntimeException;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property Predicate $and
|
|
|
|
* @property Predicate $or
|
|
|
|
* @property Predicate $AND
|
|
|
|
* @property Predicate $OR
|
|
|
|
* @property Predicate $NEST
|
|
|
|
* @property Predicate $UNNEST
|
|
|
|
*/
|
|
|
|
class Predicate extends PredicateSet
|
|
|
|
{
|
|
|
|
protected $unnest = null;
|
|
|
|
protected $nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Begin nesting predicates
|
|
|
|
*
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function nest()
|
|
|
|
{
|
|
|
|
$predicateSet = new Predicate();
|
|
|
|
$predicateSet->setUnnest($this);
|
|
|
|
$this->addPredicate($predicateSet, ($this->nextPredicateCombineOperator) ?: $this->defaultCombination);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
return $predicateSet;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicate what predicate will be unnested
|
|
|
|
*
|
|
|
|
* @param Predicate $predicate
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function setUnnest(Predicate $predicate)
|
|
|
|
{
|
|
|
|
$this->unnest = $predicate;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicate end of nested predicate
|
|
|
|
*
|
|
|
|
* @return Predicate
|
|
|
|
* @throws RuntimeException
|
|
|
|
*/
|
|
|
|
public function unnest()
|
|
|
|
{
|
2023-04-01 09:03:34 +03:00
|
|
|
if ($this->unnest === null) {
|
2023-03-11 12:04:29 +03:00
|
|
|
throw new RuntimeException('Not nested');
|
|
|
|
}
|
2023-04-01 09:03:34 +03:00
|
|
|
$unnest = $this->unnest;
|
2023-03-11 12:04:29 +03:00
|
|
|
$this->unnest = null;
|
2023-04-01 09:03:34 +03:00
|
|
|
return $unnest;
|
2023-03-11 12:04:29 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Equal To" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Operator predicate
|
|
|
|
*
|
|
|
|
* @param int|float|bool|string $left
|
|
|
|
* @param int|float|bool|string $right
|
|
|
|
* @param string $leftType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_IDENTIFIER {@see allowedTypes}
|
|
|
|
* @param string $rightType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_VALUE {@see allowedTypes}
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function equalTo($left, $right, $leftType = self::TYPE_IDENTIFIER, $rightType = self::TYPE_VALUE)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Operator($left, Operator::OPERATOR_EQUAL_TO, $right, $leftType, $rightType),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Not Equal To" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Operator predicate
|
|
|
|
*
|
|
|
|
* @param int|float|bool|string $left
|
|
|
|
* @param int|float|bool|string $right
|
|
|
|
* @param string $leftType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_IDENTIFIER {@see allowedTypes}
|
|
|
|
* @param string $rightType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_VALUE {@see allowedTypes}
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function notEqualTo($left, $right, $leftType = self::TYPE_IDENTIFIER, $rightType = self::TYPE_VALUE)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Operator($left, Operator::OPERATOR_NOT_EQUAL_TO, $right, $leftType, $rightType),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Less Than" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Operator predicate
|
|
|
|
*
|
|
|
|
* @param int|float|bool|string $left
|
|
|
|
* @param int|float|bool|string $right
|
|
|
|
* @param string $leftType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_IDENTIFIER {@see allowedTypes}
|
|
|
|
* @param string $rightType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_VALUE {@see allowedTypes}
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function lessThan($left, $right, $leftType = self::TYPE_IDENTIFIER, $rightType = self::TYPE_VALUE)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Operator($left, Operator::OPERATOR_LESS_THAN, $right, $leftType, $rightType),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Greater Than" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Operator predicate
|
|
|
|
*
|
|
|
|
* @param int|float|bool|string $left
|
|
|
|
* @param int|float|bool|string $right
|
|
|
|
* @param string $leftType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_IDENTIFIER {@see allowedTypes}
|
|
|
|
* @param string $rightType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_VALUE {@see allowedTypes}
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function greaterThan($left, $right, $leftType = self::TYPE_IDENTIFIER, $rightType = self::TYPE_VALUE)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Operator($left, Operator::OPERATOR_GREATER_THAN, $right, $leftType, $rightType),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Less Than Or Equal To" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Operator predicate
|
|
|
|
*
|
|
|
|
* @param int|float|bool|string $left
|
|
|
|
* @param int|float|bool|string $right
|
|
|
|
* @param string $leftType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_IDENTIFIER {@see allowedTypes}
|
|
|
|
* @param string $rightType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_VALUE {@see allowedTypes}
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function lessThanOrEqualTo($left, $right, $leftType = self::TYPE_IDENTIFIER, $rightType = self::TYPE_VALUE)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Operator($left, Operator::OPERATOR_LESS_THAN_OR_EQUAL_TO, $right, $leftType, $rightType),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Greater Than Or Equal To" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Operator predicate
|
|
|
|
*
|
|
|
|
* @param int|float|bool|string $left
|
|
|
|
* @param int|float|bool|string $right
|
|
|
|
* @param string $leftType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_IDENTIFIER {@see allowedTypes}
|
|
|
|
* @param string $rightType TYPE_IDENTIFIER or TYPE_VALUE by default TYPE_VALUE {@see allowedTypes}
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function greaterThanOrEqualTo($left, $right, $leftType = self::TYPE_IDENTIFIER, $rightType = self::TYPE_VALUE)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Operator($left, Operator::OPERATOR_GREATER_THAN_OR_EQUAL_TO, $right, $leftType, $rightType),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Like" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Like predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @param string $like
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function like($identifier, $like)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Like($identifier, $like),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Create "notLike" predicate
|
|
|
|
*
|
|
|
|
* Utilizes In predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @param string $notLike
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function notLike($identifier, $notLike)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new NotLike($identifier, $notLike),
|
|
|
|
($this->nextPredicateCombineOperator) ? : $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create an expression, with parameter placeholders
|
|
|
|
*
|
|
|
|
* @param $expression
|
|
|
|
* @param $parameters
|
|
|
|
* @return $this
|
|
|
|
*/
|
|
|
|
public function expression($expression, $parameters)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Expression($expression, $parameters),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "Literal" predicate
|
|
|
|
*
|
|
|
|
* Literal predicate, for parameters, use expression()
|
|
|
|
*
|
|
|
|
* @param string $literal
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function literal($literal)
|
|
|
|
{
|
|
|
|
// process deprecated parameters from previous literal($literal, $parameters = null) signature
|
|
|
|
if (func_num_args() >= 2) {
|
|
|
|
$parameters = func_get_arg(1);
|
|
|
|
$predicate = new Expression($literal, $parameters);
|
|
|
|
}
|
|
|
|
|
|
|
|
// normal workflow for "Literals" here
|
|
|
|
if (!isset($predicate)) {
|
|
|
|
$predicate = new Literal($literal);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->addPredicate(
|
|
|
|
$predicate,
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "IS NULL" predicate
|
|
|
|
*
|
|
|
|
* Utilizes IsNull predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function isNull($identifier)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new IsNull($identifier),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "IS NOT NULL" predicate
|
|
|
|
*
|
|
|
|
* Utilizes IsNotNull predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function isNotNull($identifier)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new IsNotNull($identifier),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "IN" predicate
|
|
|
|
*
|
|
|
|
* Utilizes In predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @param array|\Zend\Db\Sql\Select $valueSet
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function in($identifier, $valueSet = null)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new In($identifier, $valueSet),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "NOT IN" predicate
|
|
|
|
*
|
|
|
|
* Utilizes NotIn predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @param array|\Zend\Db\Sql\Select $valueSet
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function notIn($identifier, $valueSet = null)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new NotIn($identifier, $valueSet),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create "between" predicate
|
|
|
|
*
|
|
|
|
* Utilizes Between predicate
|
|
|
|
*
|
|
|
|
* @param string $identifier
|
|
|
|
* @param int|float|string $minValue
|
|
|
|
* @param int|float|string $maxValue
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function between($identifier, $minValue, $maxValue)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
new Between($identifier, $minValue, $maxValue),
|
|
|
|
($this->nextPredicateCombineOperator) ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2023-04-01 09:03:34 +03:00
|
|
|
/**
|
|
|
|
* Use given predicate directly
|
|
|
|
*
|
|
|
|
* Contrary to {@link addPredicate()} this method respects formerly set
|
|
|
|
* AND / OR combination operator, thus allowing generic predicates to be
|
|
|
|
* used fluently within where chains as any other concrete predicate.
|
|
|
|
*
|
|
|
|
* @param PredicateInterface $predicate
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function predicate(PredicateInterface $predicate)
|
|
|
|
{
|
|
|
|
$this->addPredicate(
|
|
|
|
$predicate,
|
|
|
|
$this->nextPredicateCombineOperator ?: $this->defaultCombination
|
|
|
|
);
|
|
|
|
$this->nextPredicateCombineOperator = null;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2023-03-11 12:04:29 +03:00
|
|
|
/**
|
|
|
|
* Overloading
|
|
|
|
*
|
|
|
|
* Overloads "or", "and", "nest", and "unnest"
|
|
|
|
*
|
|
|
|
* @param string $name
|
|
|
|
* @return Predicate
|
|
|
|
*/
|
|
|
|
public function __get($name)
|
|
|
|
{
|
|
|
|
switch (strtolower($name)) {
|
|
|
|
case 'or':
|
|
|
|
$this->nextPredicateCombineOperator = self::OP_OR;
|
|
|
|
break;
|
|
|
|
case 'and':
|
|
|
|
$this->nextPredicateCombineOperator = self::OP_AND;
|
|
|
|
break;
|
|
|
|
case 'nest':
|
|
|
|
return $this->nest();
|
|
|
|
case 'unnest':
|
|
|
|
return $this->unnest();
|
|
|
|
}
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
}
|