vendor/ibexa/search/src/lib/EventDispatcher/EventListener/ContentSuggestionSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Search\EventDispatcher\EventListener;
  8. use Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException;
  9. use Ibexa\Contracts\Core\Repository\Values\Content\Query;
  10. use Ibexa\Contracts\Search\Event\BuildSuggestionCollectionEvent;
  11. use Ibexa\Contracts\Search\Mapper\SearchHitToContentSuggestionMapperInterface;
  12. use Ibexa\Contracts\Search\SortingDefinition\SortingDefinitionRegistryInterface;
  13. use Ibexa\Core\Repository\SiteAccessAware\SearchService;
  14. use Psr\Log\LoggerAwareInterface;
  15. use Psr\Log\LoggerAwareTrait;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. final class ContentSuggestionSubscriber implements EventSubscriberInterfaceLoggerAwareInterface
  18. {
  19.     use LoggerAwareTrait;
  20.     private SearchService $searchService;
  21.     private SearchHitToContentSuggestionMapperInterface $contentSuggestionMapper;
  22.     private SortingDefinitionRegistryInterface $sortingDefinitionRegistry;
  23.     public function __construct(
  24.         SearchService $searchService,
  25.         SearchHitToContentSuggestionMapperInterface $contentSuggestionMapper,
  26.         SortingDefinitionRegistryInterface $sortingDefinitionRegistry
  27.     ) {
  28.         $this->searchService $searchService;
  29.         $this->contentSuggestionMapper $contentSuggestionMapper;
  30.         $this->sortingDefinitionRegistry $sortingDefinitionRegistry;
  31.     }
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             BuildSuggestionCollectionEvent::class => 'onBuildSuggestionCollectionEvent',
  36.         ];
  37.     }
  38.     public function onBuildSuggestionCollectionEvent(
  39.         BuildSuggestionCollectionEvent $event
  40.     ): BuildSuggestionCollectionEvent {
  41.         $query $event->getQuery();
  42.         $value $query->getQuery();
  43.         $limit $query->getLimit();
  44.         $language $query->getLanguageCode();
  45.         $query $this->getQuery($value$limit);
  46.         try {
  47.             $languageFilter $language ? ['languages' => [$language]] : [];
  48.             $searchResult $this->searchService->findContent($query$languageFilter);
  49.             $suggestionCollection $event->getSuggestionCollection();
  50.             foreach ($searchResult as $result) {
  51.                 $contentSuggestion $this->contentSuggestionMapper->map($result);
  52.                 if ($contentSuggestion === null) {
  53.                     continue;
  54.                 }
  55.                 $suggestionCollection->append($contentSuggestion);
  56.             }
  57.             $suggestionCollection->increaseTotalCount($searchResult->totalCount ?? 0);
  58.         } catch (InvalidArgumentException $e) {
  59.             $this->logger->error($e);
  60.         }
  61.         return $event;
  62.     }
  63.     private function getQuery(string $valueint $limit): Query
  64.     {
  65.         $query = new Query();
  66.         $query->query = new Query\Criterion\FullText($value);
  67.         $query->limit $limit;
  68.         $defaultSortClauses $this->sortingDefinitionRegistry->getDefaultSortingDefinition();
  69.         if ($defaultSortClauses !== null) {
  70.             $query->sortClauses $defaultSortClauses->getSortClauses();
  71.         }
  72.         return $query;
  73.     }
  74. }