protected function SearchApiElasticsearchBackend::parseFacets in Elasticsearch Connector 8.7
Same name and namespace in other branches
- 8.5 src/Plugin/search_api/backend/SearchApiElasticsearchBackend.php \Drupal\elasticsearch_connector\Plugin\search_api\backend\SearchApiElasticsearchBackend::parseFacets()
 - 8.6 src/Plugin/search_api/backend/SearchApiElasticsearchBackend.php \Drupal\elasticsearch_connector\Plugin\search_api\backend\SearchApiElasticsearchBackend::parseFacets()
 
Parse the result set and add the facet values.
Parameters
\Drupal\search_api\Query\ResultSet $results: Result set, all items matched in a search.
\Drupal\search_api\Query\QueryInterface $query: Search API query object.
1 call to SearchApiElasticsearchBackend::parseFacets()
- SearchApiElasticsearchBackend::search in src/
Plugin/ search_api/ backend/ SearchApiElasticsearchBackend.php  - Executes a search on this server.
 
File
- src/
Plugin/ search_api/ backend/ SearchApiElasticsearchBackend.php, line 725  
Class
- SearchApiElasticsearchBackend
 - Elasticsearch Search API Backend definition.
 
Namespace
Drupal\elasticsearch_connector\Plugin\search_api\backendCode
protected function parseFacets(ResultSet $results, QueryInterface $query) {
  $response = $results
    ->getExtraData('elasticsearch_response');
  $facets = $query
    ->getOption('search_api_facets');
  // Create an empty array that will be attached to the result object.
  $attach = [];
  foreach ($facets as $key => $facet) {
    $terms = [];
    // Handle 'and' operator.
    if ($facet['operator'] == 'and' || $facet['operator'] == 'or' && !isset($response['aggregations'][$key . '_global'])) {
      if (!empty($facet['type']) && $facet['type'] == 'stats') {
        $terms = $response['aggregations'][$key];
      }
      else {
        $buckets = $response['aggregations'][$key]['buckets'];
        array_walk($buckets, function ($value) use (&$terms) {
          $terms[] = [
            'count' => $value['doc_count'],
            'filter' => '"' . $value['key'] . '"',
          ];
        });
      }
    }
    elseif ($facet['operator'] == 'or') {
      if (!empty($facet['type']) && $facet['type'] == 'stats') {
        $terms = $response['aggregations'][$key . '_global'];
      }
      else {
        $buckets = $response['aggregations'][$key . '_global'][$key]['buckets'];
        array_walk($buckets, function ($value) use (&$terms) {
          $terms[] = [
            'count' => $value['doc_count'],
            'filter' => '"' . $value['key'] . '"',
          ];
        });
      }
    }
    $attach[$key] = $terms;
  }
  $results
    ->setExtraData('search_api_facets', $attach);
}