diff --git a/spec/Condition/NotInSpec.php b/spec/Condition/NotInSpec.php index 0bca1e1..d18105d 100644 --- a/spec/Condition/NotInSpec.php +++ b/spec/Condition/NotInSpec.php @@ -6,7 +6,6 @@ use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use PhpSpec\ObjectBehavior; -use Rb\Specification\Doctrine\Condition\In; use Rb\Specification\Doctrine\SpecificationInterface; class NotInSpec extends ObjectBehavior @@ -23,7 +22,6 @@ public function let() public function it_is_an_expression() { $this->shouldBeAnInstanceOf(SpecificationInterface::class); - $this->shouldBeAnInstanceOf(In::class); } public function it_returns_an_expression_func_object(QueryBuilder $queryBuilder, ArrayCollection $parameters, Expr $expr) diff --git a/src/Condition/Between.php b/src/Condition/Between.php index eca0c45..846f975 100644 --- a/src/Condition/Between.php +++ b/src/Condition/Between.php @@ -4,9 +4,12 @@ use Doctrine\ORM\QueryBuilder; use Rb\Specification\Doctrine\AbstractSpecification; +use Rb\Specification\Doctrine\Helper\ParameterTrait; class Between extends AbstractSpecification { + use ParameterTrait; + /** * @var mixed */ @@ -36,8 +39,8 @@ public function __construct($field, $from, $to, $dqlAlias = null) */ public function modify(QueryBuilder $queryBuilder, $dqlAlias) { - $fromParam = $this->generateParameterName('from', $queryBuilder); - $toParam = $this->generateParameterName('to', $queryBuilder); + $fromParam = $this->generateParameterName($queryBuilder, 'from'); + $toParam = $this->generateParameterName($queryBuilder, 'to'); $queryBuilder->setParameter($fromParam, $this->from); $queryBuilder->setParameter($toParam, $this->to); @@ -48,15 +51,4 @@ public function modify(QueryBuilder $queryBuilder, $dqlAlias) sprintf(':%s', $toParam) ); } - - /** - * @param string $type - * @param QueryBuilder $queryBuilder - * - * @return string - */ - private function generateParameterName($type, QueryBuilder $queryBuilder) - { - return sprintf('%s_%d', $type, count($queryBuilder->getParameters())); - } } diff --git a/src/Condition/Comparison.php b/src/Condition/Comparison.php index 4b0b525..91f2005 100644 --- a/src/Condition/Comparison.php +++ b/src/Condition/Comparison.php @@ -6,9 +6,14 @@ use Doctrine\ORM\QueryBuilder; use Rb\Specification\Doctrine\AbstractSpecification; use Rb\Specification\Doctrine\Exception\InvalidArgumentException; +use Rb\Specification\Doctrine\Helper\ParameterTrait; +use Rb\Specification\Doctrine\Helper\ValueTrait; class Comparison extends AbstractSpecification { + use ParameterTrait; + use ValueTrait; + const EQ = '='; const NEQ = '<>'; const LT = '<'; @@ -22,11 +27,6 @@ class Comparison extends AbstractSpecification */ protected static $operators = [self::EQ, self::NEQ, self::LT, self::LTE, self::GT, self::GTE, self::LIKE]; - /** - * @var string - */ - protected $value; - /** * @var string */ @@ -53,7 +53,7 @@ public function __construct($operator, $field, $value, $dqlAlias = null) } $this->operator = $operator; - $this->value = $value; + $this->setValue($value); parent::__construct($field, $dqlAlias); } @@ -68,8 +68,8 @@ public function __construct($operator, $field, $value, $dqlAlias = null) */ public function modify(QueryBuilder $queryBuilder, $dqlAlias) { - $paramName = $this->generateParameterName($queryBuilder); - $queryBuilder->setParameter($paramName, $this->value); + $paramName = $this->generateParameterName($queryBuilder, 'comparison'); + $queryBuilder->setParameter($paramName, $this->getValue()); return (string) new DoctrineComparison( $this->createPropertyWithAlias($dqlAlias), @@ -77,16 +77,4 @@ public function modify(QueryBuilder $queryBuilder, $dqlAlias) sprintf(':%s', $paramName) ); } - - /** - * Return automatically generated parameter name. - * - * @param QueryBuilder $queryBuilder - * - * @return string - */ - protected function generateParameterName(QueryBuilder $queryBuilder) - { - return sprintf('comparison_%d', count($queryBuilder->getParameters())); - } } diff --git a/src/Condition/EqualsProperty.php b/src/Condition/EqualsProperty.php index 138f9f6..659d9cf 100644 --- a/src/Condition/EqualsProperty.php +++ b/src/Condition/EqualsProperty.php @@ -28,7 +28,7 @@ public function modify(QueryBuilder $queryBuilder, $dqlAlias) return (string) new DoctrineComparison( $this->createPropertyWithAlias($dqlAlias), $this->operator, - $this->createAliasedName($this->value, $dqlAlias) + $this->createAliasedName($this->getValue(), $dqlAlias) ); } } diff --git a/src/Condition/In.php b/src/Condition/In.php index ec77449..c0048e0 100644 --- a/src/Condition/In.php +++ b/src/Condition/In.php @@ -4,13 +4,13 @@ use Doctrine\ORM\QueryBuilder; use Rb\Specification\Doctrine\AbstractSpecification; +use Rb\Specification\Doctrine\Helper\ParameterTrait; +use Rb\Specification\Doctrine\Helper\ValueTrait; class In extends AbstractSpecification { - /** - * @var mixed - */ - protected $value; + use ParameterTrait; + use ValueTrait; /** * @param string $field @@ -19,7 +19,7 @@ class In extends AbstractSpecification */ public function __construct($field, $value, $dqlAlias = null) { - $this->value = $value; + $this->setValue($value); parent::__construct($field, $dqlAlias); } @@ -29,22 +29,12 @@ public function __construct($field, $value, $dqlAlias = null) */ public function modify(QueryBuilder $queryBuilder, $dqlAlias) { - $paramName = $this->generateParameterName($queryBuilder); - $queryBuilder->setParameter($paramName, $this->value); + $paramName = $this->generateParameterName($queryBuilder, 'in'); + $queryBuilder->setParameter($paramName, $this->getValue()); return (string) $queryBuilder->expr()->in( $this->createPropertyWithAlias($dqlAlias), sprintf(':%s', $paramName) ); } - - /** - * @param QueryBuilder $queryBuilder - * - * @return string - */ - protected function generateParameterName(QueryBuilder $queryBuilder) - { - return sprintf('in_%d', count($queryBuilder->getParameters())); - } } diff --git a/src/Condition/IsInstanceOf.php b/src/Condition/IsInstanceOf.php index 04f377d..5e65417 100644 --- a/src/Condition/IsInstanceOf.php +++ b/src/Condition/IsInstanceOf.php @@ -4,13 +4,11 @@ use Doctrine\ORM\QueryBuilder; use Rb\Specification\Doctrine\AbstractSpecification; +use Rb\Specification\Doctrine\Helper\ValueTrait; class IsInstanceOf extends AbstractSpecification { - /** - * @var string - */ - private $className; + use ValueTrait; /** * @param string $field @@ -19,7 +17,7 @@ class IsInstanceOf extends AbstractSpecification */ public function __construct($field, $className, $dqlAlias = null) { - $this->className = $className; + $this->setValue($className); parent::__construct($field, $dqlAlias); } @@ -31,7 +29,7 @@ public function modify(QueryBuilder $queryBuilder, $dqlAlias) { return (string) $queryBuilder->expr()->isInstanceOf( $this->createPropertyWithAlias($dqlAlias), - $this->className + $this->getValue() ); } } diff --git a/src/Condition/IsNotNull.php b/src/Condition/IsNotNull.php index 0d446d8..8e4b13c 100644 --- a/src/Condition/IsNotNull.php +++ b/src/Condition/IsNotNull.php @@ -3,8 +3,9 @@ namespace Rb\Specification\Doctrine\Condition; use Doctrine\ORM\QueryBuilder; +use Rb\Specification\Doctrine\AbstractSpecification; -class IsNotNull extends IsNull +class IsNotNull extends AbstractSpecification { /** * {@inheritdoc} diff --git a/src/Condition/NotIn.php b/src/Condition/NotIn.php index 77a5b47..7fbfe69 100644 --- a/src/Condition/NotIn.php +++ b/src/Condition/NotIn.php @@ -3,27 +3,35 @@ namespace Rb\Specification\Doctrine\Condition; use Doctrine\ORM\QueryBuilder; +use Rb\Specification\Doctrine\AbstractSpecification; +use Rb\Specification\Doctrine\Helper\ParameterTrait; +use Rb\Specification\Doctrine\Helper\ValueTrait; -class NotIn extends In +class NotIn extends AbstractSpecification { + use ValueTrait; + use ParameterTrait; + + /** + * @param string $field + * @param mixed $value + * @param string|null $dqlAlias + */ + public function __construct($field, $value, $dqlAlias = null) + { + $this->setValue($value); + + parent::__construct($field, $dqlAlias); + } + public function modify(QueryBuilder $queryBuilder, $dqlAlias) { - $paramName = $this->generateParameterName($queryBuilder); - $queryBuilder->setParameter($paramName, $this->value); + $paramName = $this->generateParameterName($queryBuilder, 'not_in'); + $queryBuilder->setParameter($paramName, $this->getValue()); return (string) $queryBuilder->expr()->notIn( $this->createPropertyWithAlias($dqlAlias), sprintf(':%s', $paramName) ); } - - /** - * @param QueryBuilder $queryBuilder - * - * @return string - */ - protected function generateParameterName(QueryBuilder $queryBuilder) - { - return sprintf('not_in_%d', count($queryBuilder->getParameters())); - } } diff --git a/src/Helper/ParameterTrait.php b/src/Helper/ParameterTrait.php new file mode 100644 index 0000000..292d4e3 --- /dev/null +++ b/src/Helper/ParameterTrait.php @@ -0,0 +1,25 @@ +getParameters())); + } +} diff --git a/src/Helper/TypeCheckerTrait.php b/src/Helper/TypeCheckerTrait.php new file mode 100644 index 0000000..8d75db6 --- /dev/null +++ b/src/Helper/TypeCheckerTrait.php @@ -0,0 +1,36 @@ +validTypes, true)) { + throw new InvalidArgumentException(sprintf( + '"%s" is not a valid type! Valid types: %s', + $type, + implode(', ', $this->validTypes) + )); + } + + $this->type = $type; + } +} diff --git a/src/Helper/ValueTrait.php b/src/Helper/ValueTrait.php new file mode 100644 index 0000000..8a2e0fe --- /dev/null +++ b/src/Helper/ValueTrait.php @@ -0,0 +1,27 @@ +value; + } + + /** + * @param mixed $value + */ + protected function setValue($value) + { + $this->value = $value; + } +} diff --git a/src/Query/GroupBy.php b/src/Query/GroupBy.php index 9b1515b..fee5b8e 100644 --- a/src/Query/GroupBy.php +++ b/src/Query/GroupBy.php @@ -4,21 +4,20 @@ use Doctrine\ORM\QueryBuilder; use Rb\Specification\Doctrine\AbstractSpecification; -use Rb\Specification\Doctrine\Exception\InvalidArgumentException; +use Rb\Specification\Doctrine\Helper\TypeCheckerTrait; /** * @author Kyle Tucker */ class GroupBy extends AbstractSpecification { + use TypeCheckerTrait; + const GROUP_BY = 'groupBy'; const ADD_GROUP_BY = 'addGroupBy'; /** @var string[] */ - protected static $types = [self::GROUP_BY, self::ADD_GROUP_BY]; - - /** @var string */ - protected $type; + protected $validTypes = [self::GROUP_BY, self::ADD_GROUP_BY]; /** * Constructor. @@ -45,22 +44,4 @@ public function modify(QueryBuilder $queryBuilder, $dqlAlias) ] ); } - - /** - * @param string $type - * - * @throws InvalidArgumentException - */ - public function setType($type) - { - if (! in_array($type, self::$types, true)) { - throw new InvalidArgumentException(sprintf( - '"%s" is not a valid type! Valid types: %s', - $type, - implode(', ', self::$types) - )); - } - - $this->type = $type; - } } diff --git a/src/Query/Select.php b/src/Query/Select.php index 449c74c..196ef9c 100644 --- a/src/Query/Select.php +++ b/src/Query/Select.php @@ -3,7 +3,7 @@ namespace Rb\Specification\Doctrine\Query; use Doctrine\ORM\QueryBuilder; -use Rb\Specification\Doctrine\Exception\InvalidArgumentException; +use Rb\Specification\Doctrine\Helper\TypeCheckerTrait; use Rb\Specification\Doctrine\SpecificationInterface; /** @@ -11,21 +11,18 @@ */ class Select implements SpecificationInterface { + use TypeCheckerTrait; + const SELECT = 'select'; const ADD_SELECT = 'addSelect'; - protected static $types = [self::SELECT, self::ADD_SELECT]; + protected $validTypes = [self::SELECT, self::ADD_SELECT]; /** * @var string|array */ protected $select; - /** - * @var string - */ - protected $type; - /** * @param string|array $select * @param string $type @@ -44,24 +41,6 @@ public function modify(QueryBuilder $queryBuilder, $dqlAlias) call_user_func_array([$queryBuilder, $this->type], [$this->select]); } - /** - * @param string $type - * - * @throws InvalidArgumentException - */ - public function setType($type) - { - if (! in_array($type, self::$types, true)) { - throw new InvalidArgumentException(sprintf( - '"%s" is not a valid type! Valid types: %s', - $type, - implode(', ', self::$types) - )); - } - - $this->type = $type; - } - /** * {@inheritdoc} */