You are here

public function elasticsearch_connector_views_query::build in Elasticsearch Connector 7.2

Same name and namespace in other branches
  1. 7.5 modules/elasticsearch_connector_views/elasticsearch_connector_views_query.inc \elasticsearch_connector_views_query::build()
  2. 7 modules/elasticsearch_connector_views/elasticsearch_connector_views_query.inc \elasticsearch_connector_views_query::build()

Builds the necessary info to execute the query.

Parameters

view $view: The view which is executed.

Overrides views_plugin_query::build

File

modules/elasticsearch_connector_views/elasticsearch_connector_views_query.inc, line 35
Class for handling a view that gets its data not from the database, but from a Solr server.

Class

elasticsearch_connector_views_query
@file Class for handling a view that gets its data not from the database, but from a Solr server.

Code

public function build(&$view) {
  $view
    ->init_pager();

  // Let the pager modify the query to add limits.
  $this->pager
    ->query();

  // Set aliases of the fields.
  foreach ($view->field as $field_name => &$field) {
    $field->field_alias = $field_name;
    $field->aliases['entity_type'] = 'entity_type';
  }

  // Add fields to the query so they will be shown in solr document.
  $this->params['fields'] = array_keys($view->field);
  $this->params['fields'][] = '_source';
  $params = array();
  if (isset($this->params['q']) && !empty($this->params['q'])) {

    // If we have more than one field we make a multi match query
    if (count($this->params['fields']) > 1) {
      $params['query']['multi_match'] = array(
        'query' => $this->params['q'],
        'fields' => array_values($this->params['fulltext_fields']),
      );
    }
    else {
      $params['query']['match'] = array(
        reset($this->params['fulltext_fields']) => array(
          'query' => $this->params['q'],
          'operator' => $this->params['fulltext_operator'],
        ),
      );
    }
  }
  $params['size'] = $this->pager->options['items_per_page'];
  $params['from'] = $this->pager->current_page * $this->pager->options['items_per_page'];

  // If we display all items without pager remove the size limit to return
  // all documents from elasticsearch.
  if ($params['size'] == 0) {
    unset($params['size']);
  }

  // Add fields.
  // We are specifying which fields to be visible!
  $params['fields'] = array();
  if (isset($this->params['fields'])) {
    $params['fields'] = array_merge($params['fields'], $this->params['fields']);
  }
  $where = $this->where;
  $params['filter'] = $this
    ->build_filter_array($where);

  // Elastic complains when there is an empty filter array
  if (empty($params['filter'])) {
    unset($params['filter']);
  }

  // if a filter and query is set, combine them into a filtered query
  if (isset($params['filter']) && isset($params['query'])) {
    $temp = $params['query'];
    unset($params['query']);
    $params['query']['filtered'] = array(
      'query' => $temp,
      'filter' => $params['filter'],
    );
    unset($params['filter']);
  }

  // Add sorting.
  if (!empty($this->sort_fields)) {
    $params['sort'] = $this
      ->build_sort_array();
  }
  $this->query_params = $params;

  // Export parameters for preview.
  $view->build_info['query'] = var_export($params, TRUE);
}