query = $query;
$this->bullet = '';
if(defined('GLYPH'))
{
$this->bullet = '';
}
elseif(defined('BULLET'))
{
$this->bullet = '';
}
elseif(file_exists(THEME.'images/bullet2.gif'))
{
$this->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."