2015-08-17 17:00:26 -07:00
< ? php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license . For more information , see
* < http :// www . doctrine - project . org >.
*/
namespace Doctrine\Common\Collections ;
use Doctrine\Common\Collections\Expr\Expression ;
use Doctrine\Common\Collections\Expr\CompositeExpression ;
/**
* Criteria for filtering Selectable collections .
*
* @ author Benjamin Eberlei < kontakt @ beberlei . de >
* @ since 2.3
*/
class Criteria
{
/**
* @ var string
*/
const ASC = 'ASC' ;
/**
* @ var string
*/
const DESC = 'DESC' ;
/**
* @ var \Doctrine\Common\Collections\ExpressionBuilder | null
*/
private static $expressionBuilder ;
/**
* @ var \Doctrine\Common\Collections\Expr\Expression | null
*/
private $expression ;
/**
2015-10-08 11:40:12 -07:00
* @ var string []
2015-08-17 17:00:26 -07:00
*/
2018-11-23 12:29:20 +00:00
private $orderings = [];
2015-08-17 17:00:26 -07:00
/**
* @ 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 \Doctrine\Common\Collections\ExpressionBuilder
*/
public static function expr ()
{
if ( self :: $expressionBuilder === null ) {
self :: $expressionBuilder = new ExpressionBuilder ();
}
2015-10-08 11:40:12 -07:00
2015-08-17 17:00:26 -07:00
return self :: $expressionBuilder ;
}
/**
* Construct a new Criteria .
*
2015-10-08 11:40:12 -07:00
* @ param Expression $expression
* @ param string [] | null $orderings
* @ param int | null $firstResult
* @ param int | null $maxResults
2015-08-17 17:00:26 -07:00
*/
public function __construct ( Expression $expression = null , array $orderings = null , $firstResult = null , $maxResults = null )
{
2015-10-08 11:40:12 -07:00
$this -> expression = $expression ;
$this -> setFirstResult ( $firstResult );
$this -> setMaxResults ( $maxResults );
if ( null !== $orderings ) {
$this -> orderBy ( $orderings );
}
2015-08-17 17:00:26 -07:00
}
/**
* Sets the where expression to evaluate when this Criteria is searched for .
*
* @ param Expression $expression
*
* @ return Criteria
*/
public function where ( Expression $expression )
{
$this -> expression = $expression ;
2015-10-08 11:40:12 -07:00
2015-08-17 17:00:26 -07:00
return $this ;
}
/**
* Appends the where expression to evaluate when this Criteria is searched for
* using an AND with previous expression .
*
* @ param Expression $expression
*
* @ return Criteria
*/
public function andWhere ( Expression $expression )
{
if ( $this -> expression === null ) {
return $this -> where ( $expression );
}
2018-11-23 12:29:20 +00:00
$this -> expression = new CompositeExpression (
CompositeExpression :: TYPE_AND ,
[ $this -> expression , $expression ]
);
2015-08-17 17:00:26 -07:00
return $this ;
}
/**
* Appends the where expression to evaluate when this Criteria is searched for
* using an OR with previous expression .
*
* @ param Expression $expression
*
* @ return Criteria
*/
public function orWhere ( Expression $expression )
{
if ( $this -> expression === null ) {
return $this -> where ( $expression );
}
2018-11-23 12:29:20 +00:00
$this -> expression = new CompositeExpression (
CompositeExpression :: TYPE_OR ,
[ $this -> expression , $expression ]
);
2015-08-17 17:00:26 -07:00
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 .
*
2015-10-08 11:40:12 -07:00
* @ return string []
2015-08-17 17:00:26 -07:00
*/
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
*
2015-10-08 11:40:12 -07:00
* @ param string [] $orderings
2015-08-17 17:00:26 -07:00
*
* @ return Criteria
*/
public function orderBy ( array $orderings )
{
2015-10-08 11:40:12 -07:00
$this -> orderings = array_map (
2018-11-23 12:29:20 +00:00
function ( string $ordering ) : string {
2015-10-08 11:40:12 -07:00
return strtoupper ( $ordering ) === Criteria :: ASC ? Criteria :: ASC : Criteria :: DESC ;
},
$orderings
);
2015-08-17 17:00:26 -07:00
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 )
{
2015-10-08 11:40:12 -07:00
$this -> firstResult = null === $firstResult ? null : ( int ) $firstResult ;
2015-08-17 17:00:26 -07:00
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 )
{
2015-10-08 11:40:12 -07:00
$this -> maxResults = null === $maxResults ? null : ( int ) $maxResults ;
2015-08-17 17:00:26 -07:00
return $this ;
}
}