From ef9a08c691ed2a765a77a49918a696f2f4856ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Leherpeur?= Date: Thu, 28 Jun 2018 21:11:52 +0200 Subject: [PATCH 1/4] WhereFilter - First implementation try --- .../Doctrine/Orm/Filter/WhereFilter.php | 89 +++++++++++++++++++ .../WhereFilter/Condition/AndCondition.php | 36 ++++++++ .../Condition/ConditionInterface.php | 12 +++ .../WhereFilter/Condition/EqCondition.php | 37 ++++++++ .../WhereFilter/Condition/GtCondition.php | 37 ++++++++ .../WhereFilter/Condition/GteCondition.php | 37 ++++++++ .../WhereFilter/Condition/LtCondition.php | 37 ++++++++ .../WhereFilter/Condition/LteCondition.php | 37 ++++++++ .../WhereFilter/Condition/NeqCondition.php | 37 ++++++++ .../WhereFilter/Condition/OrCondition.php | 36 ++++++++ .../Doctrine/Orm/Filter/WhereFilter/Where.php | 47 ++++++++++ 11 files changed, 442 insertions(+) create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php create mode 100644 src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php new file mode 100644 index 00000000000..44a598fc386 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php @@ -0,0 +1,89 @@ +requestStack = $requestStack; + } + + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null) + { + if (null === $request = $this->requestStack->getCurrentRequest()) { + return; + } + + if (null === $whereData = $request->query->get(self::QUERY_STRING_WHERE)) { + return; + } + + $rootAlias = $queryBuilder->getRootAliases()[0]; + $where = $this->buildWhereFromArray($rootAlias, $whereData); + + $where->apply($queryBuilder); + } + + public function getDescription(string $resourceClass): array + { + return []; // TODO + } + + public function buildWhereFromArray(string $alias, array $whereArray): Where + { + $where = new Where(); + foreach ($whereArray as $conditionType => $conditionArray) { + $type = array_keys($conditionArray)[0]; + + switch (true) { + case $conditionType === AndCondition::TYPE: + $conditions = $this->buildWhereFromArray($alias, $conditionArray)->getConditions(); + $where->addCondition(new AndCondition(...$conditions)); + break; + case $conditionType === OrCondition::TYPE: + $conditions = $this->buildWhereFromArray($alias, $conditionArray)->getConditions(); + $where->addCondition(new OrCondition(...$conditions)); + break; + case $type === EqCondition::TYPE: + $where->addCondition(new EqCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); + break; + case $type === NeqCondition::TYPE: + $where->addCondition(new NeqCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); + break; + case $type === GtCondition::TYPE: + $where->addCondition(new GtCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); + break; + case $type === GteCondition::TYPE: + $where->addCondition(new GteCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); + break; + case $type === LtCondition::TYPE: + $where->addCondition(new LtCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); + break; + case $type === LteCondition::TYPE: + $where->addCondition(new LteCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); + break; + } + } + + return $where; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php new file mode 100644 index 00000000000..b2221597535 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php @@ -0,0 +1,36 @@ +conditions = $conditions ?? []; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $and = $expr->andX(); + + foreach ($this->conditions as $condition) { + $and->add($condition->apply($expr)); + } + + return $and; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php new file mode 100644 index 00000000000..8ea46a50759 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php @@ -0,0 +1,12 @@ +key = $key; + $this->values = $values; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + foreach ($this->values as $value) { + $or->add( + $expr->eq($this->key, $expr->literal($value)) + ); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php new file mode 100644 index 00000000000..2adeec10761 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php @@ -0,0 +1,37 @@ +key = $key; + $this->values = $values; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + foreach ($this->values as $value) { + $or->add( + $expr->gt($this->key, $expr->literal($value)) + ); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php new file mode 100644 index 00000000000..cbe9ea60ed2 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php @@ -0,0 +1,37 @@ +key = $key; + $this->values = $values; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + foreach ($this->values as $value) { + $or->add( + $expr->gte($this->key, $expr->literal($value)) + ); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php new file mode 100644 index 00000000000..8a713e810ce --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php @@ -0,0 +1,37 @@ +key = $key; + $this->values = $values; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + foreach ($this->values as $value) { + $or->add( + $expr->lt($this->key, $expr->literal($value)) + ); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php new file mode 100644 index 00000000000..a7ac78acc9a --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php @@ -0,0 +1,37 @@ +key = $key; + $this->values = $values; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + foreach ($this->values as $value) { + $or->add( + $expr->lte($this->key, $expr->literal($value)) + ); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php new file mode 100644 index 00000000000..8d549181032 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php @@ -0,0 +1,37 @@ +key = $key; + $this->values = $values; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + foreach ($this->values as $value) { + $or->add( + $expr->neq($this->key, $expr->literal($value)) + ); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php new file mode 100644 index 00000000000..5b43e34e607 --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php @@ -0,0 +1,36 @@ +conditions = $conditions ?? []; + } + + public function getType(): string + { + return self::TYPE; + } + + public function apply(Expr $expr) + { + $or = $expr->orX(); + + foreach ($this->conditions as $condition) { + $or->add($condition->apply($expr)); + } + + return $or; + } +} diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php new file mode 100644 index 00000000000..d3ed8ce7ada --- /dev/null +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php @@ -0,0 +1,47 @@ +conditions = $conditions ?? []; + } + + /** + * @return ConditionInterface[] + */ + public function getConditions(): array + { + return array_values($this->conditions); + } + + public function addCondition(ConditionInterface $condition): void + { + if (isset($this->conditions[$condition->getType()])) { + $currentCondition = $this->conditions[$condition->getType()]; + unset($this->conditions[$condition->getType()]); + $condition = new AndCondition($currentCondition, $condition); + } + + $this->conditions[$condition->getType()] = $condition; + } + + public function apply(QueryBuilder $queryBuilder) + { + foreach ($this->conditions as $condition) { + $expr = $queryBuilder->expr(); + $queryBuilder->andWhere($condition->apply($expr)); + } + } +} From ebcb9f64f8cc4cf43df53748b48d886a44c316c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Leherpeur?= Date: Fri, 29 Jun 2018 10:01:48 +0200 Subject: [PATCH 2/4] CS Fix + First Review --- .../Doctrine/Orm/Filter/WhereFilter.php | 54 +++++++++---------- .../WhereFilter/Condition/AndCondition.php | 20 +++++-- .../Condition/ConditionInterface.php | 16 +++++- .../WhereFilter/Condition/EqCondition.php | 20 +++++-- .../WhereFilter/Condition/GtCondition.php | 24 ++++++--- .../WhereFilter/Condition/GteCondition.php | 24 ++++++--- .../WhereFilter/Condition/LtCondition.php | 24 ++++++--- .../WhereFilter/Condition/LteCondition.php | 24 ++++++--- .../WhereFilter/Condition/NeqCondition.php | 24 ++++++--- .../WhereFilter/Condition/OrCondition.php | 23 +++++--- .../Doctrine/Orm/Filter/WhereFilter/Where.php | 13 ++++- 11 files changed, 192 insertions(+), 74 deletions(-) diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php index 44a598fc386..4293ab2096c 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php @@ -1,13 +1,19 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Where; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface; -use Doctrine\ORM\QueryBuilder; -use Symfony\Component\HttpFoundation\RequestStack; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\AndCondition; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\ConditionInterface; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\EqCondition; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\GtCondition; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\GteCondition; @@ -15,25 +21,19 @@ use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\LteCondition; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\NeqCondition; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\OrCondition; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Where; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface; +use Doctrine\ORM\QueryBuilder; -class WhereFilter implements FilterInterface +final class WhereFilter implements ContextAwareFilterInterface { - private const QUERY_STRING_WHERE = 'where'; - - protected $requestStack; - - public function __construct(RequestStack $requestStack) - { - $this->requestStack = $requestStack; - } - - public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null) + public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null, array $context = []) { - if (null === $request = $this->requestStack->getCurrentRequest()) { + if (null === $filters = $context['filters']) { return; } - if (null === $whereData = $request->query->get(self::QUERY_STRING_WHERE)) { + if (null === $whereData = $filters['where']) { return; } @@ -54,31 +54,31 @@ public function buildWhereFromArray(string $alias, array $whereArray): Where foreach ($whereArray as $conditionType => $conditionArray) { $type = array_keys($conditionArray)[0]; - switch (true) { - case $conditionType === AndCondition::TYPE: + switch ($type) { + case AndCondition::TYPE: $conditions = $this->buildWhereFromArray($alias, $conditionArray)->getConditions(); $where->addCondition(new AndCondition(...$conditions)); break; - case $conditionType === OrCondition::TYPE: + case OrCondition::TYPE: $conditions = $this->buildWhereFromArray($alias, $conditionArray)->getConditions(); $where->addCondition(new OrCondition(...$conditions)); break; - case $type === EqCondition::TYPE: + case EqCondition::TYPE: $where->addCondition(new EqCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); break; - case $type === NeqCondition::TYPE: + case NeqCondition::TYPE: $where->addCondition(new NeqCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); break; - case $type === GtCondition::TYPE: + case GtCondition::TYPE: $where->addCondition(new GtCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); break; - case $type === GteCondition::TYPE: + case GteCondition::TYPE: $where->addCondition(new GteCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); break; - case $type === LtCondition::TYPE: + case LtCondition::TYPE: $where->addCondition(new LtCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); break; - case $type === LteCondition::TYPE: + case LteCondition::TYPE: $where->addCondition(new LteCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); break; } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php index b2221597535..2154e2d93fd 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php @@ -1,10 +1,22 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class AndCondition implements ConditionInterface +final class AndCondition implements ConditionInterface { public const TYPE = 'and'; @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $and = $expr->andX(); + $and = $queryBuilder->expr()->andX(); foreach ($this->conditions as $condition) { - $and->add($condition->apply($expr)); + $and->add($condition->apply($queryBuilder)); } return $and; diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php index 8ea46a50759..ebb554a1fb0 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/ConditionInterface.php @@ -1,12 +1,24 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; -use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\Query\Expr\Composite; +use Doctrine\ORM\QueryBuilder; interface ConditionInterface { public function getType(): string; - public function apply(Expr $expr); + public function apply(QueryBuilder $queryBuilder): Composite; } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php index 89e16dae4c8..91fafd12769 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php @@ -1,10 +1,22 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class EqCondition implements ConditionInterface +final class EqCondition implements ConditionInterface { public const TYPE = 'eq'; @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); + $or = $queryBuilder->expr()->orX(); foreach ($this->values as $value) { $or->add( - $expr->eq($this->key, $expr->literal($value)) + $queryBuilder->expr()->eq($this->key, $queryBuilder->expr()->literal($value)) ); } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php index 2adeec10761..398821411b7 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GtCondition.php @@ -1,16 +1,28 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class GtCondition implements ConditionInterface +final class GtCondition implements ConditionInterface { public const TYPE = 'gt'; - protected $key; + private $key; - protected $values; + private $values; public function __construct(string $key, array $values) { @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); + $or = $queryBuilder->expr()->orX(); foreach ($this->values as $value) { $or->add( - $expr->gt($this->key, $expr->literal($value)) + $queryBuilder->expr()->gt($this->key, $queryBuilder->expr()->literal($value)) ); } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php index cbe9ea60ed2..22c25a4b720 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/GteCondition.php @@ -1,16 +1,28 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class GteCondition implements ConditionInterface +final class GteCondition implements ConditionInterface { public const TYPE = 'gte'; - protected $key; + private $key; - protected $values; + private $values; public function __construct(string $key, array $values) { @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); + $or = $queryBuilder->expr()->orX(); foreach ($this->values as $value) { $or->add( - $expr->gte($this->key, $expr->literal($value)) + $queryBuilder->expr()->gte($this->key, $queryBuilder->expr()->literal($value)) ); } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php index 8a713e810ce..6b2a5d62966 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LtCondition.php @@ -1,16 +1,28 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class LtCondition implements ConditionInterface +final class LtCondition implements ConditionInterface { public const TYPE = 'lt'; - protected $key; + private $key; - protected $values; + private $values; public function __construct(string $key, array $values) { @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); + $or = $queryBuilder->expr()->orX(); foreach ($this->values as $value) { $or->add( - $expr->lt($this->key, $expr->literal($value)) + $queryBuilder->expr()->lt($this->key, $queryBuilder->expr()->literal($value)) ); } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php index a7ac78acc9a..ca56048c0de 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/LteCondition.php @@ -1,16 +1,28 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class LteCondition implements ConditionInterface +final class LteCondition implements ConditionInterface { public const TYPE = 'lte'; - protected $key; + private $key; - protected $values; + private $values; public function __construct(string $key, array $values) { @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); + $or = $queryBuilder->expr()->orX(); foreach ($this->values as $value) { $or->add( - $expr->lte($this->key, $expr->literal($value)) + $queryBuilder->expr()->lte($this->key, $queryBuilder->expr()->literal($value)) ); } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php index 8d549181032..14f0bf1bc98 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/NeqCondition.php @@ -1,16 +1,28 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class NeqCondition implements ConditionInterface +final class NeqCondition implements ConditionInterface { public const TYPE = 'neq'; - protected $key; + private $key; - protected $values; + private $values; public function __construct(string $key, array $values) { @@ -23,12 +35,12 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); + $or = $queryBuilder->expr()->orX(); foreach ($this->values as $value) { $or->add( - $expr->neq($this->key, $expr->literal($value)) + $queryBuilder->expr()->neq($this->key, $queryBuilder->expr()->literal($value)) ); } diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php index 5b43e34e607..5941cb979af 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php @@ -1,17 +1,29 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition; use Doctrine\ORM\Query\Expr; +use Doctrine\ORM\QueryBuilder; -class OrCondition implements ConditionInterface +final class OrCondition implements ConditionInterface { public const TYPE = 'or'; /** * @var ConditionInterface[] */ - protected $conditions; + private $conditions; public function __construct(ConditionInterface ...$conditions) { @@ -23,12 +35,11 @@ public function getType(): string return self::TYPE; } - public function apply(Expr $expr) + public function apply(QueryBuilder $queryBuilder): Expr\Composite { - $or = $expr->orX(); - + $or = $queryBuilder->expr()->orX(); foreach ($this->conditions as $condition) { - $or->add($condition->apply($expr)); + $or->add($condition->apply($queryBuilder)); } return $or; diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php index d3ed8ce7ada..4d41ba1ea90 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php @@ -1,12 +1,23 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\AndCondition; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\WhereFilter\Condition\ConditionInterface; use Doctrine\ORM\QueryBuilder; -class Where +final class Where { /** * @var ConditionInterface[] From 092fb2d01acc11e2dddce8c94436f9a0e8897737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Leherpeur?= Date: Fri, 29 Jun 2018 10:08:39 +0200 Subject: [PATCH 3/4] Remove iterators --- src/Bridge/Doctrine/Orm/Filter/WhereFilter.php | 4 ++-- .../Filter/WhereFilter/Condition/AndCondition.php | 6 +++--- .../Orm/Filter/WhereFilter/Condition/OrCondition.php | 4 ++-- src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php | 12 +++--------- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php index 4293ab2096c..a189f39156e 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter.php @@ -57,11 +57,11 @@ public function buildWhereFromArray(string $alias, array $whereArray): Where switch ($type) { case AndCondition::TYPE: $conditions = $this->buildWhereFromArray($alias, $conditionArray)->getConditions(); - $where->addCondition(new AndCondition(...$conditions)); + $where->addCondition(new AndCondition($conditions)); break; case OrCondition::TYPE: $conditions = $this->buildWhereFromArray($alias, $conditionArray)->getConditions(); - $where->addCondition(new OrCondition(...$conditions)); + $where->addCondition(new OrCondition($conditions)); break; case EqCondition::TYPE: $where->addCondition(new EqCondition($alias.'.'.$conditionType, (array) $conditionArray[$type])); diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php index 2154e2d93fd..2a3846e507f 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/AndCondition.php @@ -23,11 +23,11 @@ final class AndCondition implements ConditionInterface /** * @var ConditionInterface[] */ - protected $conditions; + private $conditions; - public function __construct(ConditionInterface ...$conditions) + public function __construct(array $conditions) { - $this->conditions = $conditions ?? []; + $this->conditions = $conditions; } public function getType(): string diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php index 5941cb979af..db89ebd2d35 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/OrCondition.php @@ -25,9 +25,9 @@ final class OrCondition implements ConditionInterface */ private $conditions; - public function __construct(ConditionInterface ...$conditions) + public function __construct(array $conditions) { - $this->conditions = $conditions ?? []; + $this->conditions = $conditions; } public function getType(): string diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php index 4d41ba1ea90..2fb09da5b7a 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Where.php @@ -22,12 +22,7 @@ final class Where /** * @var ConditionInterface[] */ - protected $conditions; - - public function __construct(?ConditionInterface ...$conditions) - { - $this->conditions = $conditions ?? []; - } + private $conditions = []; /** * @return ConditionInterface[] @@ -42,7 +37,7 @@ public function addCondition(ConditionInterface $condition): void if (isset($this->conditions[$condition->getType()])) { $currentCondition = $this->conditions[$condition->getType()]; unset($this->conditions[$condition->getType()]); - $condition = new AndCondition($currentCondition, $condition); + $condition = new AndCondition([$currentCondition, $condition]); } $this->conditions[$condition->getType()] = $condition; @@ -51,8 +46,7 @@ public function addCondition(ConditionInterface $condition): void public function apply(QueryBuilder $queryBuilder) { foreach ($this->conditions as $condition) { - $expr = $queryBuilder->expr(); - $queryBuilder->andWhere($condition->apply($expr)); + $queryBuilder->andWhere($condition->apply($queryBuilder)); } } } From 39ee8093801ecd28ef3c32f544b6f3281c636a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Leherpeur?= Date: Fri, 29 Jun 2018 10:10:53 +0200 Subject: [PATCH 4/4] CS Fix --- .../Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php index 91fafd12769..d6145b30847 100644 --- a/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php +++ b/src/Bridge/Doctrine/Orm/Filter/WhereFilter/Condition/EqCondition.php @@ -20,9 +20,9 @@ final class EqCondition implements ConditionInterface { public const TYPE = 'eq'; - protected $key; + private $key; - protected $values; + private $values; public function __construct(string $key, array $values) {