You are here

function apachesolr_search_finalize_query in Apache Solr Search 6.2

Implementation of hook_finalize_query().

Handle OR facets.

File

./apachesolr_search.module, line 250
Provides a content search implementation for node content for use with the Apache Solr search application.

Code

function apachesolr_search_finalize_query(&$query, &$params) {
  $ors = array();
  $facet_info = apachesolr_get_facet_definitions();
  foreach ($facet_info as $infos) {
    foreach ($infos as $delta => $facet) {
      if ($facet['operator'] == 'OR') {
        $ors[] = $delta;
      }
    }
  }
  if (isset($params['fq'])) {
    $filter_queries = $params['fq'];
    foreach ($filter_queries as $delta => $values) {
      $fq = $tag = '';
      $op = 'AND';
      $fields = array(
        $delta,
      );

      // CCK and taxonomy facet field block deltas are not the same as their Solr index field names.
      if (strpos($delta, '_cck_') !== FALSE) {
        $fields[] = trim(drupal_substr($delta, 7, drupal_strlen($delta)));
      }
      elseif ($delta == 'tid') {
        if (function_exists('taxonomy_get_term')) {
          foreach ($values as $value) {
            $filters = $query
              ->filter_extract($value, 'tid');
            $term = taxonomy_get_term($filters[0]['#value']);
            $fields[] = 'im_vid_' . $term->vid;
          }
        }
      }
      if (array_intersect($fields, $ors)) {
        $tag = "{!tag={$delta}}";
        $op = 'OR';
      }
      $fq = implode(" {$op} ", $params['fq'][$delta]);
      $params['fq'][] = $tag . $fq;
      unset($params['fq'][$delta]);
    }
  }
}