Line 57 | Line 57 |
---|
protected $must_not_contain_ids = array();
/**
|
protected $must_not_contain_ids = array();
/**
|
* Post ids of posts containing atleast one word that needs to be excluded
| * Post ids of posts containing at least one word that needs to be excluded
|
* @var array */ protected $must_exclude_one_ids = array();
| * @var array */ protected $must_exclude_one_ids = array();
|
Line 85 | Line 85 |
---|
* @var \phpbb\db\driver\driver_interface */ protected $db;
|
* @var \phpbb\db\driver\driver_interface */ protected $db;
|
| /** * phpBB event dispatcher object * @var \phpbb\event\dispatcher_interface */ protected $phpbb_dispatcher;
|
/** * User object
| /** * User object
|
Line 96 | Line 102 |
---|
* Initialises the fulltext_native search backend with min/max word length and makes sure the UTF-8 normalizer is loaded * * @param boolean|string &$error is passed by reference and should either be set to false on success or an error message on failure
|
* Initialises the fulltext_native search backend with min/max word length and makes sure the UTF-8 normalizer is loaded * * @param boolean|string &$error is passed by reference and should either be set to false on success or an error message on failure
|
| * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher object
|
*/
|
*/
|
public function __construct(&$error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user)
| public function __construct(&$error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher)
|
{ $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $phpEx; $this->config = $config; $this->db = $db;
|
{ $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $phpEx; $this->config = $config; $this->db = $db;
|
| $this->phpbb_dispatcher = $phpbb_dispatcher;
|
$this->user = $user;
$this->word_length = array('min' => $this->config['fulltext_native_min_chars'], 'max' => $this->config['fulltext_native_max_chars']);
| $this->user = $user;
$this->word_length = array('min' => $this->config['fulltext_native_min_chars'], 'max' => $this->config['fulltext_native_max_chars']);
|
Line 300 | Line 308 |
---|
$this->search_query = $keywords;
$exact_words = array();
|
$this->search_query = $keywords;
$exact_words = array();
|
preg_match_all('#([^\\s+\\-|*()]+)(?:$|[\\s+\\-|()])#u', $keywords, $exact_words);
| preg_match_all('#([^\\s+\\-|()]+)(?:$|[\\s+\\-|()])#u', $keywords, $exact_words);
|
$exact_words = $exact_words[1];
$common_ids = $words = array();
| $exact_words = $exact_words[1];
$common_ids = $words = array();
|
Line 434 | Line 442 |
---|
// throw an error if we shall not ignore unexistant words else if (!$ignore_no_id && sizeof($non_common_words)) {
|
// throw an error if we shall not ignore unexistant words else if (!$ignore_no_id && sizeof($non_common_words)) {
|
trigger_error(sprintf($user->lang['WORDS_IN_NO_POST'], implode($user->lang['COMMA_SEPARATOR'], $non_common_words)));
| trigger_error(sprintf($this->user->lang['WORDS_IN_NO_POST'], implode($this->user->lang['COMMA_SEPARATOR'], $non_common_words)));
|
} unset($non_common_words); }
| } unset($non_common_words); }
|
Line 522 | Line 530 |
---|
sort($must_exclude_one_ids);
// generate a search_key from all the options to identify the results
|
sort($must_exclude_one_ids);
// generate a search_key from all the options to identify the results
|
$search_key = md5(implode('#', array(
| $search_key_array = array(
|
serialize($must_contain_ids), serialize($must_not_contain_ids), serialize($must_exclude_one_ids),
| serialize($must_contain_ids), serialize($must_not_contain_ids), serialize($must_exclude_one_ids),
|
Line 536 | Line 544 |
---|
$post_visibility, implode(',', $author_ary), $author_name,
|
$post_visibility, implode(',', $author_ary), $author_name,
|
)));
| );
/** * Allow changing the search_key for cached results * * @event core.search_native_by_keyword_modify_search_key * @var array search_key_array Array with search parameters to generate the search_key * @var array must_contain_ids Array with post ids of posts containing words that are to be included * @var array must_not_contain_ids Array with post ids of posts containing words that should not be included * @var array must_exclude_one_ids Array with post ids of posts containing at least one word that needs to be excluded * @var string type Searching type ('posts', 'topics') * @var string fields Searching fields ('titleonly', 'msgonly', 'firstpost', 'all') * @var string terms Searching terms ('all', 'any') * @var int sort_days Time, in days, of the oldest possible post to list * @var string sort_key The sort type used from the possible sort types * @var int topic_id Limit the search to this topic_id only * @var array ex_fid_ary Which forums not to search on * @var string post_visibility Post visibility data * @var array author_ary Array of user_id containing the users to filter the results to * @since 3.1.7-RC1 */ $vars = array( 'search_key_array', 'must_contain_ids', 'must_not_contain_ids', 'must_exclude_one_ids', 'type', 'fields', 'terms', 'sort_days', 'sort_key', 'topic_id', 'ex_fid_ary', 'post_visibility', 'author_ary', ); extract($this->phpbb_dispatcher->trigger_event('core.search_native_by_keyword_modify_search_key', compact($vars)));
$search_key = md5(implode('#', $search_key_array));
|
// try reading the results from cache $total_results = 0;
| // try reading the results from cache $total_results = 0;
|
Line 711 | Line 757 |
---|
}
$sql_where[] = $post_visibility;
|
}
$sql_where[] = $post_visibility;
|
| $search_query = $this->search_query; $must_exclude_one_ids = $this->must_exclude_one_ids; $must_not_contain_ids = $this->must_not_contain_ids; $must_contain_ids = $this->must_contain_ids;
/** * Allow changing the query used for counting for posts using fulltext_native * * @event core.search_native_keywords_count_query_before * @var string search_query The parsed keywords used for this search * @var array must_not_contain_ids Ids that cannot be taken into account for the results * @var array must_exclude_one_ids Ids that cannot be on the results * @var array must_contain_ids Ids that must be on the results * @var int total_results The previous result count for the format of the query * Set to 0 to force a re-count * @var array sql_array The data on how to search in the DB at this point * @var bool left_join_topics Whether or not TOPICS_TABLE should be CROSS JOIN'ED * @var array author_ary Array of user_id containing the users to filter the results to * @var string author_name An extra username to search on (!empty(author_ary) must be true, to be relevant) * @var array ex_fid_ary Which forums not to search on * @var int topic_id Limit the search to this topic_id only * @var string sql_sort_table Extra tables to include in the SQL query. * Used in conjunction with sql_sort_join * @var string sql_sort_join SQL conditions to join all the tables used together. * Used in conjunction with sql_sort_table * @var int sort_days Time, in days, of the oldest possible post to list * @var string sql_where An array of the current WHERE clause conditions * @var string sql_match Which columns to do the search on * @var string sql_match_where Extra conditions to use to properly filter the matching process * @var bool group_by Whether or not the SQL query requires a GROUP BY for the elements in the SELECT clause * @var string sort_by_sql The possible predefined sort types * @var string sort_key The sort type used from the possible sort types * @var string sort_dir "a" for ASC or "d" dor DESC for the sort order used * @var string sql_sort The result SQL when processing sort_by_sql + sort_key + sort_dir * @var int start How many posts to skip in the search results (used for pagination) * @since 3.1.5-RC1 */ $vars = array( 'search_query', 'must_not_contain_ids', 'must_exclude_one_ids', 'must_contain_ids', 'total_results', 'sql_array', 'left_join_topics', 'author_ary', 'author_name', 'ex_fid_ary', 'topic_id', 'sql_sort_table', 'sql_sort_join', 'sort_days', 'sql_where', 'sql_match', 'sql_match_where', 'group_by', 'sort_by_sql', 'sort_key', 'sort_dir', 'sql_sort', 'start', ); extract($this->phpbb_dispatcher->trigger_event('core.search_native_keywords_count_query_before', compact($vars)));
|
if ($topic_id) {
| if ($topic_id) {
|
Line 821 | Line 931 |
---|
'FROM' => array(TOPICS_TABLE => 't'), 'ON' => 'p.topic_id = t.topic_id' );
|
'FROM' => array(TOPICS_TABLE => 't'), 'ON' => 'p.topic_id = t.topic_id' );
|
| }
// if using mysql and the total result count is not calculated yet, get it from the db if (!$total_results && $is_mysql) { // Also count rows for the query as if there was not LIMIT. Add SQL_CALC_FOUND_ROWS to SQL $sql_array['SELECT'] = 'SQL_CALC_FOUND_ROWS ' . $sql_array['SELECT'];
|
}
$sql_array['WHERE'] = implode(' AND ', $sql_where);
| }
$sql_array['WHERE'] = implode(' AND ', $sql_where);
|
Line 838 | Line 955 |
---|
} $this->db->sql_freeresult($result);
|
} $this->db->sql_freeresult($result);
|
// if we use mysql and the total result count is not cached yet, retrieve it from the db
| |
if (!$total_results && $is_mysql) {
|
if (!$total_results && $is_mysql) {
|
// Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it $sql_array_copy = $sql_array; $sql_array_copy['SELECT'] = 'SQL_CALC_FOUND_ROWS p.post_id ';
$sql_calc = $this->db->sql_build_query('SELECT', $sql_array_copy); unset($sql_array_copy);
$this->db->sql_query($sql_calc); $this->db->sql_freeresult($result);
| // Get the number of results as calculated by MySQL
|
$sql_count = 'SELECT FOUND_ROWS() as total_results'; $result = $this->db->sql_query($sql_count); $total_results = (int) $this->db->sql_fetchfield('total_results');
| $sql_count = 'SELECT FOUND_ROWS() as total_results'; $result = $this->db->sql_query($sql_count); $total_results = (int) $this->db->sql_fetchfield('total_results');
|
Line 911 | Line 1018 |
---|
}
// generate a search_key from all the options to identify the results
|
}
// generate a search_key from all the options to identify the results
|
$search_key = md5(implode('#', array(
| $search_key_array = array(
|
'', $type, ($firstpost_only) ? 'firstpost' : '',
| '', $type, ($firstpost_only) ? 'firstpost' : '',
|
Line 924 | Line 1031 |
---|
$post_visibility, implode(',', $author_ary), $author_name,
|
$post_visibility, implode(',', $author_ary), $author_name,
|
)));
| );
/** * Allow changing the search_key for cached results * * @event core.search_native_by_author_modify_search_key * @var array search_key_array Array with search parameters to generate the search_key * @var string type Searching type ('posts', 'topics') * @var boolean firstpost_only Flag indicating if only topic starting posts are considered * @var int sort_days Time, in days, of the oldest possible post to list * @var string sort_key The sort type used from the possible sort types * @var int topic_id Limit the search to this topic_id only * @var array ex_fid_ary Which forums not to search on * @var string post_visibility Post visibility data * @var array author_ary Array of user_id containing the users to filter the results to * @var string author_name The username to search on * @since 3.1.7-RC1 */ $vars = array( 'search_key_array', 'type', 'firstpost_only', 'sort_days', 'sort_key', 'topic_id', 'ex_fid_ary', 'post_visibility', 'author_ary', 'author_name', ); extract($this->phpbb_dispatcher->trigger_event('core.search_native_by_author_modify_search_key', compact($vars)));
$search_key = md5(implode('#', $search_key_array));
|
// try reading the results from cache $total_results = 0;
| // try reading the results from cache $total_results = 0;
|
Line 974 | Line 1113 |
---|
$select = ($type == 'posts') ? 'p.post_id' : 't.topic_id'; $is_mysql = false;
|
$select = ($type == 'posts') ? 'p.post_id' : 't.topic_id'; $is_mysql = false;
|
| /** * Allow changing the query used to search for posts by author in fulltext_native * * @event core.search_native_author_count_query_before * @var int total_results The previous result count for the format of the query. * Set to 0 to force a re-count * @var string type The type of search being made * @var string select SQL SELECT clause for what to get * @var string sql_sort_table CROSS JOIN'ed table to allow doing the sort chosen * @var string sql_sort_join Condition to define how to join the CROSS JOIN'ed table specifyed in sql_sort_table * @var array sql_author SQL WHERE condition for the post author ids * @var int topic_id Limit the search to this topic_id only * @var string sort_by_sql The possible predefined sort types * @var string sort_key The sort type used from the possible sort types * @var string sort_dir "a" for ASC or "d" dor DESC for the sort order used * @var string sql_sort The result SQL when processing sort_by_sql + sort_key + sort_dir * @var string sort_days Time, in days, that the oldest post showing can have * @var string sql_time The SQL to search on the time specifyed by sort_days * @var bool firstpost_only Wether or not to search only on the first post of the topics * @var string sql_firstpost The SQL used in the WHERE claused to filter by firstpost. * @var array ex_fid_ary Forum ids that must not be searched on * @var array sql_fora SQL query for ex_fid_ary * @var int start How many posts to skip in the search results (used for pagination) * @since 3.1.5-RC1 */ $vars = array( 'total_results', 'type', 'select', 'sql_sort_table', 'sql_sort_join', 'sql_author', 'topic_id', 'sort_by_sql', 'sort_key', 'sort_dir', 'sql_sort', 'sort_days', 'sql_time', 'firstpost_only', 'sql_firstpost', 'ex_fid_ary', 'sql_fora', 'start', ); extract($this->phpbb_dispatcher->trigger_event('core.search_native_author_count_query_before', compact($vars)));
|
// If the cache was completely empty count the results if (!$total_results)
| // If the cache was completely empty count the results if (!$total_results)
|
Line 1076 | Line 1262 |
---|
if (!$total_results && $is_mysql) { // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it.
|
if (!$total_results && $is_mysql) { // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it.
|
$sql_calc = str_replace('SELECT ' . $select, 'SELECT DISTINCT SQL_CALC_FOUND_ROWS p.post_id', $sql);
| $sql_calc = str_replace('SELECT ' . $select, 'SELECT SQL_CALC_FOUND_ROWS ' . $select, $sql);
|
|
|
$this->db->sql_query($sql_calc);
| $result = $this->db->sql_query($sql_calc);
|
$this->db->sql_freeresult($result);
$sql_count = 'SELECT FOUND_ROWS() as total_results';
| $this->db->sql_freeresult($result);
$sql_count = 'SELECT FOUND_ROWS() as total_results';
|
Line 1789 | Line 1975 |
---|
</dl> <dl> <dt><label for="fulltext_native_min_chars">' . $this->user->lang['MIN_SEARCH_CHARS'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['MIN_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
|
</dl> <dl> <dt><label for="fulltext_native_min_chars">' . $this->user->lang['MIN_SEARCH_CHARS'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['MIN_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
|
<dd><input id="fulltext_native_min_chars" type="number" size="3" maxlength="3" min="0" max="255" name="config[fulltext_native_min_chars]" value="' . (int) $this->config['fulltext_native_min_chars'] . '" /></dd>
| <dd><input id="fulltext_native_min_chars" type="number" min="0" max="255" name="config[fulltext_native_min_chars]" value="' . (int) $this->config['fulltext_native_min_chars'] . '" /></dd>
|
</dl> <dl> <dt><label for="fulltext_native_max_chars">' . $this->user->lang['MAX_SEARCH_CHARS'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['MAX_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
|
</dl> <dl> <dt><label for="fulltext_native_max_chars">' . $this->user->lang['MAX_SEARCH_CHARS'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['MAX_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
|
<dd><input id="fulltext_native_max_chars" type="number" size="3" maxlength="3" min="0" max="255" name="config[fulltext_native_max_chars]" value="' . (int) $this->config['fulltext_native_max_chars'] . '" /></dd>
| <dd><input id="fulltext_native_max_chars" type="number" min="0" max="255" name="config[fulltext_native_max_chars]" value="' . (int) $this->config['fulltext_native_max_chars'] . '" /></dd>
|
</dl> <dl> <dt><label for="fulltext_native_common_thres">' . $this->user->lang['COMMON_WORD_THRESHOLD'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['COMMON_WORD_THRESHOLD_EXPLAIN'] . '</span></dt>
|
</dl> <dl> <dt><label for="fulltext_native_common_thres">' . $this->user->lang['COMMON_WORD_THRESHOLD'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['COMMON_WORD_THRESHOLD_EXPLAIN'] . '</span></dt>
|
<dd><input id="fulltext_native_common_thres" type="text" size="3" maxlength="3" name="config[fulltext_native_common_thres]" value="' . (double) $this->config['fulltext_native_common_thres'] . '" /> %</dd>
| <dd><input id="fulltext_native_common_thres" type="text" name="config[fulltext_native_common_thres]" value="' . (double) $this->config['fulltext_native_common_thres'] . '" /> %</dd>
|
</dl> ';
| </dl> ';
|