query = $query; $this->bullet = ''; if(defined('GLYPH')) { $this->bullet = ''; } elseif(defined('BULLET')) { $this->bullet = ''; } elseif(file_exists(THEME.'images/bullet2.gif')) { $this->bullet = 'bullet'; } $this->bullet = ''; // Use CSS instead. 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[($tp->ustrlen($key) - 1)] == '*') { $this -> keywords['wildcard'][$k_key] = TRUE; $key = $tp->usubstr($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] = ($tp->ustrpos($key, ' ') !== FALSE) ? TRUE : FALSE; $this -> keywords['match'][$k_key] = $tp -> toDB($this -> keywords['match'][$k_key]); } else { unset ($this -> keywords['split'][$k_key]); } } } function setParams($get = array()) { $this->params = $get; } function getParams() { return $this->params; } public function parsesearch($table, $return_fields, $search_fields, $weights, $handler, $no_results, $where, $order) { global $query, $search_prefs, $pre_title, $search_chars, $search_res, $result_flag; $sql = e107::getDb('search'); $tp = e107::getParser(); if($handler == 'self') //v2 use 'compile' function inside e_search.php; { $handler = array($this,'compile'); } if(is_array($return_fields)) { $return_fields = implode(", ",$return_fields); } $this -> query = $tp -> toDB($query); $match_query = ''; if (!$search_prefs['mysql_sort']) { if(e_DEBUG) { echo e107::getMessage()->addDebug("Using PHP Sort Method")->render();; } $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; } elseif ($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; } elseif (!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 // MySQL Sorting. { if(e_DEBUG) { e107::getDebug()->log("Using MYSQL Sort Method"); } $this -> query = str_replace('"', '"', $this -> query); //$field_query = implode(',', $search_fields); foreach ($search_fields as $field_key => $field) { $search_query[] = "(". varset($weights[$field_key],0.6)." * (MATCH(".$field.") AGAINST ('".str_replace(" ","+",$this -> query)."' IN BOOLEAN MODE)))"; $field_query[] = "MATCH(".$field.") AGAINST ('".$this -> query."' IN BOOLEAN MODE)"; } $match_query = implode(' + ', $search_query); $field_query = implode(' || ', $field_query); $sql_order = ''; foreach ($order as $sort_key => $sort_value) { $sql_order .= ', '.$sort_key.' '.$sort_value; } $limit = " LIMIT ".intval($result_flag).",".$search_res; $sql_query = "SELECT SQL_CALC_FOUND_ROWS ".$return_fields.", (".$match_query.") AS relevance FROM #".$table." WHERE ".$where." (".$field_query.") HAVING relevance > 0 ORDER BY relevance DESC ".$sql_order.$limit.";"; } if(E107_DBG_SQLQUERIES) { echo e107::getMessage()->addDebug(str_replace('#',MPREFIX,$sql_query))->render(); } if ($ps['results'] = $sql->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->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; if(!empty($matches)) { 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)); if(!empty($this->keywords['match'])) { 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 = $tp->ustristr($this -> text, $this -> query)) !== FALSE) { $this -> pos = $tp->ustrlen($this -> text) - $tp->ustrlen($match_start); if (!$endcrop && !$title) { $this -> parsesearch_crop(); $endcrop = TRUE; } $key = $tp->usubstr($this -> text, $this->pos, $tp->ustrlen($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."

{DETAILS}
".$res['pre_summary']; } elseif (!$endcrop) { $this -> parsesearch_crop(); } $output .= $this -> text; $title = FALSE; } } $display_rel = $search_prefs['relevance'] ? " | ".LAN_SEARCH_69.": ".round($row['relevance'], 1) : ""; $output_array['text'][] = "
  • ".str_replace('{DETAILS}',"".$res['detail'].$display_rel."", $output).$tp->toText($res['post_summary'])."
  • \n\n"; // $ps['data'][] = $res; } 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; $tp = e107::getParser(); if (strlen($this -> text) > $search_chars) { if ($this -> pos < ($search_chars - $tp->ustrlen($this -> query))) { $this -> text = $tp->usubstr($this -> text, 0, $search_chars)."..."; } else if ($this -> pos > ($tp->ustrlen($this -> text) - ($search_chars - $tp->ustrlen($this -> query)))) { $this -> text = "...".$tp->usubstr($this -> text, ($tp->ustrlen($this -> text) - ($search_chars - $tp->ustrlen($this -> query)))); } else { $this -> text = "...".$tp->usubstr($this -> text, ($this -> pos - round(($search_chars / 3))), $search_chars)."..."; } $match_start = $tp->ustristr($this -> text, $this -> query); $this -> pos = $tp->ustrlen($this -> text) - $tp->ustrlen($match_start); } } function stopword($key) { global $search_prefs; $tp = e107::getParser(); if ($search_prefs['mysql_sort'] && ($key[0] == '+')) { $key = $tp->usubstr($key, 1); } if (($key[($tp->ustrlen($key) - 1)] != '*') && ($key[0] != '+')) { if ($tp->ustrlen($key) > 2) { if ($search_prefs['mysql_sort']) { $stopword_list = $this -> stopwords_mysql; } else { $stopword_list = $this -> stopwords_php; } if ($tp->ustrpos($stopword_list, '|'.$key.'|') !== FALSE) { $this -> stop_keys[] = $key; return TRUE; } else { return FALSE; } } else { $this -> stop_keys[] = $key; return TRUE; } } else { return FALSE; } } }