From 5863f97639fd90e3a835e3ea32d34af65eaa9fab Mon Sep 17 00:00:00 2001 From: Carsten Radeck Date: Fri, 28 Jul 2023 10:23:20 +0200 Subject: [PATCH] Combine multiple facets to or query --- Classes/Service/SolrServiceProvider.php | 50 +++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/Classes/Service/SolrServiceProvider.php b/Classes/Service/SolrServiceProvider.php index b1a32067..cc5e917a 100644 --- a/Classes/Service/SolrServiceProvider.php +++ b/Classes/Service/SolrServiceProvider.php @@ -427,6 +427,9 @@ protected function addFacetFilters(array $arguments): array $activeFacets = $this->getActiveFacets($arguments); $activeFacetsForTemplate = []; foreach ($activeFacets as $facetID => $facets) { + + $combineFacets = []; + foreach ($facets as $facetTerm => $facetInfo) { $facetQuery = $this->getFacetQuery($this->getFacetConfig($facetID), $facetTerm, $facetInfo['status']); if ('and' === $facetInfo['config']['queryStyle']) { @@ -455,11 +458,50 @@ protected function addFacetFilters(array $arguments): array // If facet.missing is active and facet is selected // set solr query to exclude all known facet values if ($facetTerm === $facetInfo['config']['labelMissing']) { - $this->query->createFilterQuery($queryInfo) - ->setQuery('-'.str_replace('("%s")', '[* TO *]', $facetInfo['config']['query'])); + $fq = $this->query->createFilterQuery($queryInfo)->setQuery('-'.str_replace('("%s")', '[* TO *]', $facetInfo['config']['query'])); + // in newer Solarium version, tags have to be set explicitly and are no longer considered when calling query->createFilterQuery($queryInfo) + if ($queryInfo['tag']) { + $fq->addTag($queryInfo['tag']); + } } else { - $this->query->createFilterQuery($queryInfo) - ->setQuery($facetQuery); + if($facetInfo['status'] !== '1') { + $fq = $this->query->createFilterQuery($queryInfo)->setQuery($facetQuery); + if ($queryInfo['tag']) { + $fq->addTag($queryInfo['tag']); + } + } else { + if(!is_array($combineFacets[$facetInfo['id']])) { + $combineFacets[$facetInfo['id']] = [ 'query' => $facetQuery, 'info' => $facetInfo ]; + + $fq = $this->query->createFilterQuery($queryInfo)->setQuery($facetQuery); + if ($queryInfo['tag']) { + $fq->addTag($queryInfo['tag']); + } + } else { + $combineFacets[$facetInfo['id']]['query'] .= ' OR ' . $facetQuery; + + $filterQueries = $this->query->getFilterQueries(); + + $removed = false; + + /** @var FilterQuery $filterQuery */ + foreach($filterQueries as $filterQuery) { + if(in_array('facet-'.$facetInfo['id'], $filterQuery->getTags())) { + $this->query->removeFilterQuery($filterQuery); + + $removed = true; + } + } + + if($removed) { + $fq = $this->query->createFilterQuery($queryInfo) + ->setQuery($combineFacets[$facetInfo['id']]['query']); + if ($queryInfo['tag']) { + $fq->addTag($queryInfo['tag']); + } + } + } + } } }