diff --git a/composer.json b/composer.json index e3a1c9fbf..9e87ac361 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "doctrine/doctrine-bundle": "^2.3", "doctrine/orm": "^2.5", "doctrine/persistence": "^2.0", - "sonata-project/admin-bundle": "^4.0@alpha", + "sonata-project/admin-bundle": "dev-master", "sonata-project/exporter": "^2.0", "sonata-project/form-extensions": "^1.4", "symfony/config": "^4.4 || ^5.2", diff --git a/src/Filter/AbstractDateFilter.php b/src/Filter/AbstractDateFilter.php index 5f1290f5c..aa8076bbc 100644 --- a/src/Filter/AbstractDateFilter.php +++ b/src/Filter/AbstractDateFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DateRangeType; use Sonata\AdminBundle\Form\Type\Filter\DateTimeRangeType; use Sonata\AdminBundle\Form\Type\Filter\DateTimeType; @@ -45,25 +46,27 @@ abstract class AbstractDateFilter extends Filter */ protected $time = false; - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { // check data sanity - if (!\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } + $value = $data->getValue(); + if ($this->range) { // additional data check for ranged items - if (!\array_key_exists('start', $data['value']) || !\array_key_exists('end', $data['value'])) { + if (!\array_key_exists('start', $value) || !\array_key_exists('end', $value)) { return; } - if (!$data['value']['start'] && !$data['value']['end']) { + if (!$value['start'] && !$value['end']) { return; } // date filter should filter records for the whole days - if (false === $this->time && ($data['value']['end'] instanceof \DateTime || $data['value']['end'] instanceof \DateTimeImmutable)) { + if (false === $this->time && ($value['end'] instanceof \DateTime || $value['end'] instanceof \DateTimeImmutable)) { // since the received `\DateTime` object uses the model timezone to represent // the value submitted by the view (which can use a different timezone) and this // value is intended to contain a time in the begining of a date (IE, if the model @@ -71,69 +74,69 @@ public function filter(ProxyQueryInterface $query, string $alias, string $field, // is transformed to "2020-11-07 03:00:00.0+00:00" in the model object), we increment // the time part by adding "23:59:59" in order to cover the whole end date and get proper // results from queries like "o.created_at <= :date_end". - $data['value']['end'] = $data['value']['end']->modify('+23 hours 59 minutes 59 seconds'); + $value['end'] = $value['end']->modify('+23 hours 59 minutes 59 seconds'); } // transform types if ('timestamp' === $this->getOption('input_type')) { - $data['value']['start'] = $data['value']['start'] instanceof \DateTimeInterface ? $data['value']['start']->getTimestamp() : 0; - $data['value']['end'] = $data['value']['end'] instanceof \DateTimeInterface ? $data['value']['end']->getTimestamp() : 0; + $value['start'] = $value['start'] instanceof \DateTimeInterface ? $value['start']->getTimestamp() : 0; + $value['end'] = $value['end'] instanceof \DateTimeInterface ? $value['end']->getTimestamp() : 0; } // default type for range filter - $data['type'] = !isset($data['type']) || !is_numeric($data['type']) ? DateRangeOperatorType::TYPE_BETWEEN : $data['type']; + $type = $data->getType() ?? DateRangeOperatorType::TYPE_BETWEEN; $startDateParameterName = $this->getNewParameterName($query); $endDateParameterName = $this->getNewParameterName($query); - if (DateRangeOperatorType::TYPE_NOT_BETWEEN === $data['type']) { + if (DateRangeOperatorType::TYPE_NOT_BETWEEN === $type) { $this->applyWhere($query, sprintf('%s.%s < :%s OR %s.%s > :%s', $alias, $field, $startDateParameterName, $alias, $field, $endDateParameterName)); } else { - if ($data['value']['start']) { + if ($value['start']) { $this->applyWhere($query, sprintf('%s.%s %s :%s', $alias, $field, '>=', $startDateParameterName)); } - if ($data['value']['end']) { + if ($value['end']) { $this->applyWhere($query, sprintf('%s.%s %s :%s', $alias, $field, '<=', $endDateParameterName)); } } - if ($data['value']['start']) { - $query->getQueryBuilder()->setParameter($startDateParameterName, $data['value']['start']); + if ($value['start']) { + $query->getQueryBuilder()->setParameter($startDateParameterName, $value['start']); } - if ($data['value']['end']) { - $query->getQueryBuilder()->setParameter($endDateParameterName, $data['value']['end']); + if ($value['end']) { + $query->getQueryBuilder()->setParameter($endDateParameterName, $value['end']); } } else { - if (!$data['value']) { + if (!$value) { return; } // default type for simple filter - $data['type'] = $data['type'] ?? DateOperatorType::TYPE_EQUAL; + $type = $data->getType() ?? DateOperatorType::TYPE_EQUAL; // just find an operator and apply query - $operator = $this->getOperator($data['type']); + $operator = $this->getOperator($type); // transform types if ('timestamp' === $this->getOption('input_type')) { - $data['value'] = $data['value'] instanceof \DateTimeInterface ? $data['value']->getTimestamp() : 0; + $value = $value instanceof \DateTimeInterface ? $value->getTimestamp() : 0; } $parameterName = $this->getNewParameterName($query); // date filter should filter records for the whole day - if (false === $this->time && DateOperatorType::TYPE_EQUAL === $data['type']) { + if (false === $this->time && DateOperatorType::TYPE_EQUAL === $type) { $this->applyWhere($query, sprintf('%s.%s %s :%s', $alias, $field, '>=', $parameterName)); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $value); $endDateParameterName = $this->getNewParameterName($query); $this->applyWhere($query, sprintf('%s.%s %s :%s', $alias, $field, '<', $endDateParameterName)); if ('timestamp' === $this->getOption('input_type')) { - $endValue = strtotime('+1 day', $data['value']); + $endValue = strtotime('+1 day', $value); } else { - $endValue = clone $data['value']; + $endValue = clone $value; $endValue->add(new \DateInterval('P1D')); } $query->getQueryBuilder()->setParameter($endDateParameterName, $endValue); @@ -142,7 +145,7 @@ public function filter(ProxyQueryInterface $query, string $alias, string $field, } $this->applyWhere($query, sprintf('%s.%s %s :%s', $alias, $field, $operator, $parameterName)); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $value); } } diff --git a/src/Filter/BooleanFilter.php b/src/Filter/BooleanFilter.php index b6dea9817..4db5f4faa 100644 --- a/src/Filter/BooleanFilter.php +++ b/src/Filter/BooleanFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; use Sonata\Form\Type\BooleanType; @@ -20,15 +21,17 @@ final class BooleanFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('type', $data) || !\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - if (\is_array($data['value'])) { + $value = $data->getValue(); + + if (\is_array($value)) { $values = []; - foreach ($data['value'] as $v) { + foreach ($value as $v) { if (!\in_array($v, [BooleanType::TYPE_NO, BooleanType::TYPE_YES], true)) { continue; } @@ -42,13 +45,13 @@ public function filter(ProxyQueryInterface $query, string $alias, string $field, $this->applyWhere($query, $query->getQueryBuilder()->expr()->in(sprintf('%s.%s', $alias, $field), $values)); } else { - if (!\in_array($data['value'], [BooleanType::TYPE_NO, BooleanType::TYPE_YES], true)) { + if (!\in_array($value, [BooleanType::TYPE_NO, BooleanType::TYPE_YES], true)) { return; } $parameterName = $this->getNewParameterName($query); $this->applyWhere($query, sprintf('%s.%s = :%s', $alias, $field, $parameterName)); - $query->getQueryBuilder()->setParameter($parameterName, (BooleanType::TYPE_YES === $data['value']) ? 1 : 0); + $query->getQueryBuilder()->setParameter($parameterName, (BooleanType::TYPE_YES === $value) ? 1 : 0); } } diff --git a/src/Filter/CallbackFilter.php b/src/Filter/CallbackFilter.php index 704f20163..b7796a7bd 100644 --- a/src/Filter/CallbackFilter.php +++ b/src/Filter/CallbackFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; use Symfony\Component\Form\Extension\Core\Type\HiddenType; @@ -20,7 +21,7 @@ final class CallbackFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { if (!\is_callable($this->getOption('callback'))) { throw new \RuntimeException(sprintf('Please provide a valid callback option "filter" for field "%s"', $this->getName())); @@ -58,7 +59,7 @@ public function getRenderSettings(): array ]]; } - protected function association(ProxyQueryInterface $query, array $data): array + protected function association(ProxyQueryInterface $query, FilterData $data): array { $alias = $query->entityJoin($this->getParentAssociationMappings()); diff --git a/src/Filter/ChoiceFilter.php b/src/Filter/ChoiceFilter.php index 244b45227..b1c51e7d1 100644 --- a/src/Filter/ChoiceFilter.php +++ b/src/Filter/ChoiceFilter.php @@ -13,19 +13,20 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; final class ChoiceFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('type', $data) || !\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - if (\is_array($data['value'])) { + if (\is_array($data->getValue())) { $this->filterWithMultipleValues($query, $alias, $field, $data); } else { $this->filterWithSingleValue($query, $alias, $field, $data); @@ -51,23 +52,18 @@ public function getRenderSettings(): array ]]; } - /** - * @param mixed[] $data - * - * @phpstan-param array{type: int|null, value: mixed} $data - */ - private function filterWithMultipleValues(ProxyQueryInterface $query, string $alias, string $field, array $data): void + private function filterWithMultipleValues(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (0 === \count($data['value'])) { + if (0 === \count($data->getValue())) { return; } - $isNullSelected = \in_array(null, $data['value'], true); + $isNullSelected = \in_array(null, $data->getValue(), true); $completeField = sprintf('%s.%s', $alias, $field); $parameterName = $this->getNewParameterName($query); $or = $query->getQueryBuilder()->expr()->orX(); - if (EqualOperatorType::TYPE_NOT_EQUAL === $data['type']) { + if ($data->isType(EqualOperatorType::TYPE_NOT_EQUAL)) { $or->add($query->getQueryBuilder()->expr()->notIn($completeField, ':'.$parameterName)); if (!$isNullSelected) { @@ -82,39 +78,34 @@ private function filterWithMultipleValues(ProxyQueryInterface $query, string $al } $this->applyWhere($query, $or); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } - /** - * @param mixed[] $data - * - * @phpstan-param array{type: int|null, value: mixed} $data - */ - private function filterWithSingleValue(ProxyQueryInterface $query, string $alias, string $field, array $data): void + private function filterWithSingleValue(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if ('' === $data['value'] || false === $data['value']) { + if ('' === $data->getValue() || false === $data->getValue()) { return; } $parameterName = $this->getNewParameterName($query); $completeField = sprintf('%s.%s', $alias, $field); - if (EqualOperatorType::TYPE_NOT_EQUAL === $data['type']) { - if (null === $data['value']) { + if ($data->isType(EqualOperatorType::TYPE_NOT_EQUAL)) { + if (null === $data->getValue()) { $this->applyWhere($query, $query->getQueryBuilder()->expr()->isNotNull($completeField)); } else { $this->applyWhere( $query, sprintf('%s != :%s OR %s IS NULL', $completeField, $parameterName, $completeField) ); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } } else { - if (null === $data['value']) { + if (null === $data->getValue()) { $this->applyWhere($query, $query->getQueryBuilder()->expr()->isNull($completeField)); } else { $this->applyWhere($query, sprintf('%s = :%s', $completeField, $parameterName)); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } } } diff --git a/src/Filter/ClassFilter.php b/src/Filter/ClassFilter.php index e2f5c8c5e..739b36103 100644 --- a/src/Filter/ClassFilter.php +++ b/src/Filter/ClassFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; @@ -25,20 +26,20 @@ final class ClassFilter extends Filter EqualOperatorType::TYPE_NOT_EQUAL => 'NOT INSTANCE OF', ]; - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - if (0 === \strlen($data['value'])) { + if (0 === \strlen($data->getValue())) { return; } - $type = $data['type'] ?? EqualOperatorType::TYPE_EQUAL; + $type = $data->getType() ?? EqualOperatorType::TYPE_EQUAL; $operator = $this->getOperator($type); - $this->applyWhere($query, sprintf('%s %s %s', $alias, $operator, $data['value'])); + $this->applyWhere($query, sprintf('%s %s %s', $alias, $operator, $data->getValue())); } public function getDefaultOptions(): array diff --git a/src/Filter/CountFilter.php b/src/Filter/CountFilter.php index f5d8a94b3..609366a97 100644 --- a/src/Filter/CountFilter.php +++ b/src/Filter/CountFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\NumberType; use Sonata\AdminBundle\Form\Type\Operator\NumberOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; @@ -28,13 +29,13 @@ final class CountFilter extends Filter NumberOperatorType::TYPE_LESS_THAN => '<', ]; - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data) || !is_numeric($data['value'])) { + if (!$data->hasValue() || !is_numeric($data->getValue())) { return; } - $type = $data['type'] ?? NumberOperatorType::TYPE_EQUAL; + $type = $data->getType() ?? NumberOperatorType::TYPE_EQUAL; $operator = $this->getOperator($type); // c.name > '1' => c.name OPERATOR :FIELDNAME @@ -42,7 +43,7 @@ public function filter(ProxyQueryInterface $query, string $alias, string $field, $rootAlias = current($query->getQueryBuilder()->getRootAliases()); $query->getQueryBuilder()->addGroupBy($rootAlias); $this->applyHaving($query, sprintf('COUNT(%s.%s) %s :%s', $alias, $field, $operator, $parameterName)); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } public function getDefaultOptions(): array diff --git a/src/Filter/Filter.php b/src/Filter/Filter.php index dd57325c9..a6092e145 100644 --- a/src/Filter/Filter.php +++ b/src/Filter/Filter.php @@ -16,6 +16,7 @@ use Doctrine\ORM\Query\Expr\Orx; use Sonata\AdminBundle\Datagrid\ProxyQueryInterface as BaseProxyQueryInterface; use Sonata\AdminBundle\Filter\Filter as BaseFilter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; abstract class Filter extends BaseFilter @@ -35,20 +36,16 @@ abstract class Filter extends BaseFilter /** * Apply the filter to the QueryBuilder instance. - * - * @param mixed[] $data - * - * @phpstan-param array{type?: int|null, value?: mixed} $data */ - abstract public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void; + abstract public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void; - public function apply(BaseProxyQueryInterface $query, array $filterData): void + public function apply(BaseProxyQueryInterface $query, FilterData $filterData): void { if (!$query instanceof ProxyQueryInterface) { throw new \TypeError(sprintf('The query MUST implement %s.', ProxyQueryInterface::class)); } - if (\array_key_exists('value', $filterData)) { + if ($filterData->hasValue()) { [$alias, $field] = $this->association($query, $filterData); $this->filter($query, $alias, $field, $filterData); @@ -61,14 +58,10 @@ public function isActive(): bool } /** - * @param mixed[] $data - * * @return string[] - * - * @phpstan-param array{type?: int|null, value?: mixed} $data * @phpstan-return array{string, string} */ - protected function association(ProxyQueryInterface $query, array $data): array + protected function association(ProxyQueryInterface $query, FilterData $data): array { $alias = $query->entityJoin($this->getParentAssociationMappings()); diff --git a/src/Filter/ModelAutocompleteFilter.php b/src/Filter/ModelAutocompleteFilter.php index a8e9c4a1d..ecc16ecf4 100644 --- a/src/Filter/ModelAutocompleteFilter.php +++ b/src/Filter/ModelAutocompleteFilter.php @@ -14,6 +14,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; use Doctrine\Common\Collections\Collection; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\AdminBundle\Form\Type\ModelAutocompleteType; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; @@ -21,17 +22,19 @@ final class ModelAutocompleteFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - if ($data['value'] instanceof Collection) { - $data['value'] = $data['value']->toArray(); + $value = $data->getValue(); + + if ($value instanceof Collection) { + $data = $data->changeValue($value->toArray()); } - if (\is_array($data['value'])) { + if (\is_array($data->getValue())) { $this->handleMultiple($query, $alias, $data); } else { $this->handleModel($query, $alias, $data); @@ -63,47 +66,42 @@ public function getRenderSettings(): array /** * For the record, the $alias value is provided by the association method (and the entity join method) * so the field value is not used here. - * - * @param mixed[] $data */ - protected function handleMultiple(ProxyQueryInterface $query, string $alias, array $data): void + protected function handleMultiple(ProxyQueryInterface $query, string $alias, FilterData $data): void { - if (0 === \count($data['value'])) { + if (0 === \count($data->getValue())) { return; } $parameterName = $this->getNewParameterName($query); - if (isset($data['type']) && EqualOperatorType::TYPE_NOT_EQUAL === $data['type']) { + if ($data->isType(EqualOperatorType::TYPE_NOT_EQUAL)) { $this->applyWhere($query, $query->getQueryBuilder()->expr()->notIn($alias, ':'.$parameterName)); } else { $this->applyWhere($query, $query->getQueryBuilder()->expr()->in($alias, ':'.$parameterName)); } - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } - /** - * @param mixed[] $data - */ - protected function handleModel(ProxyQueryInterface $query, string $alias, array $data): void + protected function handleModel(ProxyQueryInterface $query, string $alias, FilterData $data): void { - if (empty($data['value'])) { + if (empty($data->getValue())) { return; } $parameterName = $this->getNewParameterName($query); - if (isset($data['type']) && EqualOperatorType::TYPE_NOT_EQUAL === $data['type']) { + if ($data->isType(EqualOperatorType::TYPE_NOT_EQUAL)) { $this->applyWhere($query, sprintf('%s != :%s', $alias, $parameterName)); } else { $this->applyWhere($query, sprintf('%s = :%s', $alias, $parameterName)); } - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } - protected function association(ProxyQueryInterface $query, array $data): array + protected function association(ProxyQueryInterface $query, FilterData $data): array { $associationMappings = $this->getParentAssociationMappings(); $associationMappings[] = $this->getAssociationMapping(); diff --git a/src/Filter/ModelFilter.php b/src/Filter/ModelFilter.php index 4ae8ffcfe..d702e945c 100644 --- a/src/Filter/ModelFilter.php +++ b/src/Filter/ModelFilter.php @@ -15,6 +15,7 @@ use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping\ClassMetadata; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; @@ -22,18 +23,18 @@ final class ModelFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data) || empty($data['value'])) { + if (!$data->hasValue() || empty($data->getValue())) { return; } - if ($data['value'] instanceof Collection) { - $data['value'] = $data['value']->toArray(); - } + $value = $data->getValue(); - if (!\is_array($data['value'])) { - $data['value'] = [$data['value']]; + if ($value instanceof Collection) { + $data = $data->changeValue($value->toArray()); + } elseif (!\is_array($value)) { + $data = $data->changeValue([$value]); } $this->handleMultiple($query, $alias, $data); @@ -65,18 +66,16 @@ public function getRenderSettings(): array /** * For the record, the $alias value is provided by the association method (and the entity join method) * so the field value is not used here. - * - * @param mixed[] $data */ - protected function handleMultiple(ProxyQueryInterface $query, string $alias, array $data): void + protected function handleMultiple(ProxyQueryInterface $query, string $alias, FilterData $data): void { - if (0 === \count($data['value'])) { + if (0 === \count($data->getValue())) { return; } $parameterName = $this->getNewParameterName($query); - if (isset($data['type']) && EqualOperatorType::TYPE_NOT_EQUAL === $data['type']) { + if ($data->isType(EqualOperatorType::TYPE_NOT_EQUAL)) { $or = $query->getQueryBuilder()->expr()->orX(); $or->add($query->getQueryBuilder()->expr()->notIn($alias, ':'.$parameterName)); @@ -96,10 +95,10 @@ protected function handleMultiple(ProxyQueryInterface $query, string $alias, arr $this->applyWhere($query, $query->getQueryBuilder()->expr()->in($alias, ':'.$parameterName)); } - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } - protected function association(ProxyQueryInterface $query, array $data): array + protected function association(ProxyQueryInterface $query, FilterData $data): array { $types = [ ClassMetadata::ONE_TO_ONE, diff --git a/src/Filter/NullFilter.php b/src/Filter/NullFilter.php index fba291af9..82755ceed 100644 --- a/src/Filter/NullFilter.php +++ b/src/Filter/NullFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\DefaultType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; use Sonata\Form\Type\BooleanType; @@ -20,14 +21,14 @@ final class NullFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - $isYes = BooleanType::TYPE_YES === (int) $data['value']; - $isNo = BooleanType::TYPE_NO === (int) $data['value']; + $isYes = BooleanType::TYPE_YES === (int) $data->getValue(); + $isNo = BooleanType::TYPE_NO === (int) $data->getValue(); if (!$this->getOption('inverse') && $isYes || $this->getOption('inverse') && $isNo) { $this->applyWhere( diff --git a/src/Filter/NumberFilter.php b/src/Filter/NumberFilter.php index 2ab6b30bb..c2700aecb 100644 --- a/src/Filter/NumberFilter.php +++ b/src/Filter/NumberFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\NumberType; use Sonata\AdminBundle\Form\Type\Operator\NumberOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; @@ -28,19 +29,19 @@ final class NumberFilter extends Filter NumberOperatorType::TYPE_LESS_THAN => '<', ]; - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data) || !is_numeric($data['value'])) { + if (!$data->hasValue() || !is_numeric($data->getValue())) { return; } - $type = $data['type'] ?? NumberOperatorType::TYPE_EQUAL; + $type = $data->getType() ?? NumberOperatorType::TYPE_EQUAL; $operator = $this->getOperator($type); // c.name > '1' => c.name OPERATOR :FIELDNAME $parameterName = $this->getNewParameterName($query); $this->applyWhere($query, sprintf('%s.%s %s :%s', $alias, $field, $operator, $parameterName)); - $query->getQueryBuilder()->setParameter($parameterName, $data['value']); + $query->getQueryBuilder()->setParameter($parameterName, $data->getValue()); } public function getDefaultOptions(): array diff --git a/src/Filter/StringFilter.php b/src/Filter/StringFilter.php index 9240907aa..d156d2773 100644 --- a/src/Filter/StringFilter.php +++ b/src/Filter/StringFilter.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\ChoiceType; use Sonata\AdminBundle\Form\Type\Operator\StringOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; @@ -43,17 +44,17 @@ final class StringFilter extends Filter StringOperatorType::TYPE_NOT_CONTAINS, ]; - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - $data['value'] = $this->trim((string) ($data['value'] ?? '')); - $type = $data['type'] ?? StringOperatorType::TYPE_CONTAINS; + $value = $this->trim((string) ($data->getValue() ?? '')); + $type = $data->getType() ?? StringOperatorType::TYPE_CONTAINS; // ignore empty value if it doesn't make sense - if ('' === $data['value'] && + if ('' === $value && (!$this->getOption('allow_empty') || \in_array($type, self::MEANINGLESS_TYPES, true)) ) { return; @@ -66,7 +67,7 @@ public function filter(ProxyQueryInterface $query, string $alias, string $field, $forceCaseInsensitivity = true === $this->getOption('force_case_insensitivity', false); - if ($forceCaseInsensitivity && '' !== $data['value']) { + if ($forceCaseInsensitivity && '' !== $data->getValue()) { $clause = 'LOWER(%s.%s) %s :%s'; } else { $clause = '%s.%s %s :%s'; @@ -101,7 +102,7 @@ public function filter(ProxyQueryInterface $query, string $alias, string $field, $parameterName, sprintf( $format, - true !== $forceCaseInsensitivity || '' === $data['value'] ? $data['value'] : mb_strtolower($data['value']) + true !== $forceCaseInsensitivity || '' === $value ? $value : mb_strtolower($value) ) ); } diff --git a/src/Filter/StringListFilter.php b/src/Filter/StringListFilter.php index 53e541041..21b9cbe74 100644 --- a/src/Filter/StringListFilter.php +++ b/src/Filter/StringListFilter.php @@ -13,34 +13,37 @@ namespace Sonata\DoctrineORMAdminBundle\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Filter\ChoiceType; use Sonata\AdminBundle\Form\Type\Operator\ContainsOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; final class StringListFilter extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { - if (!\array_key_exists('type', $data) || !\array_key_exists('value', $data)) { + if (!$data->hasValue()) { return; } - if (!\is_array($data['value'])) { - $data['value'] = [$data['value']]; + $value = $data->getValue(); + + if (!\is_array($value)) { + $data = $data->changeValue([$value]); } - $operator = ContainsOperatorType::TYPE_NOT_CONTAINS === $data['type'] ? 'NOT LIKE' : 'LIKE'; + $operator = $data->isType(ContainsOperatorType::TYPE_NOT_CONTAINS) ? 'NOT LIKE' : 'LIKE'; $andConditions = $query->getQueryBuilder()->expr()->andX(); - foreach ($data['value'] as $item) { + foreach ($data->getValue() as $item) { $parameterName = $this->getNewParameterName($query); $andConditions->add(sprintf('%s.%s %s :%s', $alias, $field, $operator, $parameterName)); $query->getQueryBuilder()->setParameter($parameterName, '%'.serialize($item).'%'); } - if (ContainsOperatorType::TYPE_EQUAL === $data['type']) { - $andConditions->add(sprintf("%s.%s LIKE 'a:%s:%%'", $alias, $field, \count($data['value']))); + if ($data->isType(ContainsOperatorType::TYPE_EQUAL)) { + $andConditions->add(sprintf("%s.%s LIKE 'a:%s:%%'", $alias, $field, \count($data->getValue()))); } $this->applyWhere($query, $andConditions); diff --git a/tests/Filter/BooleanFilterTest.php b/tests/Filter/BooleanFilterTest.php index 7ec3430b2..3b5595108 100644 --- a/tests/Filter/BooleanFilterTest.php +++ b/tests/Filter/BooleanFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\BooleanFilter; use Sonata\Form\Type\BooleanType; @@ -37,8 +38,8 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); - $filter->filter($proxyQuery, 'alias', 'field', [null, 'test']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([null, 'test'])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -51,7 +52,7 @@ public function testFilterNo(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => null, 'value' => BooleanType::TYPE_NO]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => null, 'value' => BooleanType::TYPE_NO])); $this->assertSameQuery(['WHERE alias.field = :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => 0], $proxyQuery); @@ -65,7 +66,7 @@ public function testFilterYes(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => null, 'value' => BooleanType::TYPE_YES]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => null, 'value' => BooleanType::TYPE_YES])); $this->assertSameQuery(['WHERE alias.field = :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => 1], $proxyQuery); @@ -79,7 +80,7 @@ public function testFilterArray(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => null, 'value' => [BooleanType::TYPE_NO]]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => null, 'value' => [BooleanType::TYPE_NO]])); $this->assertSameQuery(['WHERE alias.field IN ("0")'], $proxyQuery); $this->assertTrue($filter->isActive()); diff --git a/tests/Filter/CallbackFilterTest.php b/tests/Filter/CallbackFilterTest.php index a292610b4..c32287282 100644 --- a/tests/Filter/CallbackFilterTest.php +++ b/tests/Filter/CallbackFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter; @@ -39,15 +40,15 @@ public function testFilterClosure(): void $filter = new CallbackFilter(); $filter->initialize('field_name', [ - 'callback' => static function (ProxyQueryInterface $query, string $alias, string $field, array $data): bool { + 'callback' => static function (ProxyQueryInterface $query, string $alias, string $field, FilterData $data): bool { $query->getQueryBuilder()->andWhere(sprintf('CUSTOM QUERY %s.%s', $alias, $field)); - $query->getQueryBuilder()->setParameter('value', $data['value']); + $query->getQueryBuilder()->setParameter('value', $data->getValue()); return true; }, ]); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'myValue']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'myValue'])); $this->assertSameQuery(['WHERE CUSTOM QUERY alias.field'], $proxyQuery); $this->assertSameQueryParameters(['value' => 'myValue'], $proxyQuery); @@ -63,20 +64,17 @@ public function testFilterMethod(): void 'callback' => [$this, 'customCallback'], ]); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'myValue']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'myValue'])); $this->assertSameQuery(['WHERE CUSTOM QUERY alias.field'], $proxyQuery); $this->assertSameQueryParameters(['value' => 'myValue'], $proxyQuery); $this->assertTrue($filter->isActive()); } - /** - * @phpstan-param array{value: mixed} $data - */ - public function customCallback(ProxyQueryInterface $query, string $alias, string $field, array $data): bool + public function customCallback(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): bool { $query->getQueryBuilder()->andWhere(sprintf('CUSTOM QUERY %s.%s', $alias, $field)); - $query->getQueryBuilder()->setParameter('value', $data['value']); + $query->getQueryBuilder()->setParameter('value', $data->getValue()); return true; } @@ -89,7 +87,7 @@ public function testFilterException(): void $filter->initialize('field_name', []); $this->expectException(\RuntimeException::class); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'myValue']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'myValue'])); } public function testApplyMethod(): void @@ -98,16 +96,16 @@ public function testApplyMethod(): void $filter = new CallbackFilter(); $filter->initialize('field_name_test', [ - 'callback' => static function (ProxyQueryInterface $query, string $alias, string $field, array $data): bool { + 'callback' => static function (ProxyQueryInterface $query, string $alias, string $field, FilterData $data): bool { $query->getQueryBuilder()->andWhere(sprintf('CUSTOM QUERY %s.%s', $alias, $field)); - $query->getQueryBuilder()->setParameter('value', $data['value']); + $query->getQueryBuilder()->setParameter('value', $data->getValue()); return true; }, 'field_name' => 'field_name_test', ]); - $filter->apply($proxyQuery, ['value' => 'myValue']); + $filter->apply($proxyQuery, FilterData::fromArray(['value' => 'myValue'])); $this->assertSameQuery(['WHERE CUSTOM QUERY o.field_name_test'], $proxyQuery); $this->assertSameQueryParameters(['value' => 'myValue'], $proxyQuery); diff --git a/tests/Filter/ChoiceFilterTest.php b/tests/Filter/ChoiceFilterTest.php index f38c5673d..61e00ac28 100644 --- a/tests/Filter/ChoiceFilterTest.php +++ b/tests/Filter/ChoiceFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\ChoiceFilter; @@ -36,7 +37,7 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -49,7 +50,7 @@ public function testFilterArray(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => ['1', '2']]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => ['1', '2']])); $this->assertSameQuery(['WHERE alias.field IN :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => ['1', '2']], $proxyQuery); @@ -57,7 +58,7 @@ public function testFilterArray(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => ['1', '2']]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => ['1', '2']])); $this->assertSameQuery(['WHERE alias.field NOT IN :field_name_0 OR alias.field IS NULL'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => ['1', '2']], $proxyQuery); @@ -71,7 +72,7 @@ public function testFilterArrayWithNullValue(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => ['1', null]]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => ['1', null]])); $this->assertSameQuery(['WHERE alias.field IN :field_name_0 OR alias.field IS NULL'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => ['1', null]], $proxyQuery); @@ -79,7 +80,7 @@ public function testFilterArrayWithNullValue(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => ['1', null]]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => ['1', null]])); $this->assertSameQuery(['WHERE alias.field NOT IN :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => ['1', null]], $proxyQuery); @@ -93,7 +94,7 @@ public function testFilterScalar(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => '1']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => '1'])); $this->assertSameQuery(['WHERE alias.field = :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => '1'], $proxyQuery); @@ -101,7 +102,7 @@ public function testFilterScalar(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => '1']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => '1'])); $this->assertSameQuery(['WHERE alias.field != :field_name_0 OR alias.field IS NULL'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => '1'], $proxyQuery); @@ -115,7 +116,7 @@ public function testFilterNull(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => null]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => null])); $this->assertSameQuery(['WHERE alias.field IS NULL'], $proxyQuery); $this->assertSameQueryParameters([], $proxyQuery); @@ -123,7 +124,7 @@ public function testFilterNull(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => null]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => null])); $this->assertSameQuery(['WHERE alias.field IS NOT NULL'], $proxyQuery); $this->assertSameQueryParameters([], $proxyQuery); @@ -137,7 +138,7 @@ public function testFilterZero(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 0]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 0])); $this->assertSameQuery(['WHERE alias.field = :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => 0], $proxyQuery); diff --git a/tests/Filter/ClassFilterTest.php b/tests/Filter/ClassFilterTest.php index 96b93be50..03fe4509d 100644 --- a/tests/Filter/ClassFilterTest.php +++ b/tests/Filter/ClassFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\ClassFilter; @@ -36,7 +37,7 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => '']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => ''])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -49,7 +50,7 @@ public function testFilterInvalidOperator(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => 42]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => 42])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -62,9 +63,9 @@ public function testFilter(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 'type']); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => 'type']); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'type']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 'type'])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => 'type'])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'type'])); $expected = [ 'WHERE alias INSTANCE OF type', diff --git a/tests/Filter/CountFilterTest.php b/tests/Filter/CountFilterTest.php index 1d5ced91d..6f4cb171e 100644 --- a/tests/Filter/CountFilterTest.php +++ b/tests/Filter/CountFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\NumberOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\CountFilter; @@ -26,7 +27,7 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -39,7 +40,7 @@ public function testFilterInvalidOperator(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => 42]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => 42])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -55,7 +56,7 @@ public function testFilter(string $expected, ?int $type): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => $type, 'value' => 42]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => $type, 'value' => 42])); $this->assertSameQuery(['GROUP BY o', $expected], $proxyQuery); $this->assertTrue($filter->isActive()); diff --git a/tests/Filter/DateFilterTest.php b/tests/Filter/DateFilterTest.php index 4e2cbc7cb..73c3451e2 100644 --- a/tests/Filter/DateFilterTest.php +++ b/tests/Filter/DateFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\DateFilter; use Symfony\Component\Form\Extension\Core\Type\DateType; @@ -29,7 +30,7 @@ public function testEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -46,7 +47,7 @@ public function testFilterRecordsWholeDay(): void $filter->initialize('field_name', ['field_options' => ['class' => 'FooBar']]); $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => new \DateTime()]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => new \DateTime()])); $this->assertSameQuery([ 'WHERE alias.field >= :field_name_0', diff --git a/tests/Filter/DateRangeFilterTest.php b/tests/Filter/DateRangeFilterTest.php index 3cc5dadb7..fa6dcf2a6 100644 --- a/tests/Filter/DateRangeFilterTest.php +++ b/tests/Filter/DateRangeFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\DateRangeFilter; @@ -28,17 +29,17 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); - $filter->filter($proxyQuery, 'alias', 'field', [null, 'test']); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => null, 'value' => []]); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([null, 'test'])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => null, 'value' => []])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => ['start' => null, 'end' => null], - ]); - $filter->filter($proxyQuery, 'alias', 'field', [ + ])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => ['start' => '', 'end' => ''], - ]); + ])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -54,13 +55,13 @@ public function testFilterStartDateAndEndDate(): void $startDateTime = new \DateTime('2016-08-01'); $endDateTime = new \DateTime('2016-08-31'); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => [ 'start' => $startDateTime, 'end' => $endDateTime, ], - ]); + ])); $this->assertSameQuery(['WHERE alias.field >= :field_name_0', 'WHERE alias.field <= :field_name_1'], $proxyQuery); $this->assertSameQueryParameters([ @@ -79,13 +80,13 @@ public function testFilterStartDate(): void $startDateTime = new \DateTime('2016-08-01'); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => [ 'start' => $startDateTime, 'end' => '', ], - ]); + ])); $this->assertSameQuery(['WHERE alias.field >= :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => $startDateTime], $proxyQuery); @@ -101,13 +102,13 @@ public function testFilterEndDate(): void $endDateTime = new \DateTime('2016-08-31'); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => [ 'start' => '', 'end' => $endDateTime, ], - ]); + ])); $this->assertSameQuery(['WHERE alias.field <= :field_name_1'], $proxyQuery); $this->assertSameQueryParameters(['field_name_1' => $endDateTime], $proxyQuery); @@ -133,13 +134,13 @@ public function testFilterEndDateCoversWholeDay( $this->assertSame($modelTimeZone->getName(), $modelEndDateTime->getTimezone()->getName()); $this->assertNotSame($modelTimeZone->getName(), $viewEndDateTime->getTimezone()->getName()); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => [ 'start' => '', 'end' => $modelEndDateTime, ], - ]); + ])); $this->assertTrue($filter->isActive()); $this->assertSameQuery(['WHERE alias.field <= :field_name_1'], $proxyQuery); @@ -192,13 +193,13 @@ public function testFilterEndDateImmutable(): void $endDateTime = new \DateTimeImmutable('2016-08-31'); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => null, 'value' => [ 'start' => '', 'end' => $endDateTime, ], - ]); + ])); $this->assertSameQuery(['WHERE alias.field <= :field_name_1'], $proxyQuery); $this->assertTrue($filter->isActive()); diff --git a/tests/Filter/DateTimeFilterTest.php b/tests/Filter/DateTimeFilterTest.php index 89c1f4e72..a60a81c8c 100644 --- a/tests/Filter/DateTimeFilterTest.php +++ b/tests/Filter/DateTimeFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\DateTimeFilter; use Symfony\Component\Form\Extension\Core\Type\DateTimeType; @@ -29,7 +30,7 @@ public function testEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => '']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => ''])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); diff --git a/tests/Filter/DateTimeRangeFilterTest.php b/tests/Filter/DateTimeRangeFilterTest.php index 224759cd9..42e99c6b9 100644 --- a/tests/Filter/DateTimeRangeFilterTest.php +++ b/tests/Filter/DateTimeRangeFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\DateTimeRangeFilter; use Sonata\Form\Type\DateTimeRangeType; @@ -29,7 +30,7 @@ public function testEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); diff --git a/tests/Filter/FilterTest.php b/tests/Filter/FilterTest.php index 311edfede..a9ac6fac5 100644 --- a/tests/Filter/FilterTest.php +++ b/tests/Filter/FilterTest.php @@ -15,6 +15,7 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query\Expr; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface; use Sonata\DoctrineORMAdminBundle\Filter\Filter; @@ -73,7 +74,7 @@ public function testOrExpression(string $expected, array $filterOptionsCollectio $proxyQuery = new ProxyQuery($queryBuilder); - foreach ($filterOptionsCollection as [$type, $orGroup, $defaultOptions, $field, $options]) { + foreach ($filterOptionsCollection as [$type, $orGroup, $defaultOptions, $field, $filterData]) { $filter = new $type(); $filter->initialize($field, $defaultOptions); $filter->setCondition(Filter::CONDITION_OR); @@ -81,7 +82,7 @@ public function testOrExpression(string $expected, array $filterOptionsCollectio $filter->setOption('or_group', $orGroup); } - $filter->apply($proxyQuery, $options); + $filter->apply($proxyQuery, $filterData); } // More custom conditions set after the filters. @@ -91,7 +92,7 @@ public function testOrExpression(string $expected, array $filterOptionsCollectio } /** - * @phpstan-return iterable, string, array}>}> + * @phpstan-return iterable, string, FilterData}>}> */ public function orExpressionProvider(): iterable { @@ -107,9 +108,9 @@ public function orExpressionProvider(): iterable 'allow_empty' => false, ], 'project', - [ + FilterData::fromArray([ 'value' => 'sonata-project', - ], + ]), ], [ StringFilter::class, @@ -119,9 +120,9 @@ public function orExpressionProvider(): iterable 'allow_empty' => false, ], 'version', - [ + FilterData::fromArray([ 'value' => '3.x', - ], + ]), ], ], ]; @@ -138,9 +139,9 @@ public function orExpressionProvider(): iterable 'allow_empty' => false, ], 'project', - [ + FilterData::fromArray([ 'value' => 'sonata-project', - ], + ]), ], ], ]; @@ -158,9 +159,9 @@ public function orExpressionProvider(): iterable 'allow_empty' => false, ], 'project', - [ + FilterData::fromArray([ 'value' => 'sonata-project', - ], + ]), ], [ StringFilter::class, @@ -170,9 +171,9 @@ public function orExpressionProvider(): iterable 'allow_empty' => false, ], 'version', - [ + FilterData::fromArray([ 'value' => '3.x', - ], + ]), ], ], ]; @@ -181,7 +182,7 @@ public function orExpressionProvider(): iterable private function createFilter(): Filter { return new class() extends Filter { - public function filter(ProxyQueryInterface $query, string $alias, string $field, array $data): void + public function filter(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): void { // TODO: Implement filter() method. throw new \BadMethodCallException(sprintf( diff --git a/tests/Filter/ModelFilterTest.php b/tests/Filter/ModelFilterTest.php index 02b615cf9..d5de888f2 100644 --- a/tests/Filter/ModelFilterTest.php +++ b/tests/Filter/ModelFilterTest.php @@ -14,6 +14,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; use Doctrine\ORM\Mapping\ClassMetadata; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\EqualOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\ModelFilter; @@ -27,7 +28,7 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -40,10 +41,10 @@ public function testFilterArray(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => EqualOperatorType::TYPE_EQUAL, 'value' => ['1', '2'], - ]); + ])); // the alias is now computer by the entityJoin method $this->assertSameQuery(['WHERE alias IN :field_name_0'], $proxyQuery); @@ -58,10 +59,10 @@ public function testFilterArrayTypeIsNotEqual(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', [ + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([ 'type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => ['1', '2'], - ]); + ])); // the alias is now computer by the entityJoin method $this->assertSameQuery( @@ -79,7 +80,7 @@ public function testFilterScalar(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 2]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 2])); $this->assertSameQuery(['WHERE alias IN :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => [2]], $proxyQuery); @@ -93,7 +94,7 @@ public function testFilterScalarTypeIsNotEqual(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => 2]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => EqualOperatorType::TYPE_NOT_EQUAL, 'value' => 2])); $this->assertSameQuery( ['WHERE alias NOT IN :field_name_0 OR IDENTITY('.current(($proxyQuery->getRootAliases())).'.field_name) IS NULL'], @@ -106,14 +107,14 @@ public function testFilterScalarTypeIsNotEqual(): void public function testAssociationWithInvalidMapping(): void { - $this->expectException(\RuntimeException::class); - $filter = new ModelFilter(); $filter->initialize('field_name', ['mapping_type' => 'foo']); $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->apply($proxyQuery, ['value' => 'asd']); + $this->expectException(\RuntimeException::class); + + $filter->apply($proxyQuery, FilterData::fromArray(['value' => 'asd'])); } public function testAssociationWithValidMappingAndEmptyFieldName(): void @@ -125,7 +126,7 @@ public function testAssociationWithValidMappingAndEmptyFieldName(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->apply($proxyQuery, ['value' => 'asd']); + $filter->apply($proxyQuery, FilterData::fromArray(['value' => 'asd'])); $this->assertTrue($filter->isActive()); } @@ -142,7 +143,7 @@ public function testAssociationWithValidMapping(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->apply($proxyQuery, ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 'asd']); + $filter->apply($proxyQuery, FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 'asd'])); $this->assertSameQuery([ 'LEFT JOIN o.association_mapping AS s_association_mapping', @@ -172,7 +173,7 @@ public function testAssociationWithValidParentAssociationMappings(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->apply($proxyQuery, ['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 'asd']); + $filter->apply($proxyQuery, FilterData::fromArray(['type' => EqualOperatorType::TYPE_EQUAL, 'value' => 'asd'])); $this->assertSameQuery([ 'LEFT JOIN o.association_mapping AS s_association_mapping', diff --git a/tests/Filter/NullFilterTest.php b/tests/Filter/NullFilterTest.php index 49de7190b..335f4f386 100644 --- a/tests/Filter/NullFilterTest.php +++ b/tests/Filter/NullFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\NullFilter; use Sonata\Form\Type\BooleanType; @@ -28,7 +29,7 @@ public function testEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -48,7 +49,7 @@ public function testValue(bool $inverse, int $value, string $expectedQuery): voi $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value])); $this->assertSameQuery([$expectedQuery], $proxyQuery); $this->assertTrue($filter->isActive()); diff --git a/tests/Filter/NumberFilterTest.php b/tests/Filter/NumberFilterTest.php index 3681ffa26..4d1e5daaa 100644 --- a/tests/Filter/NumberFilterTest.php +++ b/tests/Filter/NumberFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\NumberOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\NumberFilter; @@ -26,7 +27,7 @@ public function testFilterEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -39,7 +40,7 @@ public function testFilterInvalidOperator(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => 42]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => 42])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -52,12 +53,12 @@ public function testFilter(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => NumberOperatorType::TYPE_EQUAL, 'value' => 42]); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => NumberOperatorType::TYPE_GREATER_EQUAL, 'value' => 42]); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => NumberOperatorType::TYPE_GREATER_THAN, 'value' => 42]); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => NumberOperatorType::TYPE_LESS_EQUAL, 'value' => 42]); - $filter->filter($proxyQuery, 'alias', 'field', ['type' => NumberOperatorType::TYPE_LESS_THAN, 'value' => 42]); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 42]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => NumberOperatorType::TYPE_EQUAL, 'value' => 42])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => NumberOperatorType::TYPE_GREATER_EQUAL, 'value' => 42])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => NumberOperatorType::TYPE_GREATER_THAN, 'value' => 42])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => NumberOperatorType::TYPE_LESS_EQUAL, 'value' => 42])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['type' => NumberOperatorType::TYPE_LESS_THAN, 'value' => 42])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 42])); $expected = [ 'WHERE alias.field = :field_name_0', diff --git a/tests/Filter/StringFilterTest.php b/tests/Filter/StringFilterTest.php index bc4c67a77..bb8a0dff4 100644 --- a/tests/Filter/StringFilterTest.php +++ b/tests/Filter/StringFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\StringOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\StringFilter; @@ -26,7 +27,7 @@ public function testEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -63,7 +64,7 @@ public function testDefaultType($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => null]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => null])); if ('' !== (string) $value) { $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0'], $proxyQuery); @@ -88,7 +89,7 @@ public function testContains($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => StringOperatorType::TYPE_CONTAINS]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => StringOperatorType::TYPE_CONTAINS])); if ('' !== (string) $value) { $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0'], $proxyQuery); @@ -113,7 +114,7 @@ public function testStartsWith($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => StringOperatorType::TYPE_STARTS_WITH]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => StringOperatorType::TYPE_STARTS_WITH])); if ('' !== (string) $value) { $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0'], $proxyQuery); @@ -138,7 +139,7 @@ public function testEndsWith($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => StringOperatorType::TYPE_ENDS_WITH]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => StringOperatorType::TYPE_ENDS_WITH])); if ('' !== (string) $value) { $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0'], $proxyQuery); @@ -163,7 +164,7 @@ public function testNotContains($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => StringOperatorType::TYPE_NOT_CONTAINS]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => StringOperatorType::TYPE_NOT_CONTAINS])); if ('' !== (string) $value) { $this->assertSameQuery(['WHERE alias.field NOT LIKE :field_name_0 OR alias.field IS NULL'], $proxyQuery); @@ -188,7 +189,7 @@ public function testEquals($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => StringOperatorType::TYPE_EQUAL]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => StringOperatorType::TYPE_EQUAL])); if ('' !== (string) $value || $allowEmpty) { $this->assertSameQuery(['WHERE alias.field = :field_name_0'], $proxyQuery); @@ -213,7 +214,7 @@ public function testNotEquals($value, bool $allowEmpty): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => StringOperatorType::TYPE_NOT_EQUAL]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => StringOperatorType::TYPE_NOT_EQUAL])); if ('' !== (string) $value || $allowEmpty) { $this->assertSameQuery(['WHERE alias.field <> :field_name_0 OR alias.field IS NULL'], $proxyQuery); @@ -246,7 +247,7 @@ public function testEqualsWithValidParentAssociationMappings(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->apply($proxyQuery, ['type' => StringOperatorType::TYPE_EQUAL, 'value' => 'asd']); + $filter->apply($proxyQuery, FilterData::fromArray(['type' => StringOperatorType::TYPE_EQUAL, 'value' => 'asd'])); $this->assertSameQuery([ 'LEFT JOIN o.association_mapping AS s_association_mapping', @@ -271,7 +272,7 @@ public function testCaseSensitive(array $options, int $operatorType, string $exp $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'FooBar', 'type' => $operatorType]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'FooBar', 'type' => $operatorType])); $this->assertSameQuery([$expectedQuery], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => $expectedParameter], $proxyQuery); $this->assertTrue($filter->isActive()); diff --git a/tests/Filter/StringListFilterTest.php b/tests/Filter/StringListFilterTest.php index 97e0a5e7e..389d748c2 100644 --- a/tests/Filter/StringListFilterTest.php +++ b/tests/Filter/StringListFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\AdminBundle\Form\Type\Operator\ContainsOperatorType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\StringListFilter; @@ -26,7 +27,7 @@ public function testItStaysDisabledWhenFilteringWithAnEmptyValue(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive()); @@ -40,7 +41,7 @@ public function testFilteringWithNullReturnsArraysThatContainNull(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => null, 'type' => null]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => null, 'type' => null])); $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => '%N;%'], $proxyQuery); $this->assertTrue($filter->isActive()); @@ -57,7 +58,7 @@ public function testContains(?int $type): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'asd', 'type' => $type]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'asd', 'type' => $type])); $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => '%s:3:"asd";%'], $proxyQuery); $this->assertTrue($filter->isActive()); @@ -80,7 +81,7 @@ public function testNotContains(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'asd', 'type' => ContainsOperatorType::TYPE_NOT_CONTAINS]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'asd', 'type' => ContainsOperatorType::TYPE_NOT_CONTAINS])); $this->assertSameQuery(['WHERE alias.field NOT LIKE :field_name_0'], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => '%s:3:"asd";%'], $proxyQuery); $this->assertTrue($filter->isActive()); @@ -94,7 +95,7 @@ public function testEquals(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => 'asd', 'type' => ContainsOperatorType::TYPE_EQUAL]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => 'asd', 'type' => ContainsOperatorType::TYPE_EQUAL])); $this->assertSameQuery(['WHERE alias.field LIKE :field_name_0 AND alias.field LIKE \'a:1:%\''], $proxyQuery); $this->assertSameQueryParameters(['field_name_0' => '%s:3:"asd";%'], $proxyQuery); $this->assertTrue($filter->isActive()); @@ -115,7 +116,7 @@ public function testMultipleValues(array $value, ?int $type, array $query, array $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); $this->assertSameQuery([], $proxyQuery); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => $value, 'type' => $type]); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => $value, 'type' => $type])); $this->assertSameQuery($query, $proxyQuery); $this->assertSameQueryParameters($parameters, $proxyQuery); $this->assertTrue($filter->isActive()); diff --git a/tests/Filter/TimeFilterTest.php b/tests/Filter/TimeFilterTest.php index 9286fa55d..98ed09634 100644 --- a/tests/Filter/TimeFilterTest.php +++ b/tests/Filter/TimeFilterTest.php @@ -13,6 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter; +use Sonata\AdminBundle\Filter\Model\FilterData; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use Sonata\DoctrineORMAdminBundle\Filter\TimeFilter; use Symfony\Component\Form\Extension\Core\Type\TimeType; @@ -29,8 +30,8 @@ public function testEmpty(): void $proxyQuery = new ProxyQuery($this->createQueryBuilderStub()); - $filter->filter($proxyQuery, 'alias', 'field', []); - $filter->filter($proxyQuery, 'alias', 'field', ['value' => '']); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray([])); + $filter->filter($proxyQuery, 'alias', 'field', FilterData::fromArray(['value' => ''])); $this->assertSameQuery([], $proxyQuery); $this->assertFalse($filter->isActive());