Chris@0: . Chris@0: */ Chris@0: Chris@0: namespace Doctrine\Common\Collections; Chris@0: Chris@0: use Doctrine\Common\Collections\Expr\Expression; Chris@0: use Doctrine\Common\Collections\Expr\CompositeExpression; Chris@0: Chris@0: /** Chris@0: * Criteria for filtering Selectable collections. Chris@0: * Chris@0: * @author Benjamin Eberlei Chris@0: * @since 2.3 Chris@0: */ Chris@0: class Criteria Chris@0: { Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: const ASC = 'ASC'; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: const DESC = 'DESC'; Chris@0: Chris@0: /** Chris@0: * @var \Doctrine\Common\Collections\ExpressionBuilder|null Chris@0: */ Chris@0: private static $expressionBuilder; Chris@0: Chris@0: /** Chris@0: * @var \Doctrine\Common\Collections\Expr\Expression|null Chris@0: */ Chris@0: private $expression; Chris@0: Chris@0: /** Chris@0: * @var string[] Chris@0: */ Chris@0: private $orderings = array(); Chris@0: Chris@0: /** Chris@0: * @var int|null Chris@0: */ Chris@0: private $firstResult; Chris@0: Chris@0: /** Chris@0: * @var int|null Chris@0: */ Chris@0: private $maxResults; Chris@0: Chris@0: /** Chris@0: * Creates an instance of the class. Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public static function create() Chris@0: { Chris@0: return new static(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the expression builder. Chris@0: * Chris@0: * @return \Doctrine\Common\Collections\ExpressionBuilder Chris@0: */ Chris@0: public static function expr() Chris@0: { Chris@0: if (self::$expressionBuilder === null) { Chris@0: self::$expressionBuilder = new ExpressionBuilder(); Chris@0: } Chris@0: Chris@0: return self::$expressionBuilder; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Construct a new Criteria. Chris@0: * Chris@0: * @param Expression $expression Chris@0: * @param string[]|null $orderings Chris@0: * @param int|null $firstResult Chris@0: * @param int|null $maxResults Chris@0: */ Chris@0: public function __construct(Expression $expression = null, array $orderings = null, $firstResult = null, $maxResults = null) Chris@0: { Chris@0: $this->expression = $expression; Chris@0: Chris@0: $this->setFirstResult($firstResult); Chris@0: $this->setMaxResults($maxResults); Chris@0: Chris@0: if (null !== $orderings) { Chris@0: $this->orderBy($orderings); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the where expression to evaluate when this Criteria is searched for. Chris@0: * Chris@0: * @param Expression $expression Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public function where(Expression $expression) Chris@0: { Chris@0: $this->expression = $expression; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Appends the where expression to evaluate when this Criteria is searched for Chris@0: * using an AND with previous expression. Chris@0: * Chris@0: * @param Expression $expression Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public function andWhere(Expression $expression) Chris@0: { Chris@0: if ($this->expression === null) { Chris@0: return $this->where($expression); Chris@0: } Chris@0: Chris@0: $this->expression = new CompositeExpression(CompositeExpression::TYPE_AND, array( Chris@0: $this->expression, $expression Chris@0: )); Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Appends the where expression to evaluate when this Criteria is searched for Chris@0: * using an OR with previous expression. Chris@0: * Chris@0: * @param Expression $expression Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public function orWhere(Expression $expression) Chris@0: { Chris@0: if ($this->expression === null) { Chris@0: return $this->where($expression); Chris@0: } Chris@0: Chris@0: $this->expression = new CompositeExpression(CompositeExpression::TYPE_OR, array( Chris@0: $this->expression, $expression Chris@0: )); Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the expression attached to this Criteria. Chris@0: * Chris@0: * @return Expression|null Chris@0: */ Chris@0: public function getWhereExpression() Chris@0: { Chris@0: return $this->expression; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the current orderings of this Criteria. Chris@0: * Chris@0: * @return string[] Chris@0: */ Chris@0: public function getOrderings() Chris@0: { Chris@0: return $this->orderings; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the ordering of the result of this Criteria. Chris@0: * Chris@0: * Keys are field and values are the order, being either ASC or DESC. Chris@0: * Chris@0: * @see Criteria::ASC Chris@0: * @see Criteria::DESC Chris@0: * Chris@0: * @param string[] $orderings Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public function orderBy(array $orderings) Chris@0: { Chris@0: $this->orderings = array_map( Chris@0: function ($ordering) { Chris@0: return strtoupper($ordering) === Criteria::ASC ? Criteria::ASC : Criteria::DESC; Chris@0: }, Chris@0: $orderings Chris@0: ); Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the current first result option of this Criteria. Chris@0: * Chris@0: * @return int|null Chris@0: */ Chris@0: public function getFirstResult() Chris@0: { Chris@0: return $this->firstResult; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the number of first result that this Criteria should return. Chris@0: * Chris@0: * @param int|null $firstResult The value to set. Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public function setFirstResult($firstResult) Chris@0: { Chris@0: $this->firstResult = null === $firstResult ? null : (int) $firstResult; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets maxResults. Chris@0: * Chris@0: * @return int|null Chris@0: */ Chris@0: public function getMaxResults() Chris@0: { Chris@0: return $this->maxResults; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets maxResults. Chris@0: * Chris@0: * @param int|null $maxResults The value to set. Chris@0: * Chris@0: * @return Criteria Chris@0: */ Chris@0: public function setMaxResults($maxResults) Chris@0: { Chris@0: $this->maxResults = null === $maxResults ? null : (int) $maxResults; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: }