X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSearchMySQL.php;h=5fc06790f3aade7da30c90c692c173122268f27d;hb=1ca568692f1b65205ac3f3b07747fa9b103353e6;hp=6683cbe04cbe0443714b83ef1fb113909e311d36;hpb=f2c29baf9f0438c11e4c72f814cd77b05aac77ae;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SearchMySQL.php b/includes/SearchMySQL.php index 6683cbe04c..5fc06790f3 100644 --- a/includes/SearchMySQL.php +++ b/includes/SearchMySQL.php @@ -18,17 +18,71 @@ # http://www.gnu.org/copyleft/gpl.html /** - * Search engine hook base class for MySQL. - * Specific bits for MySQL 3 and 4 variants are in child classes. - * @package MediaWiki - * @subpackage Search + * @file + * @ingroup Search */ -/** */ -require_once( 'SearchEngine.php' ); - -/** @package MediaWiki */ +/** + * Search engine hook for MySQL 4+ + * @ingroup Search + */ class SearchMySQL extends SearchEngine { + var $strictMatching = true; + + /** @todo document */ + function __construct( $db ) { + $this->db = $db; + } + + /** + * Parse the user's query and transform it into an SQL fragment which will + * become part of a WHERE clause + */ + function parseQuery( $filteredText, $fulltext ) { + global $wgContLang; + $lc = SearchEngine::legalSearchChars(); // Minus format chars + $searchon = ''; + $this->searchTerms = array(); + + # FIXME: This doesn't handle parenthetical expressions. + $m = array(); + if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/', + $filteredText, $m, PREG_SET_ORDER ) ) { + foreach( $m as $terms ) { + if( $searchon !== '' ) $searchon .= ' '; + if( $this->strictMatching && ($terms[1] == '') ) { + $terms[1] = '+'; + } + $searchon .= $terms[1] . $wgContLang->stripForSearch( $terms[2] ); + if( !empty( $terms[3] ) ) { + // Match individual terms in result highlighting... + $regexp = preg_quote( $terms[3], '/' ); + if( $terms[4] ) { + $regexp = "\b$regexp"; // foo* + } else { + $regexp = "\b$regexp\b"; + } + } else { + // Match the quoted term in result highlighting... + $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' ); + } + $this->searchTerms[] = $regexp; + } + wfDebug( "Would search with '$searchon'\n" ); + wfDebug( 'Match with /' . implode( '|', $this->searchTerms ) . "/\n" ); + } else { + wfDebug( "Can't understand search query '{$filteredText}'\n" ); + } + + $searchon = $this->db->strencode( $searchon ); + $field = $this->getIndexField( $fulltext ); + return " MATCH($field) AGAINST('$searchon' IN BOOLEAN MODE) "; + } + + public static function legalSearchChars() { + return "\"*" . parent::legalSearchChars(); + } + /** * Perform a full text search query and return a result set. * @@ -57,7 +111,7 @@ class SearchMySQL extends SearchEngine { /** * Return a partial WHERE clause to exclude redirects, if so set * @return string - * @access private + * @private */ function queryRedirect() { if( $this->showRedirects ) { @@ -70,12 +124,15 @@ class SearchMySQL extends SearchEngine { /** * Return a partial WHERE clause to limit the search to the given namespaces * @return string - * @access private + * @private */ function queryNamespaces() { - $namespaces = implode( ',', $this->namespaces ); - if ($namespaces == '') { + if( is_null($this->namespaces) ) + return ''; # search all + if ( !count( $this->namespaces ) ) { $namespaces = '0'; + } else { + $namespaces = $this->db->makeList( $this->namespaces ); } return 'AND page_namespace IN (' . $namespaces . ')'; } @@ -83,7 +140,7 @@ class SearchMySQL extends SearchEngine { /** * Return a LIMIT clause to limit results on the query. * @return string - * @access private + * @private */ function queryLimit() { return $this->db->limitResult( '', $this->limit, $this->offset ); @@ -93,7 +150,7 @@ class SearchMySQL extends SearchEngine { * Does not do anything for generic search engine * subclasses may define this though * @return string - * @access private + * @private */ function queryRanking( $filteredTerm, $fulltext ) { return ''; @@ -104,7 +161,7 @@ class SearchMySQL extends SearchEngine { * The guts shoulds be constructed in queryMain() * @param string $filteredTerm * @param bool $fulltext - * @access private + * @private */ function getQuery( $filteredTerm, $fulltext ) { return $this->queryMain( $filteredTerm, $fulltext ) . ' ' . @@ -133,7 +190,7 @@ class SearchMySQL extends SearchEngine { * @param string $filteredTerm * @param bool $fulltext * @return string - * @access private + * @private */ function queryMain( $filteredTerm, $fulltext ) { $match = $this->parseQuery( $filteredTerm, $fulltext ); @@ -153,14 +210,14 @@ class SearchMySQL extends SearchEngine { * @param string $text */ function update( $id, $title, $text ) { - $dbw=& wfGetDB( DB_MASTER ); + $dbw = wfGetDB( DB_MASTER ); $dbw->replace( 'searchindex', array( 'si_page' ), array( 'si_page' => $id, 'si_title' => $title, 'si_text' => $text - ), 'SearchMySQL4::update' ); + ), __METHOD__ ); } /** @@ -171,17 +228,19 @@ class SearchMySQL extends SearchEngine { * @param string $title */ function updateTitle( $id, $title ) { - $dbw =& wfGetDB( DB_MASTER ); + $dbw = wfGetDB( DB_MASTER ); $dbw->update( 'searchindex', array( 'si_title' => $title ), array( 'si_page' => $id ), - 'SearchMySQL4::updateTitle', + __METHOD__, array( $dbw->lowPriorityOption() ) ); } } -/** @package MediaWiki */ +/** + * @ingroup Search + */ class MySQLSearchResultSet extends SearchResultSet { function MySQLSearchResultSet( $resultSet, $terms ) { $this->mResultSet = $resultSet; @@ -204,6 +263,8 @@ class MySQLSearchResultSet extends SearchResultSet { return new SearchResult( $row ); } } -} -?> + function free() { + $this->mResultSet->free(); + } +}