You are here

protected function SearchApiElasticsearchConnector::getSortSearchQuery in Elasticsearch Connector 7.2

Same name and namespace in other branches
  1. 7.5 modules/elasticsearch_connector_search_api/service.inc \SearchApiElasticsearchConnector::getSortSearchQuery()
  2. 7 modules/elasticsearch_connector_search_api/service.inc \SearchApiElasticsearchConnector::getSortSearchQuery()

Helper function that return Sort for query in search.

1 call to SearchApiElasticsearchConnector::getSortSearchQuery()
SearchApiElasticsearchConnector::getSearchQueryOptions in modules/elasticsearch_connector_search_api/service.inc
Helper function return associative array with query options.

File

modules/elasticsearch_connector_search_api/service.inc, line 1698
Provides a Elasticsearch-based service class for the Search API using Elasticsearch Connector module.

Class

SearchApiElasticsearchConnector
Search service class.

Code

protected function getSortSearchQuery(SearchApiQueryInterface $query) {
  $index_fields = $this
    ->getIndexFields($query);
  $sort = array();

  // Extract Search API Location fields.
  $search_api_location = $query
    ->getOption('search_api_location');
  $spatials = array();
  if ($search_api_location) {
    foreach ($search_api_location as $spatial) {
      $spatials[$spatial['field']] = $spatial;
    }
  }
  foreach ($query
    ->getSort() as $field_id => $direction) {
    $direction = drupal_strtolower($direction);
    if ($field_id === 'search_api_relevance') {
      $sort['_score'] = $direction;
    }
    elseif (isset($index_fields[$field_id])) {

      // Check whether the field is a location field.
      if (isset($index_fields[$field_id]['real_type']) && $index_fields[$field_id]['real_type'] == 'location') {

        // Only set proximity sort if the point is set.
        if (isset($spatials[$field_id])) {
          $sort['_geo_distance'] = array(
            $field_id => array(
              'lat' => $spatials[$field_id]['lat'],
              'lon' => $spatials[$field_id]['lon'],
            ),
            'order' => $direction,
            'unit' => 'km',
            'distance_type' => 'plane',
          );
        }
      }
      else {
        $sort[$field_id] = $direction;
      }
    }
    else {
      throw new Exception(t('Incorrect sorting!.'));
    }
  }
  return $sort;
}