Skip to content

Commit

Permalink
improves Filter tool naming
Browse files Browse the repository at this point in the history
  • Loading branch information
matiux committed Oct 24, 2022
1 parent 90ba1bb commit a767eb2
Show file tree
Hide file tree
Showing 23 changed files with 229 additions and 229 deletions.
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace DDDStarterPack\Aggregate\Domain\Repository\Filter;

/**
* @template T
*/
interface FilterApplier
{
public function key(): string;

/**
* @param T $target
* @param FilterApplierRegistry $filterApplierRegistry
*/
public function apply($target, FilterApplierRegistry $filterApplierRegistry): void;

public function supports(FilterApplierRegistry $filterApplierRegistry): bool;
}
Expand Up @@ -6,39 +6,39 @@

use InvalidArgumentException;

class FilterParams
class FilterApplierRegistry
{
/** @var FilterParamsApplier[] */
protected array $appliers = [];
/** @var FilterApplier[] */
protected array $filterAppliers = [];

/**
* @param array<array-key, FilterParamsApplier> $appliers
* @param array $neededFilters
* @param array<array-key, FilterApplier> $filterAppliers
* @param array $neededFilters
*/
public function __construct(array $appliers, protected array $neededFilters)
public function __construct(array $filterAppliers, protected array $neededFilters)
{
$this->setAppliers($appliers);
$this->setAppliers($filterAppliers);
}

/**
* @param FilterParamsApplier[] $appliers
* @param FilterApplier[] $filterAppliers
*/
private function setAppliers(array $appliers): void
private function setAppliers(array $filterAppliers): void
{
foreach ($appliers as $applier) {
foreach ($filterAppliers as $applier) {
$this->addApplier($applier);
}
}

public function addApplier(FilterParamsApplier $applier): void
public function addApplier(FilterApplier $filterApplier): void
{
$key = $applier->key();
$key = $filterApplier->key();

if (isset($this->appliers[$key])) {
if (isset($this->filterAppliers[$key])) {
throw new InvalidArgumentException("Applier for key '{$key}' is already set");
}

$this->appliers[$key] = $applier;
$this->filterAppliers[$key] = $filterApplier;
}

/**
Expand All @@ -63,7 +63,7 @@ public function getFilterValueForKey(string $key, string $default = ''): mixed

public function applyToTarget(mixed $target): void
{
foreach ($this->appliers as $applier) {
foreach ($this->filterAppliers as $applier) {
if ($applier->supports($this)) {
$applier->apply($target, $this);
}
Expand Down
@@ -0,0 +1,53 @@
<?php

declare(strict_types=1);

namespace DDDStarterPack\Aggregate\Domain\Repository\Filter;

use InvalidArgumentException;
use LogicException;
use Traversable;

class FilterBuilder
{
/** @var FilterApplier[] */
protected array $filterAppliers = [];

protected bool $frozen = false;

/**
* @param FilterApplier[]|Traversable<FilterApplier> $filterAppliers
*/
public function __construct($filterAppliers = [])
{
if ($filterAppliers instanceof Traversable) {
$filterAppliers = iterator_to_array($filterAppliers);
}

foreach ($filterAppliers as $applier) {
$this->addApplier($applier);
}
}

public function addApplier(FilterApplier $filterApplier): void
{
if ($this->frozen) {
throw new LogicException('The builder is frozen');
}

$key = $filterApplier->key();

if (isset($this->filterAppliers[$key])) {
throw new InvalidArgumentException("Applier for key '{$key}' is already set");
}

$this->filterAppliers[$key] = $filterApplier;
}

public function build(array $neededFilters): FilterApplierRegistry
{
$this->frozen = true;

return new FilterApplierRegistry(array_values($this->filterAppliers), $neededFilters);
}
}

This file was deleted.

This file was deleted.

Expand Up @@ -14,8 +14,8 @@ trait PaginationFilterRequest
public function withPagination(null|int $page, null|int $perPage): self
{
if ($page && $perPage) {
$this->paginationFilters[PaginationFilterParamsApplierKeys::PAGE] = $page;
$this->paginationFilters[PaginationFilterParamsApplierKeys::PER_PAGE] = $perPage;
$this->paginationFilters[PaginationKeyFilterApplier::PAGE] = $page;
$this->paginationFilters[PaginationKeyFilterApplier::PER_PAGE] = $perPage;
}

return $this;
Expand Down
Expand Up @@ -4,7 +4,7 @@

namespace DDDStarterPack\Aggregate\Domain\Repository\Filter;

interface PaginationFilterParamsApplierKeys
interface PaginationKeyFilterApplier
{
public const PAGE = 'page';
public const PER_PAGE = 'per_page';
Expand Down
Expand Up @@ -11,8 +11,8 @@ trait SortingFilterRequest
public function withSorting(null|string $sortingField, null|string $sortingDirection): self
{
if ($sortingField && $sortingDirection) {
$this->sortingFilters[SortingFilterParamsApplierKeys::SORT] = $sortingField;
$this->sortingFilters[SortingFilterParamsApplierKeys::SORT_DIRECTION] = $sortingDirection;
$this->sortingFilters[SortingKeyFilterApplier::SORT] = $sortingField;
$this->sortingFilters[SortingKeyFilterApplier::SORT_DIRECTION] = $sortingDirection;
}

return $this;
Expand Down
Expand Up @@ -4,7 +4,7 @@

namespace DDDStarterPack\Aggregate\Domain\Repository\Filter;

interface SortingFilterParamsApplierKeys
interface SortingKeyFilterApplier
{
public const SORT = 'sort_field';
public const SORT_DIRECTION = 'sort_direction';
Expand Down
Expand Up @@ -4,7 +4,7 @@

namespace DDDStarterPack\Aggregate\Infrastructure\Doctrine\Repository;

use DDDStarterPack\Aggregate\Domain\Repository\Filter\FilterParams;
use DDDStarterPack\Aggregate\Domain\Repository\Filter\FilterApplierRegistry;
use DDDStarterPack\Aggregate\Domain\Repository\Paginator\Paginator;
use Doctrine\ORM\QueryBuilder;
use Webmozart\Assert\Assert;
Expand All @@ -15,27 +15,27 @@
abstract class DoctrineFilterParamsRepository extends DoctrineRepository
{
/**
* @param FilterParams $filterParams
* @param FilterApplierRegistry $filterApplierRegistry
*
* @return Paginator<T>
*/
protected function doByFilterParamsWithPagination(FilterParams $filterParams): Paginator
protected function doByFilterParamsWithPagination(FilterApplierRegistry $filterApplierRegistry): Paginator
{
$qb = $this->createQuery($filterParams);
$qb = $this->createQuery($filterApplierRegistry);

[$offset, $limit] = $this->calculatePagination($filterParams, $qb);
[$offset, $limit] = $this->calculatePagination($filterApplierRegistry, $qb);

return $this->createPaginator($qb, $offset, $limit);
}

/**
* @param FilterParams $filterParams
* @param FilterApplierRegistry $filterApplierRegistry
*
* @return T[]
*/
protected function doByFilterParams(FilterParams $filterParams): array
protected function doByFilterParams(FilterApplierRegistry $filterApplierRegistry): array
{
$qb = $this->createQuery($filterParams);
$qb = $this->createQuery($filterApplierRegistry);

$results = $qb->getQuery()->getResult();

Expand All @@ -44,25 +44,25 @@ protected function doByFilterParams(FilterParams $filterParams): array
return $results;
}

private function createQuery(FilterParams $filterParams): QueryBuilder
private function createQuery(FilterApplierRegistry $filterApplierRegistry): QueryBuilder
{
$qb = $this->em->createQueryBuilder();

$qb->select($this->getEntityAliasName())
->from($this->getEntityClassName(), $this->getEntityAliasName());

$filterParams->applyToTarget($qb);
$filterApplierRegistry->applyToTarget($qb);

return $qb;
}

/**
* @param FilterParams $filterParams
* @param QueryBuilder $qb
* @param FilterApplierRegistry $filterApplierRegistry
* @param QueryBuilder $qb
*
* @return list<int>
*/
protected function calculatePagination(FilterParams $filterParams, QueryBuilder $qb): array
protected function calculatePagination(FilterApplierRegistry $filterApplierRegistry, QueryBuilder $qb): array
{
$result = $qb->getQuery()->getResult();

Expand All @@ -73,11 +73,11 @@ protected function calculatePagination(FilterParams $filterParams, QueryBuilder
$offset = 0;
$limit = 0 != $totalResult ? $totalResult : 1;

if (-1 != $filterParams->getFilterValueForKey('per_page')) {
$offset = $this->calculateOffset($filterParams);
if (-1 != $filterApplierRegistry->getFilterValueForKey('per_page')) {
$offset = $this->calculateOffset($filterApplierRegistry);

/** @var int $limit */
$limit = $filterParams->getFilterValueForKey('per_page');
$limit = $filterApplierRegistry->getFilterValueForKey('per_page');
}

return [intval($offset), intval($limit)];
Expand All @@ -92,13 +92,13 @@ protected function calculatePagination(FilterParams $filterParams, QueryBuilder
*/
abstract protected function createPaginator(QueryBuilder $qb, int $offset, int $limit): Paginator;

private function calculateOffset(FilterParams $filterParams): int
private function calculateOffset(FilterApplierRegistry $filterApplierRegistry): int
{
/** @var int $page */
$page = $filterParams->getFilterValueForKey('page');
$page = $filterApplierRegistry->getFilterValueForKey('page');

/** @var int $perPage */
$perPage = $filterParams->getFilterValueForKey('per_page');
$perPage = $filterApplierRegistry->getFilterValueForKey('per_page');

return ($page - 1) * $perPage;
}
Expand Down
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace DDDStarterPack\Aggregate\Infrastructure\Doctrine\Repository\Filter;

use DDDStarterPack\Aggregate\Domain\Repository\Filter\FilterApplier;
use DDDStarterPack\Aggregate\Domain\Repository\Filter\FilterApplierRegistry;
use Doctrine\ORM\QueryBuilder;

/**
* @implements FilterApplier<QueryBuilder>
*/
abstract class DoctrineFilterApplier implements FilterApplier
{
/**
* @param QueryBuilder $target
* @param FilterApplierRegistry $filterApplierRegistry
*/
abstract public function apply($target, FilterApplierRegistry $filterApplierRegistry): void;
}

0 comments on commit a767eb2

Please sign in to comment.