/** * @return \im\search\components\query\FieldQueryInterface */ protected function getValueSearchQuery() { /** @var FacetValueInterface $value */ $value = $this; return SearchQueryHelper::getQueryInstanceFromFacetValue($value); }
/** * Return search query. * * @param string $searchableType * @param Category $category * @param SearchQueryInterface|string $searchQuery * @param array $params * @return \im\search\components\query\QueryInterface */ public function getQuery($searchableType, Category $category, $searchQuery = null, $params = []) { $searchComponent = $this->getSearchManager()->getSearchComponent(); $searchableType = $this->normalizeSearchableType($searchableType); // Parse search query if ($searchQuery && is_string($searchQuery)) { if ($searchableType instanceof QueryParserContextInterface) { $searchQuery = $searchComponent->parseQuery($searchQuery, $searchableType); } else { $searchQuery = $searchComponent->parseQuery($searchQuery); } } // Add category query to search query $categoryQuery = $this->getCategoryFieldQuery($category, $searchableType); if ($categoryQuery) { $searchQuery = $searchQuery ? SearchQueryHelper::includeQuery(clone $searchQuery, $categoryQuery) : $categoryQuery; } $query = $searchComponent->getQuery($searchableType, $searchQuery); $facets = $this->getFacets($category); $facetsFilter = null; // Exclude category query from search query, merge search query with category parents query and add it to categories facet as filter. // This will allow to calculate categories facet not for current category but also for children categories. if ($categoryQuery && array_filter($facets, function ($facet) { return $facet instanceof CategoriesFacet; })) { $facetsFilter = SearchQueryHelper::excludeQuery(clone $query->getSearchQuery(), $categoryQuery); // Search query by category parents $categoryParentsQuery = $this->getCategoryParentsQuery($category, $searchableType); if ($categoryParentsQuery) { $facetsFilter = SearchQueryHelper::includeQuery($facetsFilter, $categoryParentsQuery); } } foreach ($facets as $facet) { $facet->setContext($category); if ($facet instanceof CategoriesFacet && $facetsFilter) { $facet->setFilter($facetsFilter); if (isset($params['categoriesFacetValueRouteParams'])) { $facet->setValueRouteParams($params['categoriesFacetValueRouteParams']); } } } $query->setFacets($facets); // Exclude category query from search query as we will add category to facet route parameters if ($categoryQuery) { /** @var QueryInterface|Component $query */ $query->on(QueryInterface::EVENT_AFTER_RESULT, function (QueryResultEvent $event) use($categoryQuery) { $searchQuery = $event->queryResult->getQuery()->getSearchQuery(); if ($searchQuery) { $event->queryResult->getQuery()->setSearchQuery(SearchQueryHelper::excludeQuery($searchQuery, $categoryQuery)); } }); } return $query; }