You are here

protected function SearchApiElasticsearchConnector::parseFilter in Elasticsearch Connector 7.2

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

Recursively parse Search API filters.

2 calls to SearchApiElasticsearchConnector::parseFilter()
SearchApiElasticsearchConnector::getFacetSearchFilter in modules/elasticsearch_connector_search_api/service.inc
Helper function return Facet filter.
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 716
Provides a Elasticsearch-based service class for the Search API using Elasticsearch Connector module.

Class

SearchApiElasticsearchConnector
Search service class.

Code

protected function parseFilter(SearchApiQueryFilterInterface $query_filter, $index_fields, $ignored_field_id = '') {
  if (empty($query_filter)) {
    return NULL;
  }
  else {
    $conjunction = $query_filter
      ->getConjunction();
    $filters = array();
    $queries = array();
    try {
      foreach ($query_filter
        ->getFilters() as $filter_info) {
        $filter = NULL;
        $filter_type = NULL;

        // Simple filter [field_id, value, operator].
        if (is_array($filter_info)) {
          $filter_assoc = $this
            ->getAssociativeFilter($filter_info);
          $this
            ->correctFilter($filter_assoc, $index_fields, $ignored_field_id);

          // Check if we need to ignore the filter!
          if ($filter_assoc['field_id'] != $ignored_field_id) {
            list($filter_type, $filter) = $this
              ->getFilter($filter_assoc, $index_fields);
          }
          if (!empty($filter)) {
            if ($filter_type == self::FILTER_TYPE) {
              $filters[] = $filter;
            }
            elseif ($filter_type == self::QUERY_TYPE) {
              $queries[] = $filter;
            }
          }
        }
        elseif ($filter_info instanceof SearchApiQueryFilterInterface) {
          list($nested_queries, $nested_filters) = $this
            ->parseFilter($filter_info, $index_fields, $ignored_field_id);

          // TODO: handle error. - here is unnecessary cause in if we thow exceptions and this is still in try{}  .
          if (!empty($nested_filters)) {
            $filters = array_merge($filters, $nested_filters);
          }
          if (!empty($nested_queries)) {
            $queries = array_merge($queries, $nested_queries);
          }
        }
      }
      if (!empty($queries)) {
        $queries = $this
          ->normalizeFulltextQuery($queries, $conjunction);
      }
      if (!empty($filters)) {
        $filters = $this
          ->setFiltersConjunction($filters, $conjunction);
      }
    } catch (Exception $e) {
      watchdog('Elasticsearch Search API', check_plain($e
        ->getMessage()), array(), WATCHDOG_ERROR);
      drupal_set_message(check_plain($e
        ->getMessage()), 'error');
    }
    return array(
      $queries,
      $filters,
    );
  }
}