Skip to content

Commit

Permalink
Merge pull request PrestaShop#14246 from sarjon/filters-applicator
Browse files Browse the repository at this point in the history
Add doctrine filters applicator
  • Loading branch information
PierreRambaud authored and mbadrani committed Jul 18, 2019
2 parents f74846d + 87c2376 commit 229130e
Show file tree
Hide file tree
Showing 6 changed files with 222 additions and 24 deletions.
87 changes: 87 additions & 0 deletions src/Core/Grid/Query/Filter/DoctrineFilterApplicator.php
@@ -0,0 +1,87 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/

namespace PrestaShop\PrestaShop\Core\Grid\Query\Filter;

use Doctrine\DBAL\Query\QueryBuilder;

final class DoctrineFilterApplicator implements DoctrineFilterApplicatorInterface
{
/**
* {@inheritdoc}
*/
public function apply(QueryBuilder $qb, SqlFilters $filters, array $filterValues)
{
if (empty($filterValues)) {
return;
}

foreach ($filters->getFilters() as $filter) {
$sqlField = $filter['sql_field'];
$filterName = $filter['filter_name'];

if (!isset($filterValues[$filterName])) {
continue;
}

$value = $filterValues[$filterName];

switch ($filter['comparison']) {
case SqlFilters::WHERE_STRICT:
$qb->andWhere("$sqlField = :$filterName");
$qb->setParameter($filterName, $value);

break;
case SqlFilters::WHERE_LIKE:
$qb->andWhere("$sqlField LIKE :$filterName");
$qb->setParameter($filterName, '%' . $value . '%');

break;
case SqlFilters::HAVING_LIKE:
$qb->andHaving("$sqlField LIKE :$filterName");
$qb->setParameter($filterName, '%' . $value . '%');

break;
case SqlFilters::WHERE_DATE:
if (isset($value['from'])) {
$name = sprintf('%s_from', $filterName);

$qb->andWhere("$sqlField >= :$name");
$qb->setParameter($name, sprintf('%s %s', $value['from'], '0:0:0'));
}

if (isset($value['to'])) {
$name = sprintf('%s_to', $filterName);

$qb->andWhere("$sqlField <= :$name");
$qb->setParameter($name, sprintf('%s %s', $value['to'], '23:59:59'));
}

break;
}
}
}
}
42 changes: 42 additions & 0 deletions src/Core/Grid/Query/Filter/DoctrineFilterApplicatorInterface.php
@@ -0,0 +1,42 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/

namespace PrestaShop\PrestaShop\Core\Grid\Query\Filter;

use Doctrine\DBAL\Query\QueryBuilder;

/**
* Interface for service that applies filters for Doctrine query builder
*/
interface DoctrineFilterApplicatorInterface
{
/**
* @param QueryBuilder $qb
* @param SqlFilters $filters
* @param array $filterValues
*/
public function apply(QueryBuilder $qb, SqlFilters $filters, array $filterValues);
}
67 changes: 67 additions & 0 deletions src/Core/Grid/Query/Filter/SqlFilters.php
@@ -0,0 +1,67 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/

namespace PrestaShop\PrestaShop\Core\Grid\Query\Filter;

/**
* Stores filters to be applied on SQL query
*/
final class SqlFilters
{
const WHERE_STRICT = 1;
const WHERE_LIKE = 2;
const HAVING_LIKE = 3;
const WHERE_DATE = 4;

/** @var array */
private $filters = [];

/**
* @param string $filterName
* @param string $sqlField
* @param int $comparison
*
* @return self
*/
public function addFilter($filterName, $sqlField, $comparison = self::WHERE_STRICT)
{
$this->filters[] = [
'filter_name' => $filterName,
'sql_field' => $sqlField,
'comparison' => $comparison,
];

return $this;
}

/**
* @return array
*/
public function getFilters()
{
return $this->filters;
}
}
37 changes: 22 additions & 15 deletions src/Core/Grid/Query/WebserviceKeyQueryBuilder.php
Expand Up @@ -28,6 +28,8 @@

use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Query\QueryBuilder;
use PrestaShop\PrestaShop\Core\Grid\Query\Filter\DoctrineFilterApplicatorInterface;
use PrestaShop\PrestaShop\Core\Grid\Query\Filter\SqlFilters;
use PrestaShop\PrestaShop\Core\Grid\Search\SearchCriteriaInterface;

/**
Expand All @@ -45,23 +47,32 @@ final class WebserviceKeyQueryBuilder extends AbstractDoctrineQueryBuilder
*/
private $contextShopIds;

/**
* @var DoctrineFilterApplicatorInterface
*/
private $doctrineFilterApplicator;

/**
* WebserviceKeyQueryBuilder constructor.
*
* @param Connection $connection
* @param $dbPrefix
* @param DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator
* @param array $contextShopIds
* @param DoctrineFilterApplicatorInterface $doctrineFilterApplicator
*/
public function __construct(
Connection $connection,
$dbPrefix,
DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator,
array $contextShopIds
array $contextShopIds,
DoctrineFilterApplicatorInterface $doctrineFilterApplicator
) {
parent::__construct($connection, $dbPrefix);
$this->searchCriteriaApplicator = $searchCriteriaApplicator;
$this->contextShopIds = $contextShopIds;
$this->connection = $connection;
$this->doctrineFilterApplicator = $doctrineFilterApplicator;
}

/**
Expand Down Expand Up @@ -110,22 +121,18 @@ private function getQueryBuilder(array $filters)
$this->dbPrefix . 'webservice_account_shop',
'was',
'was.`id_webservice_account` = wa.`id_webservice_account`'
);

$qb->andWhere('was.`id_shop` IN (:shops)');

$qb->setParameter('shops', $this->contextShopIds, Connection::PARAM_INT_ARRAY);

foreach ($filters as $filterName => $value) {
if ('active' === $filterName && is_numeric($value)) {
$qb->andWhere('wa.`active`=' . (int) $value);
)
->andWhere('was.`id_shop` IN (:shops)')
->setParameter('shops', $this->contextShopIds, Connection::PARAM_INT_ARRAY)
;

continue;
}
$sqlFilters = (new SqlFilters())
->addFilter('key', 'wa.key', SqlFilters::WHERE_LIKE)
->addFilter('active', 'wa.active', SqlFilters::WHERE_STRICT)
->addFilter('description', 'wa.description', SqlFilters::WHERE_LIKE)
;

$qb->andWhere('wa.`' . $filterName . '` LIKE :' . $filterName);
$qb->setParameter($filterName, '%' . $value . '%');
}
$this->doctrineFilterApplicator->apply($qb, $sqlFilters, $filters);

return $qb;
}
Expand Down
3 changes: 3 additions & 0 deletions src/PrestaShopBundle/Resources/config/services/core/grid.yml
Expand Up @@ -39,3 +39,6 @@ services:
class: 'PrestaShop\PrestaShop\Core\Grid\Position\GridPositionUpdater'
arguments:
- '@prestashop.core.grid.position.update_handler.doctrine_position_update_handler'

prestashop.core.grid.query.filter.doctrine_filter_applicator:
class: 'PrestaShop\PrestaShop\Core\Grid\Query\Filter\DoctrineFilterApplicator'
Expand Up @@ -22,6 +22,7 @@ services:
arguments:
- '@prestashop.core.query.doctrine_search_criteria_applicator'
- '@=service("prestashop.adapter.shop.context").getContextListShopID()'
- '@prestashop.core.grid.query.filter.doctrine_filter_applicator'
public: true

prestashop.core.grid.query_builder.meta:
Expand All @@ -33,15 +34,6 @@ services:
- "@=service('prestashop.adapter.legacy.context').getContext().shop.id"
public: true

prestashop.core.grid.query_builder.webservice:
class: 'PrestaShop\PrestaShop\Core\Grid\Query\WebserviceKeyQueryBuilder'
parent: 'prestashop.core.grid.abstract_query_builder'
arguments:
- '@prestashop.core.query.doctrine_search_criteria_applicator'
- "@=service('prestashop.adapter.legacy.context').getContext().language.id"
- "@=service('prestashop.adapter.legacy.context').getContext().shop.id"
public: true

prestashop.core.grid.query_builder.employee:
class: 'PrestaShop\PrestaShop\Core\Grid\Query\EmployeeQueryBuilder'
parent: 'prestashop.core.grid.abstract_query_builder'
Expand Down

0 comments on commit 229130e

Please sign in to comment.