Skip to content

Commit

Permalink
feat: remove static generator & provide a way to cache query (#677)
Browse files Browse the repository at this point in the history
  • Loading branch information
Simperfit authored and dunglas committed Aug 25, 2016
1 parent e249b33 commit 3c49700
Show file tree
Hide file tree
Showing 32 changed files with 524 additions and 340 deletions.
5 changes: 3 additions & 2 deletions src/Bridge/Doctrine/Orm/CollectionDataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryResultExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
use Doctrine\Common\Persistence\ManagerRegistry;
Expand Down Expand Up @@ -50,9 +51,9 @@ public function getCollection(string $resourceClass, string $operationName = nul

$repository = $manager->getRepository($resourceClass);
$queryBuilder = $repository->createQueryBuilder('o');

$queryNameGenerator = new QueryNameGenerator();
foreach ($this->collectionExtensions as $extension) {
$extension->applyToCollection($queryBuilder, $resourceClass, $operationName);
$extension->applyToCollection($queryBuilder, $queryNameGenerator, $resourceClass, $operationName);

if ($extension instanceof QueryResultExtensionInterface) {
if ($extension->supportsResult($resourceClass, $operationName)) {
Expand Down
5 changes: 3 additions & 2 deletions src/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Extension;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Doctrine\ORM\QueryBuilder;

Expand All @@ -25,15 +26,15 @@ final class EagerLoadingExtension implements QueryCollectionExtensionInterface,
/**
* {@inheritdoc}
*/
public function applyToCollection(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$this->joinRelations($queryBuilder, $resourceClass);
}

/**
* {@inheritdoc}
*/
public function applyToItem(QueryBuilder $queryBuilder, string $resourceClass, array $identifiers, string $operationName = null)
public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null)
{
$this->joinRelations($queryBuilder, $resourceClass);
}
Expand Down
5 changes: 3 additions & 2 deletions src/Bridge/Doctrine/Orm/Extension/FilterExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use ApiPlatform\Core\Api\FilterCollection;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\FilterInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
use Doctrine\ORM\QueryBuilder;

Expand All @@ -36,7 +37,7 @@ public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFa
/**
* {@inheritdoc}
*/
public function applyToCollection(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$resourceMetadata = $this->resourceMetadataFactory->create($resourceClass);
$resourceFilters = $resourceMetadata->getCollectionOperationAttribute($operationName, 'filters', [], true);
Expand All @@ -47,7 +48,7 @@ public function applyToCollection(QueryBuilder $queryBuilder, string $resourceCl

foreach ($this->filters as $filterName => $filter) {
if (in_array($filterName, $resourceFilters) && $filter instanceof FilterInterface) {
$filter->apply($queryBuilder, $resourceClass, $operationName);
$filter->apply($queryBuilder, $queryNameGenerator, $resourceClass, $operationName);
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/Bridge/Doctrine/Orm/Extension/OrderExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Extension;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\ORM\QueryBuilder;

/**
Expand All @@ -31,7 +32,7 @@ public function __construct(string $order = null)
/**
* {@inheritdoc}
*/
public function applyToCollection(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$classMetaData = $queryBuilder->getEntityManager()->getClassMetadata($resourceClass);
$identifiers = $classMetaData->getIdentifier();
Expand Down
3 changes: 2 additions & 1 deletion src/Bridge/Doctrine/Orm/Extension/PaginationExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryChecker;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
use Doctrine\Common\Persistence\ManagerRegistry;
Expand Down Expand Up @@ -57,7 +58,7 @@ public function __construct(ManagerRegistry $managerRegistry, RequestStack $requ
/**
* {@inheritdoc}
*/
public function applyToCollection(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$request = $this->requestStack->getCurrentRequest();
if (null === $request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Extension;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\ORM\QueryBuilder;

/**
Expand All @@ -26,5 +27,5 @@ interface QueryCollectionExtensionInterface
* @param string $resourceClass
* @param string $operationName
*/
public function applyToCollection(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null);
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Extension;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\ORM\QueryBuilder;

/**
Expand All @@ -27,5 +28,5 @@ interface QueryItemExtensionInterface
* @param array $identifiers
* @param string|null $operationName
*/
public function applyToItem(QueryBuilder $queryBuilder, string $resourceClass, array $identifiers, string $operationName = null);
public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null);
}
13 changes: 7 additions & 6 deletions src/Bridge/Doctrine/Orm/Filter/AbstractFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Core\Exception\InvalidArgumentException;
use ApiPlatform\Core\Util\RequestParser;
use Doctrine\Common\Persistence\ManagerRegistry;
Expand Down Expand Up @@ -180,22 +180,23 @@ protected function extractProperties(Request $request) : array
/**
* Adds the necessary joins for a nested property.
*
* @param string $property
* @param string $rootAlias
* @param QueryBuilder $queryBuilder
* @param string $property
* @param string $rootAlias
* @param QueryBuilder $queryBuilder
* @param QueryNameGeneratorInterface $queryNameGenerator
*
* @throws InvalidArgumentException If property is not nested
*
* @return array An array where the first element is the join $alias of the leaf entity,
* and the second element is the $field name
*/
protected function addJoinsForNestedProperty(string $property, string $rootAlias, QueryBuilder $queryBuilder) : array
protected function addJoinsForNestedProperty(string $property, string $rootAlias, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator) : array
{
$propertyParts = $this->splitPropertyParts($property);
$parentAlias = $rootAlias;

foreach ($propertyParts['associations'] as $association) {
$alias = QueryNameGenerator::generateJoinAlias($association);
$alias = $queryNameGenerator->generateJoinAlias();
$queryBuilder->leftJoin(sprintf('%s.%s', $parentAlias, $association), $alias);
$parentAlias = $alias;
}
Expand Down
11 changes: 4 additions & 7 deletions src/Bridge/Doctrine/Orm/Filter/BooleanFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\DBAL\Types\Type as DBALType;
use Doctrine\ORM\QueryBuilder;
Expand All @@ -24,9 +24,6 @@
*/
class BooleanFilter extends AbstractFilter
{
/*
* @var RequestStack
*/
private $requestStack;

public function __construct(ManagerRegistry $managerRegistry, RequestStack $requestStack, array $properties = null)
Expand All @@ -44,7 +41,7 @@ public function __construct(ManagerRegistry $managerRegistry, RequestStack $requ
* For each property passed, if the resource does not have such property or if the order value is different from
* 1, 0, true, false, on, off (case insensitive) the property is ignored.
*/
public function apply(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$request = $this->requestStack->getCurrentRequest();
if (null === $request) {
Expand Down Expand Up @@ -72,9 +69,9 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
$field = $property;

if ($this->isPropertyNested($property)) {
list($alias, $field) = $this->addJoinsForNestedProperty($property, $alias, $queryBuilder);
list($alias, $field) = $this->addJoinsForNestedProperty($property, $alias, $queryBuilder, $queryNameGenerator);
}
$valueParameter = QueryNameGenerator::generateParameterName($field);
$valueParameter = $queryNameGenerator->generateParameterName();

$queryBuilder
->andWhere(sprintf('%s.%s = :%s', $alias, $field, $valueParameter))
Expand Down
25 changes: 14 additions & 11 deletions src/Bridge/Doctrine/Orm/Filter/DateFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\RequestStack;
Expand Down Expand Up @@ -53,7 +53,7 @@ public function __construct(ManagerRegistry $managerRegistry, RequestStack $requ
/**
* {@inheritdoc}
*/
public function apply(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
if (null === ($request = $this->requestStack->getCurrentRequest())) {
return;
Expand All @@ -79,7 +79,7 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
$parentAlias = $alias;

foreach ($propertyParts['associations'] as $association) {
$alias = QueryNameGenerator::generateJoinAlias($association);
$alias = $queryNameGenerator->generateJoinAlias();
$queryBuilder->join(sprintf('%s.%s', $parentAlias, $association), $alias);
$parentAlias = $alias;
}
Expand All @@ -96,6 +96,7 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
if (isset($values[self::PARAMETER_BEFORE])) {
$this->addWhere(
$queryBuilder,
$queryNameGenerator,
$alias,
$field,
self::PARAMETER_BEFORE,
Expand All @@ -107,6 +108,7 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
if (isset($values[self::PARAMETER_AFTER])) {
$this->addWhere(
$queryBuilder,
$queryNameGenerator,
$alias,
$field,
self::PARAMETER_AFTER,
Expand All @@ -120,16 +122,17 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
/**
* Adds the where clause according to the chosen null management.
*
* @param QueryBuilder $queryBuilder
* @param string $alias
* @param string $field
* @param string $operator
* @param string $value
* @param string|null $nullManagement
* @param QueryBuilder $queryBuilder
* @param QueryNameGeneratorInterface $queryNameGenerator
* @param string $alias
* @param string $field
* @param string $operator
* @param string $value
* @param string|null $nullManagement
*/
private function addWhere(QueryBuilder $queryBuilder, string $alias, string $field, string $operator, string $value, string $nullManagement = null)
private function addWhere(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, string $operator, string $value, string $nullManagement = null)
{
$valueParameter = QueryNameGenerator::generateParameterName(sprintf('%s_%s', $field, $operator));
$valueParameter = $queryNameGenerator->generateParameterName();
$baseWhere = sprintf('%s.%s %s :%s', $alias, $field, self::PARAMETER_BEFORE === $operator ? '<=' : '>=', $valueParameter);

if (null === $nullManagement || self::EXCLUDE_NULL === $nullManagement) {
Expand Down
10 changes: 6 additions & 4 deletions src/Bridge/Doctrine/Orm/Filter/FilterInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter;

use ApiPlatform\Core\Api\FilterInterface as BaseFilterInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\ORM\QueryBuilder;

/**
Expand All @@ -24,9 +25,10 @@ interface FilterInterface extends BaseFilterInterface
/**
* Applies the filter.
*
* @param QueryBuilder $queryBuilder
* @param string $resourceClass
* @param string|null $operationName
* @param QueryBuilder $queryBuilder
* @param QueryNameGeneratorInterface $queryNameGenerator
* @param string $resourceClass
* @param string|null $operationName
*/
public function apply(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null);
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null);
}
11 changes: 4 additions & 7 deletions src/Bridge/Doctrine/Orm/Filter/NumericFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\DBAL\Types\Type as DBALType;
use Doctrine\ORM\QueryBuilder;
Expand All @@ -37,9 +37,6 @@ class NumericFilter extends AbstractFilter
DBALType::SMALLINT => true,
];

/*
* @var RequestStack
*/
private $requestStack;

public function __construct(ManagerRegistry $managerRegistry, RequestStack $requestStack, array $properties = null)
Expand All @@ -56,7 +53,7 @@ public function __construct(ManagerRegistry $managerRegistry, RequestStack $requ
*
* For each property passed, if the resource does not have such property or if the value is not numerical the property is ignored.
*/
public function apply(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$request = $this->requestStack->getCurrentRequest();
if (null === $request) {
Expand All @@ -81,9 +78,9 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
$field = $property;

if ($this->isPropertyNested($property)) {
list($alias, $field) = $this->addJoinsForNestedProperty($property, $alias, $queryBuilder);
list($alias, $field) = $this->addJoinsForNestedProperty($property, $alias, $queryBuilder, $queryNameGenerator);
}
$valueParameter = QueryNameGenerator::generateParameterName($field);
$valueParameter = $queryNameGenerator->generateParameterName();

$queryBuilder
->andWhere(sprintf('%s.%s = :%s', $alias, $field, $valueParameter))
Expand Down
5 changes: 3 additions & 2 deletions src/Bridge/Doctrine/Orm/Filter/OrderFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace ApiPlatform\Core\Bridge\Doctrine\Orm\Filter;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\Request;
Expand Down Expand Up @@ -50,7 +51,7 @@ public function __construct(ManagerRegistry $managerRegistry, RequestStack $requ
* For each property passed, if the resource does not have such property or if the order value is different from
* `asc` or `desc` (case insensitive), the property is ignored.
*/
public function apply(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null)
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$request = $this->requestStack->getCurrentRequest();
if (null === $request) {
Expand All @@ -77,7 +78,7 @@ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string
$field = $property;

if ($this->isPropertyNested($property)) {
list($alias, $field) = $this->addJoinsForNestedProperty($property, $alias, $queryBuilder);
list($alias, $field) = $this->addJoinsForNestedProperty($property, $alias, $queryBuilder, $queryNameGenerator);
}

$queryBuilder->addOrderBy(sprintf('%s.%s', $alias, $field), $order);
Expand Down
Loading

0 comments on commit 3c49700

Please sign in to comment.