You are here

protected function SearchApiElasticsearchConnector::getFilter in Elasticsearch Connector 7.2

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

Get filter by associative array.

1 call to SearchApiElasticsearchConnector::getFilter()
SearchApiElasticsearchConnector::parseFilter in modules/elasticsearch_connector_search_api/service.inc
Recursively parse Search API filters.

File

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

Class

SearchApiElasticsearchConnector
Search service class.

Code

protected function getFilter(array $filter_assoc, $index_fields) {
  $field_type = $index_fields[$filter_assoc['field_id']]['type'];
  $type = self::FILTER_TYPE;

  // Handles "empty", "not empty" operators.
  if (!isset($filter_assoc['filter_value'])) {
    switch ($filter_assoc['filter_operator']) {
      case '<>':
        $filter = array(
          'exists' => array(
            'field' => $filter_assoc['field_id'],
          ),
        );
        break;
      case '=':
        $filter = array(
          'not' => array(
            'filter' => array(
              'exists' => array(
                'field' => $filter_assoc['field_id'],
              ),
            ),
          ),
        );
        break;
      default:
        throw new Exception(t('Value is empty for :field_id! Incorrect filter criteria is using for searching!', array(
          ':field_id' => $filter_assoc['field_id'],
        )));
    }
  }
  elseif (!search_api_is_text_type($field_type)) {
    switch ($filter_assoc['filter_operator']) {
      case '=':
        $filter = array(
          'term' => array(
            $filter_assoc['field_id'] => $filter_assoc['filter_value'],
          ),
        );
        break;
      case '<>':
        $filter = array(
          'not' => array(
            'filter' => array(
              'term' => array(
                $filter_assoc['field_id'] => $filter_assoc['filter_value'],
              ),
            ),
          ),
        );
        break;
      case '>':
        $filter = array(
          'range' => array(
            $filter_assoc['field_id'] => array(
              'from' => $filter_assoc['filter_value'],
              'to' => NULL,
              'include_lower' => FALSE,
              'include_upper' => FALSE,
            ),
          ),
        );
        break;
      case '>=':
        $filter = array(
          'range' => array(
            $filter_assoc['field_id'] => array(
              'from' => $filter_assoc['filter_value'],
              'to' => NULL,
              'include_lower' => TRUE,
              'include_upper' => FALSE,
            ),
          ),
        );
        break;
      case '<':
        $filter = array(
          'range' => array(
            $filter_assoc['field_id'] => array(
              'from' => NULL,
              'to' => $filter_assoc['filter_value'],
              'include_lower' => FALSE,
              'include_upper' => FALSE,
            ),
          ),
        );
        break;
      case '<=':
        $filter = array(
          'range' => array(
            $filter_assoc['field_id'] => array(
              'from' => NULL,
              'to' => $filter_assoc['filter_value'],
              'include_lower' => FALSE,
              'include_upper' => TRUE,
            ),
          ),
        );
        break;
      case '*':
        $type = self::QUERY_TYPE;
        $filter = array(
          'wildcard' => array(
            $filter_assoc['field_id'] => $filter_assoc['filter_value'],
          ),
        );
        break;
      default:
        throw new Exception(t('Undefined operator :field_operator for :field_id field! Incorrect filter criteria is using for searching!', array(
          ':field_operator' => $filter_assoc['filter_operator'],
          ':field_id' => $filter_assoc['field_id'],
        )));
        break;
    }
  }
  else {

    // Handle the freetext search filters when the $query->condition(...) has been used with a fulltext field.
    $type = self::QUERY_TYPE;
    switch ($filter_assoc['filter_operator']) {
      case '=':
        $filter = array(
          'match' => array(
            $filter_assoc['field_id'] => array(
              'query' => $filter_assoc['filter_value'],
              'operator' => 'and',
            ),
          ),
        );
        break;
      case '*':
        $filter = array(
          'wildcard' => array(
            $filter_assoc['field_id'] => $filter_assoc['filter_value'],
          ),
        );
        break;
      default:
        throw new Exception(t('Undefined operator :field_operator for :field_id field! Incorrect filter criteria is using for searching!', array(
          ':field_operator' => $filter_assoc['filter_operator'],
          ':field_id' => $filter_assoc['field_id'],
        )));
        break;
    }
  }
  return array(
    $type,
    $filter,
  );
}