summaryrefslogtreecommitdiff
path: root/includes/SearchMySQL.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/SearchMySQL.php')
-rw-r--r--includes/SearchMySQL.php71
1 files changed, 62 insertions, 9 deletions
diff --git a/includes/SearchMySQL.php b/includes/SearchMySQL.php
index 905075ef..f9b71c8e 100644
--- a/includes/SearchMySQL.php
+++ b/includes/SearchMySQL.php
@@ -18,11 +18,64 @@
# 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.
- * @addtogroup Search
+ * @file
+ * @ingroup Search
+ */
+
+/**
+ * Search engine hook for MySQL 4+
+ * @ingroup Search
*/
class SearchMySQL extends SearchEngine {
+ var $strictMatching = true;
+
+ /** @todo document */
+ function __construct( $db ) {
+ $this->db = $db;
+ }
+
+ /** @todo document */
+ 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 .= "[0-9A-Za-z_]+";
+ } 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.
*
@@ -67,6 +120,8 @@ class SearchMySQL extends SearchEngine {
* @private
*/
function queryNamespaces() {
+ if( is_null($this->namespaces) )
+ return ''; # search all
$namespaces = implode( ',', $this->namespaces );
if ($namespaces == '') {
$namespaces = '0';
@@ -154,7 +209,7 @@ class SearchMySQL extends SearchEngine {
'si_page' => $id,
'si_title' => $title,
'si_text' => $text
- ), 'SearchMySQL4::update' );
+ ), __METHOD__ );
}
/**
@@ -170,13 +225,13 @@ class SearchMySQL extends SearchEngine {
$dbw->update( 'searchindex',
array( 'si_title' => $title ),
array( 'si_page' => $id ),
- 'SearchMySQL4::updateTitle',
+ __METHOD__,
array( $dbw->lowPriorityOption() ) );
}
}
/**
- * @addtogroup Search
+ * @ingroup Search
*/
class MySQLSearchResultSet extends SearchResultSet {
function MySQLSearchResultSet( $resultSet, $terms ) {
@@ -200,10 +255,8 @@ class MySQLSearchResultSet extends SearchResultSet {
return new SearchResult( $row );
}
}
-
+
function free() {
$this->mResultSet->free();
}
}
-
-