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