You are here

function search_views_handler_search_index in Views (for Drupal 7) 5

1 string reference to 'search_views_handler_search_index'
search_views_tables in modules/views_search.inc

File

modules/views_search.inc, line 26

Code

function search_views_handler_search_index($op, $filter, $filterdata, &$query) {
  switch ($op) {
    case 'handler':
      $select2 = 'i.relevance AS score';
      $search = search_parse_query($filter['value']);
      if ($search === NULL || $search[0] == '' || $search[2] == '') {
        return;
      }
      $conditions = '(' . $search[2] . ") AND i.type = 'node'";
      $arguments = array_merge($search[3], array(
        $search[4],
      ));
      $result = db_query_temporary("SELECT i.type, i.sid, SUM(i.score * t.count) AS relevance, COUNT(*) AS matches FROM {search_index} i INNER JOIN {search_total} t ON i.word = t.word {$join1} WHERE {$conditions} GROUP BY i.type, i.sid HAVING COUNT(*) >= %d", $arguments, 'temp_search_sids');

      // Calculate maximum relevance, to normalize it
      $normalize = db_result(db_query('SELECT MAX(relevance) FROM temp_search_sids'));
      if (!$normalize) {
        $query
          ->add_where("FALSE");
        return;
      }
      $select2 = str_replace('i.relevance', '(' . 1.0 / $normalize . ' * i.relevance)', $select2);

      // Second pass: only keep items that match the complicated keywords conditions (phrase search, negative keywords, ...)
      $conditions = '(' . $search[0] . ')';
      $arguments = $search[1];
      $result = db_query_temporary("SELECT i.type, i.sid, {$select2} FROM temp_search_sids i INNER JOIN {search_dataset} d ON i.sid = d.sid AND i.type = d.type {$join2} WHERE {$conditions} {$sort_parameters}", $arguments, 'temp_search_results');
      if (($count = db_result(db_query('SELECT COUNT(*) FROM temp_search_results'))) == 0) {
        $query
          ->add_where("0");
        return;
      }
      $query
        ->ensure_table('temp_search_results');
      $query
        ->add_where('temp_search_results.sid IS NOT NULL');
  }
}