You are here

public function ElasticsearchViewsQuery::execute in Elasticsearch Connector 8.5

Same name and namespace in other branches
  1. 8.7 modules/elasticsearch_connector_views/src/Plugin/views/query/ElasticsearchViewsQuery.php \Drupal\elasticsearch_connector_views\Plugin\views\query\ElasticsearchViewsQuery::execute()
  2. 8.2 modules/elasticsearch_connector_views/src/Plugin/views/query/ElasticsearchViewsQuery.php \Drupal\elasticsearch_connector_views\Plugin\views\query\ElasticsearchViewsQuery::execute()
  3. 8.6 modules/elasticsearch_connector_views/src/Plugin/views/query/ElasticsearchViewsQuery.php \Drupal\elasticsearch_connector_views\Plugin\views\query\ElasticsearchViewsQuery::execute()

Executes the query and fills the associated view object with according values.

Values to set: $view->result, $view->total_rows, $view->execute_time, $view->pager['current_page'].

$view->result should contain an array of objects. The array must use a numeric index starting at 0.

Parameters

view $view: The view which is executed.

Overrides QueryPluginBase::execute

File

modules/elasticsearch_connector_views/src/Plugin/views/query/ElasticsearchViewsQuery.php, line 416

Class

ElasticsearchViewsQuery
Defines a Views query class for searching on Search API indexes.

Namespace

Drupal\elasticsearch_connector_views\Plugin\views\query

Code

public function execute(ViewExecutable $view) {
  $view->result = array();
  $view->total_rows = 0;
  $view->execute_time = 0;
  $index = $this
    ->getIndex();
  $type = $this
    ->getSearchTypes();
  try {
    $start = microtime(TRUE);
    $client = $this->elasticsearchClient;
    if ($client) {
      $view->execute_time = microtime(TRUE) - $start;
    }

    // Execute the search.
    $response = $client
      ->search(array(
      'index' => $index,
      'type' => $type,
      'body' => $this->query_params,
    ))
      ->getRawResponse();

    // Store results.
    if (!empty($response['hits']['hits'])) {
      $item_index = 0;
      foreach ($response['hits']['hits'] as $doc) {
        $result_doc = array();
        foreach ($doc['_source'] as $field_name => $field_value) {
          if (is_array($field_value)) {

            // TODO: Handle this by implementing the Multivalue interface in D8
            // Handle multivalue with concatenation for now.
            $result_doc[$field_name] = implode(' | ', $field_value);
          }
          else {
            $result_doc[$field_name] = $field_value;
          }
        }
        $result_doc['_source'] = $doc['_source'];
        $result_doc['index'] = $item_index;
        $view->result[] = new ResultRow($result_doc);

        // Increment the index item.
        $item_index++;
      }
    }

    // $view->result = iterator_to_array($view->result);
    // Store the results.
    $view->pager->total_items = $view->total_rows = $response['hits']['total'];
    $view->pager
      ->updatePageInfo();

    // We shouldn't use $results['performance']['complete'] here, since
    // extracting the results probably takes considerable time as well.
    $view->execute_time = $response['took'];
  } catch (\Exception $e) {
    $this->errors[] = $e
      ->getMessage();
  }
  if ($this->errors) {
    foreach ($this->errors as $msg) {
      drupal_set_message($msg, 'error');
    }
    $view->result = array();
    $view->total_rows = 0;
    $view->execute_time = 0;
  }
}