Skip to content

Commit

Permalink
Merge pull request #27 from TomHAnderson/feature/type-query-array
Browse files Browse the repository at this point in the history
Moved filter transform to Filters
  • Loading branch information
TomHAnderson committed Nov 28, 2023
2 parents eff6ea7 + 16c1315 commit 7b183ac
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 46 deletions.
47 changes: 47 additions & 0 deletions src/Criteria/Filters.php
Expand Up @@ -4,6 +4,8 @@

namespace ApiSkeletons\Doctrine\ORM\GraphQL\Criteria;

use function implode;

final class Filters
{
public const EQ = 'eq';
Expand Down Expand Up @@ -65,4 +67,49 @@ public static function getDescriptions(): array
self::SORT => 'Sort the result. Either "asc" or "desc".',
];
}

/**
* Build an array suitable for QueryBuilder Applicator
*
* @param mixed[] $filterTypes
*
* @return mixed[]
*/
public function buildQueryArray(array $filterTypes): array
{
$filterArray = [];

foreach ($filterTypes as $field => $filters) {
foreach ($filters as $filter => $value) {
switch ($filter) {
case self::CONTAINS:
$filterArray[$field . '|like'] = $value;
break;
case self::STARTSWITH:
$filterArray[$field . '|startswith'] = $value;
break;
case self::ENDSWITH:
$filterArray[$field . '|endswith'] = $value;
break;
case self::ISNULL:
$filterArray[$field . '|isnull'] = 'true';
break;
case self::BETWEEN:
$filterArray[$field . '|between'] = $value['from'] . ',' . $value['to'];
break;
case self::IN:
$filterArray[$field . '|in'] = implode(',', $value);
break;
case self::NOTIN:
$filterArray[$field . '|notin'] = implode(',', $value);
break;
default:
$filterArray[$field . '|' . $filter] = (string) $value;
break;
}
}
}

return $filterArray;
}
}
49 changes: 3 additions & 46 deletions src/Resolve/ResolveEntityFactory.php
Expand Up @@ -5,7 +5,7 @@
namespace ApiSkeletons\Doctrine\ORM\GraphQL\Resolve;

use ApiSkeletons\Doctrine\ORM\GraphQL\Config;
use ApiSkeletons\Doctrine\ORM\GraphQL\Criteria\Filters as FiltersDef;
use ApiSkeletons\Doctrine\ORM\GraphQL\Criteria\Filters;
use ApiSkeletons\Doctrine\ORM\GraphQL\Event\FilterQueryBuilder;
use ApiSkeletons\Doctrine\ORM\GraphQL\Type\Entity;
use ApiSkeletons\Doctrine\QueryBuilder\Filter\Applicator;
Expand All @@ -19,7 +19,6 @@

use function base64_decode;
use function base64_encode;
use function implode;

class ResolveEntityFactory
{
Expand All @@ -35,10 +34,11 @@ public function get(Entity $entity, string $eventName): Closure
{
return function ($objectValue, array $args, $context, ResolveInfo $info) use ($entity, $eventName) {
$entityClass = $entity->getEntityClass();
$filters = new Filters();

$queryBuilderFilter = (new Applicator($this->entityManager, $entityClass))
->setEntityAlias('entity');
$queryBuilder = $queryBuilderFilter($this->buildFilterArray($args['filter'] ?? []))
$queryBuilder = $queryBuilderFilter($filters->buildQueryArray($args['filter'] ?? []))
->select('entity');

return $this->buildPagination(
Expand All @@ -54,49 +54,6 @@ public function get(Entity $entity, string $eventName): Closure
};
}

/**
* @param mixed[] $filterTypes
*
* @return mixed[]
*/
private function buildFilterArray(array $filterTypes): array
{
$filterArray = [];

foreach ($filterTypes as $field => $filters) {
foreach ($filters as $filter => $value) {
switch ($filter) {
case FiltersDef::CONTAINS:
$filterArray[$field . '|like'] = $value;
break;
case FiltersDef::STARTSWITH:
$filterArray[$field . '|startswith'] = $value;
break;
case FiltersDef::ENDSWITH:
$filterArray[$field . '|endswith'] = $value;
break;
case FiltersDef::ISNULL:
$filterArray[$field . '|isnull'] = 'true';
break;
case FiltersDef::BETWEEN:
$filterArray[$field . '|between'] = $value['from'] . ',' . $value['to'];
break;
case FiltersDef::IN:
$filterArray[$field . '|in'] = implode(',', $value);
break;
case FiltersDef::NOTIN:
$filterArray[$field . '|notin'] = implode(',', $value);
break;
default:
$filterArray[$field . '|' . $filter] = (string) $value;
break;
}
}
}

return $filterArray;
}

/**
* @param mixed[] $aliasMap
*
Expand Down

0 comments on commit 7b183ac

Please sign in to comment.