vendor/monsieurbiz/sylius-search-plugin/src/Search/Request/AggregationBuilder.php line 59

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\Request;
  12. use Elastica\Aggregation\AbstractAggregation;
  13. use MonsieurBiz\SyliusSearchPlugin\Search\Request\Aggregation\AggregationBuilderInterface;
  14. use RuntimeException;
  15. class AggregationBuilder
  16. {
  17.     /**
  18.      * @var iterable<AggregationBuilderInterface>
  19.      */
  20.     private iterable $aggregationBuilders;
  21.     public function __construct(iterable $aggregationBuilders)
  22.     {
  23.         $this->aggregationBuilders $aggregationBuilders;
  24.     }
  25.     public function buildAggregations(array $aggregations, array $filters): array
  26.     {
  27.         $buckets = [];
  28.         foreach ($aggregations as $aggregation) {
  29.             $aggregationQuery $this->buildAggregation($aggregation$filters);
  30.             if (false === $aggregationQuery) {
  31.                 continue;
  32.             }
  33.             $buckets[] = $aggregationQuery;
  34.         }
  35.         return array_filter($buckets);
  36.     }
  37.     /**
  38.      * @param string|array $aggregation
  39.      *
  40.      * @return AbstractAggregation|bool
  41.      */
  42.     private function buildAggregation($aggregation, array $filters)
  43.     {
  44.         // Don't build aggregation if the given one is empty
  45.         if (empty($aggregation)) {
  46.             return false;
  47.         }
  48.         foreach ($this->aggregationBuilders as $aggregationBuilder) {
  49.             $aggregationQuery $aggregationBuilder->build($aggregation$filters);
  50.             if (null !== $aggregationQuery) {
  51.                 return $aggregationQuery;
  52.             }
  53.         }
  54.         throw new RuntimeException('Aggregation cannot be build'); // it's throw an exception if we have not filtreable attribute
  55.     }
  56. }