You are here

protected function SearchApiSolrBackend::createFilterQueries in Search API Solr 8.2

Same name and namespace in other branches
  1. 8.3 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQueries()
  2. 8 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQueries()
  3. 4.x src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQueries()

Recursively transforms conditions into a flat array of Solr filter queries.

Parameters

\Drupal\search_api\Query\ConditionGroupInterface $condition_group: The group of conditions.

array $solr_fields: The mapping from Drupal to Solr field names.

\Drupal\search_api\Item\FieldInterface[] $index_fields: The fields handled by the current index.

array $options: The query options.

Return value

array Array of filter query strings.

Throws

\Drupal\search_api\SearchApiException

2 calls to SearchApiSolrBackend::createFilterQueries()
AbstractSearchApiSolrMultilingualBackend::getFilterQueries in src/Plugin/search_api/backend/AbstractSearchApiSolrMultilingualBackend.php
Serializes a query's conditions as Solr filter queries.
SearchApiSolrBackend::getFilterQueries in src/Plugin/search_api/backend/SearchApiSolrBackend.php
Serializes a query's conditions as Solr filter queries.

File

src/Plugin/search_api/backend/SearchApiSolrBackend.php, line 2020

Class

SearchApiSolrBackend
Apache Solr backend for search api.

Namespace

Drupal\search_api_solr\Plugin\search_api\backend

Code

protected function createFilterQueries(ConditionGroupInterface $condition_group, array $solr_fields, array $index_fields, array &$options, QueryInterface $query) {
  $fq = [];
  $conditions = $condition_group
    ->getConditions();
  foreach ($conditions as $condition) {
    if ($condition instanceof ConditionInterface) {

      // Nested condition.
      $field = $condition
        ->getField();
      if (!isset($index_fields[$field])) {
        throw new SearchApiException("Filter term on unknown or unindexed field {$field}.");
      }
      $value = $condition
        ->getValue();
      $filter_query = '';
      if (strpos($solr_fields[$field], 't') === 0 && $value) {

        // Fulltext fields.
        $parse_mode_id = $query
          ->getParseMode()
          ->getPluginId();
        $keys = [
          '#conjunction' => 'OR',
          '#negation' => $condition
            ->getOperator() == '<>',
        ];
        switch ($parse_mode_id) {

          // This is a hack. We assume that the user filters for any term /
          // phrase. But this prevents an explicit selection of all terms.
          // @see https://www.drupal.org/project/search_api/issues/2991134
          case 'terms':
          case 'phrase':
            if (is_array($value)) {
              $keys += $value;
            }
            else {
              $keys[] = $value;
            }
            break;
          case 'direct':
            $keys = $value;
            break;
          default:
            throw new SearchApiSolrException('Incompatible parse mode.');
        }
        $filter_query = $this
          ->flattenKeys($keys, [
          $solr_fields[$field],
        ], $parse_mode_id);
      }
      else {

        // Non-fulltext fields or fulltext fields checked against NULL.
        $filter_query = $this
          ->createFilterQuery($solr_fields[$field], $value, $condition
          ->getOperator(), $index_fields[$field], $options);
      }
      if ($filter_query) {
        $fq[] = [
          'query' => $filter_query,
          'tags' => $condition_group
            ->getTags(),
        ];
      }
    }
    else {

      // Nested condition group.
      $nested_fqs = $this
        ->createFilterQueries($condition, $solr_fields, $index_fields, $options, $query);
      $fq = array_merge($fq, $this
        ->reduceFilterQueries($nested_fqs, $condition));
    }
  }
  return $fq;
}