query = $query;
$this->bullet = '';
if(defined('BULLET'))
{
$this->bullet = '';
}
elseif(file_exists(THEME.'images/bullet2.gif'))
{
$this->bullet = '';
}
preg_match_all('/(\W?".*?")|(.*?)(\s|$)/', $this -> query, $boolean_keys);
sort($this -> keywords['split'] = array_unique(array_filter(str_replace('"', '', array_merge($boolean_keys[1], $boolean_keys[2])))));
foreach ($this -> keywords['split'] as $k_key => $key) {
if (!$this -> stopword($key)) {
if ($key{(strlen($key) - 1)} == '*') {
$this -> keywords['wildcard'][$k_key] = TRUE;
$key = substr($key, 0, -1);
} else {
$this -> keywords['wildcard'][$k_key] = FALSE;
}
if ($key{0} == '+') {
$this -> keywords['boolean'][$k_key] = '+';
$this -> keywords['match'][$k_key] = substr($key, 1);
} else if ($key{0} == '-') {
$this -> keywords['boolean'][$k_key] = '-';
$this -> keywords['match'][$k_key] = substr($key, 1);
} else {
$this -> keywords['boolean'][$k_key] = FALSE;
$this -> keywords['match'][$k_key] = $key;
}
$this -> keywords['exact'][$k_key] = (strpos($key, ' ') !== FALSE) ? TRUE : FALSE;
$this -> keywords['match'][$k_key] = $tp -> toDB($this -> keywords['match'][$k_key]);
} else {
unset ($this -> keywords['split'][$k_key]);
}
}
}
function parsesearch($table, $return_fields, $search_fields, $weights, $handler, $no_results, $where, $order) {
global $sql, $query, $tp, $search_prefs, $pre_title, $search_chars, $search_res, $result_flag;
$this -> query = $tp -> toDB($query);
if (!$search_prefs['mysql_sort']) {
$field_operator = 'AND ';
foreach ($this -> keywords['match'] as $k_key => $key) {
$boolean_regex = '';
if ($this -> keywords['boolean'][$k_key] == '+') {
$key_operator = 'OR ';
$break = TRUE;
$no_exact = TRUE;
} else if ($this -> keywords['boolean'][$k_key] == '-') {
foreach ($this -> keywords as $unset_key => $unset_value) {
unset($this -> keywords[$unset_key][$k_key]);
}
$key_operator = 'AND ';
$boolean_regex = 'NOT';
$no_exact = TRUE;
} else if (!isset($break)) {
$key_operator = 'OR ';
if (isset($switch)) {
$field_operator = 'OR ';
}
$switch = TRUE;
} else {
break;
}
$match_query .= isset($uninitial_field) ? " ".$field_operator." (" : "(";
$uninitial_field = TRUE;
if ($this -> keywords['wildcard'][$k_key] || !$search_prefs['boundary']) {
$wildcard = '';
} else {
$wildcard = '[[:>:]]';
}
$key_count = 1;
foreach ($search_fields as $field) {
$regexp = $search_prefs['boundary'] ? "[[:<:]]".$key.$wildcard : $key;
$match_query .= " ".$field." ".$boolean_regex." REGEXP '".$regexp."' ";
if ($key_count != count($search_fields)) {
$match_query .= $key_operator;
}
$key_count++;
}
$match_query .= ")";
}
if ($order) {
$sql_order = 'ORDER BY ';
$order_count = count($order);
$i = 1;
foreach ($order as $sort_key => $sort_value) {
$sql_order .= $sort_key.' '.$sort_value;
if ($i != $order_count) {
$sql_order .= ', ';
}
$i++;
}
} else {
$sql_order = '';
}
$limit = $search_prefs['php_limit'] ? ' LIMIT 0,'.$search_prefs['php_limit'] : '';
$sql_query = "SELECT ".$return_fields." FROM #".$table." WHERE ".$where." (".$match_query.") ".$sql_order.$limit.";";
if ((($keycount = count($this -> keywords['split'])) > 1) && (strpos($query, '"') === FALSE) && (!isset($no_exact))) {
$exact_query[] = $query;
$this -> keywords['split'] = array_merge($exact_query, $this -> keywords['split']);
}
} else {
$this -> query = str_replace('"', '"', $this -> query);
$field_query = implode(',', $search_fields);
foreach ($search_fields as $field_key => $field) {
$search_query[] = "(".$weights[$field_key]." * (MATCH(".$field.") AGAINST ('".$this -> query."' IN BOOLEAN MODE)))";
}
$match_query = implode(' + ', $search_query);
$sql_order = '';
foreach ($order as $sort_key => $sort_value) {
$sql_order .= ', '.$sort_key.' '.$sort_value;
}
$limit = " LIMIT ".$result_flag.",".$search_res;
$sql_query = "SELECT SQL_CALC_FOUND_ROWS ".$return_fields.", (".$match_query.") AS relevance FROM #".$table." WHERE ".$where." ( MATCH(".$field_query.") AGAINST ('".$this -> query."' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC ".$sql_order.$limit.";";
}
if ($ps['results'] = $sql -> db_Select_gen($sql_query)) {
if (!$search_prefs['mysql_sort']) {
$x = 0;
foreach ($search_fields as $field_key => $field) {
$crop_fields[] = preg_replace('/(.*?)\./', '', $field);
}
while ($row = $sql -> db_Fetch()) {
$weight = 0;
foreach ($crop_fields as $field_key => $field) {
$this -> text = $row[$field];
foreach ($this -> keywords['match'] as $k_key => $this -> query) {
if (stristr($this -> text, $this -> query) !== FALSE) {
if ($this -> keywords['exact'][$k_key] || $this -> keywords['boolean'][$k_key]) {
$weight += (($weights[$field_key] * 2) * ($keycount));
$endweight = TRUE;
} else if (!$endweight) {
$weight += $weights[$field_key];
}
}
}
$endweight = FALSE;
}
foreach ($row as $r_key => $r_value) {
$qrow[$x][$r_key] = $r_value;
$qrow[$x]['relevance'] = $weight;
$qrow[$x]['search_id'] = $x;
}
$x++;
}
foreach($qrow as $info) {
$sortarr[] = $info['relevance'];
}
array_multisort($sortarr, SORT_DESC, $qrow, SORT_DESC);
$result_number = ($x < ($result_flag + $search_res)) ? $x : $result_flag + $search_res;
for ($i = $result_flag; $i < $result_number; $i++) {
$display_row[] = $qrow[$i];
}
} else {
$x = 0;
while ($row = $sql -> db_Fetch()) {
$display_row[] = $row;
$x++;
}
}
foreach ($display_row as $row) {
$res = call_user_func($handler, $row);
if (!$res['omit_result']) {
$matches = array($res['title'], $res['summary']);
$endcrop = FALSE;
$output = '';
$title = TRUE;
foreach ($matches as $this -> text) {
$this -> text = nl2br($this -> text);
$t_search = $tp -> search;
$t_replace = $tp -> replace;
$s_search = array('
', '[', ']');
$s_replace = array(' ', '<', '>');
$search = array_merge($t_search, $s_search);
$replace = array_merge($t_replace, $s_replace);
$this -> text = strip_tags(str_replace($search, $replace, $this -> text));
foreach ($this -> keywords['match'] as $match_id => $this -> query) {
$boundary = $search_prefs['boundary'] ? '\b' : '';
if ($this -> keywords['wildcard'][$match_id]) {
$regex_append = ".*?".$boundary.")";
} else {
$regex_append = $boundary.")";
}
if (($match_start = stristr($this -> text, $this -> query)) !== FALSE) {
$this -> pos = strlen($this -> text) - strlen($match_start);
if (!$endcrop && !$title) {
$this -> parsesearch_crop();
$endcrop = TRUE;
}
$key = substr($this -> text, $this -> pos, strlen($this -> query));
$this -> text = preg_replace("#(".$boundary.$this -> query.$regex_append."#i", "\\1", $this -> text);
}
}
if ($title) {
if ($pre_title == 0) {
$pre_title_output = "";
} else if ($pre_title == 1) {
$pre_title_output = $res['pre_title'];
} else if ($pre_title == 2) {
$pre_title_output = $pre_title;
}
$this -> text = $this -> bullet." ".$pre_title_output.$this -> text."
".$res['pre_summary'];
} else if (!$endcrop) {
$this -> parsesearch_crop();
}
$output .= $this -> text;
$title = FALSE;
}
$display_rel = $search_prefs['relevance'] ? " | ".LAN_SEARCH_69.": ".round($row['relevance'], 1) : "";
$output_array['text'][] = $output.$res['post_summary']."
".$res['detail'].$display_rel."
";
} else {
$ps['results']--;
$res['omit_result'] = FALSE;
}
}
$ps_limit = $output_array['text'];
$result_number = ($x < $search_res) ? $x : $search_res;
for ($i = 0; $i < $result_number; $i++) {
$ps['text'] .= $ps_limit[$i];
}
} else {
$ps['text'] = $no_results;
}
if ($search_prefs['mysql_sort'])
{
$ps['results'] = $sql->total_results; // db class reads result of SELECT FOUND_ROWS() for us
}
return $ps;
}
function parsesearch_crop() {
global $search_chars;
if (strlen($this -> text) > $search_chars) {
if ($this -> pos < ($search_chars - strlen($this -> query))) {
$this -> text = substr($this -> text, 0, $search_chars)."...";
} else if ($this -> pos > (strlen($this -> text) - ($search_chars - strlen($this -> query)))) {
$this -> text = "...".substr($this -> text, (strlen($this -> text) - ($search_chars - strlen($this -> query))));
} else {
$this -> text = "...".substr($this -> text, ($this -> pos - round(($search_chars / 3))), $search_chars)."...";
}
$match_start = stristr($this -> text, $this -> query);
$this -> pos = strlen($this -> text) - strlen($match_start);
}
}
function stopword($key) {
global $search_prefs;
if ($search_prefs['mysql_sort'] && ($key{0} == '+')) {
$key = substr($key, 1);
}
if (($key{(strlen($key) - 1)} != '*') && ($key{0} != '+')) {
if (strlen($key) > 2) {
if ($search_prefs['mysql_sort']) {
$stopword_list = $this -> stopwords_mysql;
} else {
$stopword_list = $this -> stopwords_php;
}
if (strpos($stopword_list, '|'.$key.'|') !== FALSE) {
$this -> stop_keys[] = $key;
return TRUE;
} else {
return FALSE;
}
} else {
$this -> stop_keys[] = $key;
return TRUE;
}
} else {
return FALSE;
}
}
}
?>