phpBB

Code Changes

File: phpbb/search/fulltext_postgres.php

  Unmodified   Added   Modified   Removed
Line 54Line 54
	 * @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 92Line 98
	 * @param \phpbb\config\config $config Config object
* @param \phpbb\db\driver\driver_interface Database object
* @param \phpbb\user $user User object

	 * @param \phpbb\config\config $config Config object
* @param \phpbb\db\driver\driver_interface Database object
* @param \phpbb\user $user User object

 
	 * @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->config = $config;
$this->db = $db;

	{
$this->config = $config;
$this->db = $db;

 
		$this->phpbb_dispatcher = $phpbb_dispatcher;

		$this->user = $user;

$this->word_length = array('min' => $this->config['fulltext_postgres_min_word_len'], 'max' => $this->config['fulltext_postgres_max_word_len']);

		$this->user = $user;

$this->word_length = array('min' => $this->config['fulltext_postgres_min_word_len'], 'max' => $this->config['fulltext_postgres_max_word_len']);

Line 333Line 341
		}

// 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(

			implode(', ', $this->split_words),
$type,
$fields,

			implode(', ', $this->split_words),
$type,
$fields,

Line 344Line 352
			implode(',', $ex_fid_ary),
$post_visibility,
implode(',', $author_ary)

			implode(',', $ex_fid_ary),
$post_visibility,
implode(',', $author_ary)

		)));

































		);

/**
* Allow changing the search_key for cached results
*
* @event core.search_postgres_by_keyword_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 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',
'type',
'fields',
'terms',
'sort_days',
'sort_key',
'topic_id',
'ex_fid_ary',
'post_visibility',
'author_ary',
);
extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_by_keyword_modify_search_key', compact($vars)));

$search_key = md5(implode('#', $search_key_array));


if ($start < 0)
{


if ($start < 0)
{

Line 408Line 448
				$sql_match_where = '';
break;
}

				$sql_match_where = '';
break;
}

 

$tsearch_query = $this->tsearch_query;

/**
* Allow changing the query used to search for posts using fulltext_postgres
*
* @event core.search_postgres_keywords_main_query_before
* @var string tsearch_query The parsed keywords used for this search
* @var int result_count The previous result count for the format of the query.
* Set to 0 to force a re-count
* @var bool join_topic Weather 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_match Which columns to do the search on.
* @var string sql_match_where Extra conditions to use to properly filter the matching process
* @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(
'tsearch_query',
'result_count',
'join_topic',
'author_ary',
'author_name',
'ex_fid_ary',
'topic_id',
'sql_sort_table',
'sql_sort_join',
'sort_days',
'sql_match',
'sql_match_where',
'sort_by_sql',
'sort_key',
'sort_dir',
'sql_sort',
'start',
);
extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_keywords_main_query_before', compact($vars)));


$sql_select = ($type == 'posts') ? 'p.post_id' : 'DISTINCT t.topic_id';
$sql_from = ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
$field = ($type == 'posts') ? 'post_id' : 'topic_id';


$sql_select = ($type == 'posts') ? 'p.post_id' : 'DISTINCT t.topic_id';
$sql_from = ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
$field = ($type == 'posts') ? 'post_id' : 'topic_id';

		$sql_author			= (sizeof($author_ary) == 1) ? ' = ' . $author_ary[0] : 'IN (' . implode(', ', $author_ary) . ')';

 

if (sizeof($author_ary) && $author_name)
{


if (sizeof($author_ary) && $author_name)
{

Line 437Line 525
		$sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$sql_where_options .= $sql_match_where;


		$sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$sql_where_options .= $sql_match_where;


		$tmp_sql_match = array();

 
		$sql_match = str_replace(',', " || ' ' ||", $sql_match);
$tmp_sql_match = "to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', " . $sql_match . ") @@ to_tsquery ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', '" . $this->db->sql_escape($this->tsearch_query) . "')";


		$sql_match = str_replace(',', " || ' ' ||", $sql_match);
$tmp_sql_match = "to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', " . $sql_match . ") @@ to_tsquery ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', '" . $this->db->sql_escape($this->tsearch_query) . "')";


Line 528Line 615
		}

// 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 541Line 628
			$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_postgres_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_postgres_by_author_modify_search_key', compact($vars)));

$search_key = md5(implode('#', $search_key_array));


if ($start < 0)
{


if ($start < 0)
{

Line 594Line 713
		}

$m_approve_fid_sql = ' AND ' . $post_visibility;

		}

$m_approve_fid_sql = ' AND ' . $post_visibility;

 

/**
* Allow changing the query used to search for posts by author in fulltext_postgres
*
* @event core.search_postgres_author_count_query_before
* @var int result_count The previous result count for the format of the query.
* Set to 0 to force a re-count
* @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 author_ary Array of user_id containing the users to filter the results to
* @var string author_name An extra username to search on
* @var string sql_author SQL WHERE condition for the post author ids
* @var int topic_id Limit the search to this topic_id only
* @var string sql_topic_id SQL of topic_id
* @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 array ex_fid_ary Forum ids that must not be searched on
* @var array sql_fora SQL query for ex_fid_ary
* @var string m_approve_fid_sql WHERE clause condition on post_visibility restrictions
* @var int start How many posts to skip in the search results (used for pagination)
* @since 3.1.5-RC1
*/
$vars = array(
'result_count',
'sql_sort_table',
'sql_sort_join',
'author_ary',
'author_name',
'sql_author',
'topic_id',
'sql_topic_id',
'sort_by_sql',
'sort_key',
'sort_dir',
'sql_sort',
'sort_days',
'sql_time',
'firstpost_only',
'ex_fid_ary',
'sql_fora',
'm_approve_fid_sql',
'start',
);
extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_author_count_query_before', compact($vars)));


// Build the query for really selecting the post_ids
if ($type == 'posts')


// Build the query for really selecting the post_ids
if ($type == 'posts')

Line 668Line 836
					GROUP BY t.topic_id, $sort_by_sql[$sort_key]";
}


					GROUP BY t.topic_id, $sort_by_sql[$sort_key]";
}


			$result = $this->db->sql_query($sql_count);

			$this->db->sql_query($sql_count);

			$result_count = (int) $this->db->sql_fetchfield('result_count');

if (!$result_count)

			$result_count = (int) $this->db->sql_fetchfield('result_count');

if (!$result_count)

Line 746Line 914
		// destroy too old cached search results
$this->destroy_cache(array());


		// destroy too old cached search results
$this->destroy_cache(array());


		set_config('search_last_gc', time(), true);

		$this->config->set('search_last_gc', time(), false);

	}

/**

	}

/**

Line 919Line 1087
		</dl>
<dl>
<dt><label for="fulltext_postgres_min_word_len">' . $this->user->lang['FULLTEXT_POSTGRES_MIN_WORD_LEN'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['FULLTEXT_POSTGRES_MIN_WORD_LEN_EXPLAIN'] . '</span></dt>

		</dl>
<dl>
<dt><label for="fulltext_postgres_min_word_len">' . $this->user->lang['FULLTEXT_POSTGRES_MIN_WORD_LEN'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['FULLTEXT_POSTGRES_MIN_WORD_LEN_EXPLAIN'] . '</span></dt>

                        <dd><input id="fulltext_postgres_min_word_len" type="number" size="3" maxlength="3" min="0" max="255" name="config[fulltext_postgres_min_word_len]" value="' . (int) $this->config['fulltext_postgres_min_word_len'] . '" /></dd>

                        <dd><input id="fulltext_postgres_min_word_len" type="number" min="0" max="255" name="config[fulltext_postgres_min_word_len]" value="' . (int) $this->config['fulltext_postgres_min_word_len'] . '" /></dd>

                </dl>
<dl>
<dt><label for="fulltext_postgres_max_word_len">' . $this->user->lang['FULLTEXT_POSTGRES_MAX_WORD_LEN'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['FULLTEXT_POSTGRES_MAX_WORD_LEN_EXPLAIN'] . '</span></dt>

                </dl>
<dl>
<dt><label for="fulltext_postgres_max_word_len">' . $this->user->lang['FULLTEXT_POSTGRES_MAX_WORD_LEN'] . $this->user->lang['COLON'] . '</label><br /><span>' . $this->user->lang['FULLTEXT_POSTGRES_MAX_WORD_LEN_EXPLAIN'] . '</span></dt>

                        <dd><input id="fulltext_postgres_max_word_len" type="number" size="3" maxlength="3" min="0" max="255" name="config[fulltext_postgres_max_word_len]" value="' . (int) $this->config['fulltext_postgres_max_word_len'] . '" /></dd>

                        <dd><input id="fulltext_postgres_max_word_len" type="number" min="0" max="255" name="config[fulltext_postgres_max_word_len]" value="' . (int) $this->config['fulltext_postgres_max_word_len'] . '" /></dd>

                </dl>
';


                </dl>
';