diff --git a/src/Entity/Facet.php b/src/Entity/Facet.php index 19eb55c..e174402 100644 --- a/src/Entity/Facet.php +++ b/src/Entity/Facet.php @@ -162,6 +162,13 @@ class Facet extends ConfigEntityBase implements FacetInterface { */ protected $results = []; + /** + * The results. + * + * @var \Drupal\facets\Result\ResultInterface[] + */ + protected $unfiltered_results = []; + protected $active_values = []; /** @@ -532,6 +539,17 @@ class Facet extends ConfigEntityBase implements FacetInterface { } /** + * @param array $all_results + */ + public function setUnfilteredResults(array $all_results = []) { + $this->unfiltered_results = $all_results; + } + + public function getUnfilteredResults() { + return $this->unfiltered_results; + } + + /** * {@inheritdoc} */ public function isActiveValue($value) { diff --git a/src/FacetManager/DefaultFacetManager.php b/src/FacetManager/DefaultFacetManager.php index 688f9ad..c033c4c 100644 --- a/src/FacetManager/DefaultFacetManager.php +++ b/src/FacetManager/DefaultFacetManager.php @@ -159,8 +159,13 @@ class DefaultFacetManager { // Make sure we don't alter queries for facets with a different source. if ($facet->getFacetSourceId() == $this->facetSourceId) { /** @var \Drupal\facets\QueryType\QueryTypeInterface $query_type_plugin */ - $query_type_plugin = $this->queryTypePluginManager->createInstance($facet->getQueryType(), ['query' => $query, 'facet' => $facet]); - $query_type_plugin->execute(); + $query_type_plugin = $this->queryTypePluginManager + ->createInstance($facet->getQueryType(), ['query' => $query, 'facet' => $facet]); + $unfiltered_results = $query_type_plugin->execute(); + + // Save unfiltered results in facet. + $facet->setUnfilteredResults($unfiltered_results); + } } } diff --git a/src/Plugin/facets/query_type/SearchApiString.php b/src/Plugin/facets/query_type/SearchApiString.php index 7796041..e44b037 100644 --- a/src/Plugin/facets/query_type/SearchApiString.php +++ b/src/Plugin/facets/query_type/SearchApiString.php @@ -41,12 +41,26 @@ class SearchApiString extends QueryTypePluginBase { public function execute() { $query = $this->query; + $unfiltered_results = array(); + // Alter the query here. if (!empty($query)) { - $options = &$query->getOptions(); $operator = $this->facet->getQueryOperator(); - $field_identifier = $this->facet->getFieldIdentifier(); + + $query2 = $query; + $options2 = &$query2->getOptions(); + $options2['search_api_facets'][$field_identifier] = array( + 'field' => $field_identifier, + 'limit' => 50, + 'operator' => 'and', + 'min_count' => 0, + 'missing' => FALSE, + ); + $unfiltered_results = $query2->execute()->getExtraData('search_api_facets'); + + $options = &$query->getOptions(); + $options['search_api_facets'][$field_identifier] = array( 'field' => $field_identifier, 'limit' => 50, @@ -66,17 +80,27 @@ class SearchApiString extends QueryTypePluginBase { $query->addConditionGroup($filter); } } + + return $unfiltered_results; } /** * {@inheritdoc} */ public function build() { + $query_operator = $this->facet->getQueryOperator(); + if (!empty($this->results)) { $facet_results = array(); - foreach ($this->results as $result) { - if ($result['count'] || $this->facet->getQueryOperator() == 'OR') { - $facet_results[] = new Result(trim($result['filter'], '"'), trim($result['filter'], '"'), $result['count']); + foreach ($this->results as $key => $result) { + if ($result['count'] || $query_operator == 'OR') { + $count = $result['count']; + if ($query_operator === 'OR') { + $count = $this->facet->getUnfilteredResults()[$this->facet->getFieldIdentifier()][$key]['count']; + } + + $result = new Result(trim($result['filter'], '"'), trim($result['filter'], '"'), $count); + $facet_results[] = $result; } } $this->facet->setResults($facet_results); diff --git a/src/QueryType/QueryTypeInterface.php b/src/QueryType/QueryTypeInterface.php index e4a9ed3..d43e3ac 100644 --- a/src/QueryType/QueryTypeInterface.php +++ b/src/QueryType/QueryTypeInterface.php @@ -13,6 +13,9 @@ interface QueryTypeInterface { /** * Add facet info to the query using the backend native query object. + * + * @return array + * Returns an array of unfiltered results */ public function execute();