vendor/monsieurbiz/sylius-search-plugin/src/Search/Response.php line 53

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Monsieur Biz' Search plugin for Sylius.
  4.  *
  5.  * (c) Monsieur Biz <sylius@monsieurbiz.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE.txt
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace MonsieurBiz\SyliusSearchPlugin\Search;
  12. use Elastica\ResultSet;
  13. use JoliCode\Elastically\Result;
  14. use MonsieurBiz\SyliusSearchPlugin\Model\Documentable\DocumentableInterface;
  15. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestConfiguration;
  16. use Pagerfanta\Adapter\AdapterInterface;
  17. use Pagerfanta\Pagerfanta;
  18. class Response implements ResponseInterface
  19. {
  20.     private RequestConfiguration $requestConfiguration;
  21.     private AdapterInterface $adapter;
  22.     private DocumentableInterface $documentable;
  23.     /**
  24.      * @var Pagerfanta<Result>|null
  25.      */
  26.     private ?Pagerfanta $paginator null;
  27.     private array $filters = [];
  28.     private iterable $filterBuilders;
  29.     public function __construct(
  30.         RequestConfiguration $requestConfiguration,
  31.         AdapterInterface $adapter,
  32.         DocumentableInterface $documentable,
  33.         iterable $filterBuilders
  34.     ) {
  35.         $this->requestConfiguration $requestConfiguration;
  36.         $this->adapter $adapter;
  37.         $this->documentable $documentable;
  38.         $this->filterBuilders $filterBuilders;
  39.         $this->buildFilters();
  40.     }
  41.     public function getIterator()
  42.     {
  43.         return $this->getPaginator();
  44.     }
  45.     public function count()
  46.     {
  47.         return $this->getPaginator()->getNbResults();
  48.     }
  49.     public function getFilters(): array
  50.     {
  51.         return $this->filters;
  52.     }
  53.     public function getPaginator(): Pagerfanta
  54.     {
  55.         if (null === $this->paginator) {
  56.             $this->paginator = new Pagerfanta($this->adapter);
  57.             $this->paginator->setMaxPerPage($this->requestConfiguration->getLimit());
  58.             $this->paginator->setCurrentPage($this->requestConfiguration->getPage());
  59.         }
  60.         return $this->paginator;
  61.     }
  62.     public function getDocumentable(): DocumentableInterface
  63.     {
  64.         return $this->documentable;
  65.     }
  66.     private function buildFilters(): void
  67.     {
  68.         /** @var ResultSet $results */
  69.         $results $this->getPaginator()->getCurrentPageResults();
  70.         $aggregations $results->getAggregations();
  71.         // No aggregation so don't perform filters
  72.         if (=== \count($aggregations)) {
  73.             return;
  74.         }
  75.         array_map(function ($aggregationCode$aggregationData): void {
  76.             foreach ($this->filterBuilders as $filterBuilder) {
  77.                 if (null !== $filter $filterBuilder->build($this->getDocumentable(), $this->requestConfiguration$aggregationCode$aggregationData)) {
  78.                     $this->filters[$filterBuilder->getPosition()][] = $filter;
  79.                 }
  80.             }
  81.         }, array_keys($aggregations), $aggregations);
  82.         $result = [];
  83.         ksort($this->filters);
  84.         foreach ($this->filters as $filters) {
  85.             foreach ($filters as $filter) {
  86.                 $result[] = $filter;
  87.             }
  88.         }
  89.         $this->filters array_merge(...$result);
  90.     }
  91. }