src/Component/Elasticsearch/Form/Resolver/ListProductsFacetsResolver.php line 15

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace BitBag\OpenMarketplace\Component\Elasticsearch\Form\Resolver;
  4. use BitBag\OpenMarketplace\Component\Elasticsearch\QueryBuilder\ListProductsQueryBuilderInterface;
  5. use BitBag\SyliusElasticsearchPlugin\Facet\RegistryInterface;
  6. use Elastica\Aggregation\Filter as FilterAggregation;
  7. use Elastica\Query\BoolQuery;
  8. use FOS\ElasticaBundle\Finder\PaginatedFinderInterface;
  9. use Pagerfanta\Pagerfanta;
  10. use Symfony\Component\Form\FormEvent;
  11. final class ListProductsFacetsResolver implements ListProductsFacetsResolverInterface
  12. {
  13.     public function __construct(
  14.         private ListProductsQueryBuilderInterface $queryBuilder,
  15.         private RegistryInterface $facetRegistry,
  16.         private PaginatedFinderInterface $finder
  17.     ) {
  18.     }
  19.     public function resolveFacets(FormEvent $event): Pagerfanta
  20.     {
  21.         $query $this->queryBuilder->getQuery($event);
  22.         $eventData $event->getData() ?? [];
  23.         $rangeFilters = [];
  24.         foreach ($eventData['filters'] ?? [] as $facetId => $selectedBuckets) {
  25.             if (!empty($selectedBuckets) && is_array($selectedBuckets)
  26.                 && (array_key_exists('min'$selectedBuckets) || array_key_exists('max'$selectedBuckets))
  27.             ) {
  28.                 $rangeFilters[(string) $facetId] = $selectedBuckets;
  29.             }
  30.         }
  31.         foreach ($this->facetRegistry->getFacets() as $facetId => $facet) {
  32.             $aggregation $facet->getAggregation()->setName((string) $facetId);
  33.             $otherRanges array_diff_key($rangeFilters, [(string) $facetId => true]);
  34.             if (!empty($otherRanges)) {
  35.                 $filterBool = new BoolQuery();
  36.                 foreach ($otherRanges as $rfId => $rfBuckets) {
  37.                     try {
  38.                         $rangeFacet $this->facetRegistry->getFacetById($rfId);
  39.                         $filterBool->addFilter($rangeFacet->getQuery($rfBuckets));
  40.                     } catch (\Exception $e) {
  41.                         continue;
  42.                     }
  43.                 }
  44.                 $aggregation->setName('_inner');
  45.                 $filterAgg = new FilterAggregation((string) $facetId$filterBool);
  46.                 $filterAgg->addAggregation($aggregation);
  47.                 $query->addAggregation($filterAgg);
  48.             } else {
  49.                 $query->addAggregation($aggregation);
  50.             }
  51.         }
  52.         $query->setSize(0);
  53.         return $this->finder->findPaginated($query);
  54.     }
  55. }