You are here

public function similar_handler_argument_nid::similar_build_query in Similar Entries 7.2

Same name and namespace in other branches
  1. 6.2 views/similar_handler_argument_nid.inc \similar_handler_argument_nid::similar_build_query()

Builds a query from argument configuration options.

Parameters

string $text: The text of the current node to be used in the query.

string $modifier: An optional FULLTEXT search modifer. ie 'IN BOOLEAN MODE'.

Return value

string A FULLTEXT expression string.

See also

similar_handler_argument_nid::query()

1 call to similar_handler_argument_nid::similar_build_query()
similar_handler_argument_nid::query in views/similar_handler_argument_nid.inc
Builds the query.

File

views/similar_handler_argument_nid.inc, line 358
Defines the Similar entries node ID argument.

Class

similar_handler_argument_nid
Defines the similar entries View node ID argument.

Code

public function similar_build_query($text, $modifier = '') {
  $query = array();
  if (!empty($modifier)) {
    $modifier = " {$modifier}";
  }
  $weight = !empty($this->options['adjust_relevance']) && isset($this->options['title_relevance']) ? $this->options['title_relevance'] : 1;
  $query[] = "({$weight} * (MATCH (node.title) AGAINST ('{$text}'{$modifier})))";

  // The body field is always included in the query if it exists.
  if (db_table_exists('field_data_body')) {
    $weight = !empty($this->options['adjust_relevance']) ? $this->options['body_relevance'] : 1;
    $body_table = $this->query
      ->add_table('field_data_body');
    if ($weight) {
      $query[] = "({$weight} * (MATCH ({$body_table}.body_value) AGAINST ('{$text}'{$modifier})))";
    }
  }

  // Add additional MATCH queries for fields if enabled.
  if (!empty($this->options['include_fields']) && module_exists('field')) {
    foreach (similar_get_indices() as $field => $info) {
      $weight = !empty($this->options['adjust_relevance']) && isset($this->options['included_fields:' . $field]) ? $this->options['included_fields:' . $field] : 1;
      if ($weight) {
        $alias = $this->query
          ->ensure_table($info['table']);
        if (empty($alias) && !empty($this->query->relationships)) {
          foreach ($this->query->relationships as $relationship => $relationship_info) {
            $alias = $this->query
              ->ensure_table($info['table'], $relationship);
            if (!empty($alias)) {
              break;
            }
          }
        }
        if (!empty($alias)) {
          $query[] = "({$weight} * (MATCH ({$alias}.{$info['column']}) AGAINST ('{$text}'{$modifier})))";
        }
      }
    }
  }

  // Return a query that calculates an average score to prevent scores from fluctuating too much.
  // We multiply the score by different amounts depending on the modifier used.
  return "((" . implode(" + ", $query) . ") / " . count($query) . ")";
}