You are here

public function ElasticsearchViewsQuery::execute in Elasticsearch Connector 8.2

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.5 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 414

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.
    }

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

    // Store results.
    if (!empty($response['hits']['hits'])) {
      $item_index = 0;
      foreach ($response['hits']['hits'] as $doc) {
        $result_doc = array();
        foreach ($doc['fields'] as $field_name => $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);
        }
        $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;
  }
}