And start indicating that hooks relying on this data might become unreliable as this data is only populated by SearchDatabase search engines. This information was only populated by SearchDatabase implementations and due to bad initial design of SearchResult[Set] (now fixed) it forced users of these classes to carry this information for the sole purpose of highlighting. Because SearchEngine can now own their SearchResult[Set] implementations nothing that is engine specific should be exposed outside of these specific implementations. If there are some logic that still requires access to such list of terms they should be made engine specific by guarding their code against instanceof SqlSearchResult. Change-Id: I38b82c5e4c35309ee447edc3ded60ca6a18b247a Depends-On: I53fe37c65c7940f696c1e184125e01e592a976e4
112 lines
3.1 KiB
PHP
112 lines
3.1 KiB
PHP
<?php
|
|
/**
|
|
* Database search engine
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
* @ingroup Search
|
|
*/
|
|
|
|
use Wikimedia\Rdbms\IDatabase;
|
|
use Wikimedia\Rdbms\ILoadBalancer;
|
|
|
|
/**
|
|
* Base search engine base class for database-backed searches
|
|
* @ingroup Search
|
|
* @since 1.23
|
|
*/
|
|
abstract class SearchDatabase extends SearchEngine {
|
|
/** @var ILoadBalancer */
|
|
protected $lb;
|
|
/** @var IDatabase (backwards compatibility) */
|
|
protected $db;
|
|
|
|
/**
|
|
* @var string[] search terms
|
|
*/
|
|
protected $searchTerms = [];
|
|
|
|
/**
|
|
* @param ILoadBalancer $lb The load balancer for the DB cluster to search on
|
|
*/
|
|
public function __construct( ILoadBalancer $lb ) {
|
|
$this->lb = $lb;
|
|
// @TODO: remove this deprecated field in 1.35
|
|
$this->db = $lb->getLazyConnectionRef( DB_REPLICA ); // b/c
|
|
}
|
|
|
|
/**
|
|
* @param string $term
|
|
* @return SearchResultSet|Status|null
|
|
*/
|
|
final public function doSearchText( $term ) {
|
|
return $this->doSearchTextInDB( $this->extractNamespacePrefix( $term ) );
|
|
}
|
|
|
|
/**
|
|
* Perform a full text search query and return a result set.
|
|
*
|
|
* @param string $term Raw search term
|
|
* @return SqlSearchResultSet
|
|
*/
|
|
abstract protected function doSearchTextInDB( $term );
|
|
|
|
/**
|
|
* @param string $term
|
|
* @return SearchResultSet|null
|
|
*/
|
|
final public function doSearchTitle( $term ) {
|
|
return $this->doSearchTitleInDB( $this->extractNamespacePrefix( $term ) );
|
|
}
|
|
|
|
/**
|
|
* Perform a title-only search query and return a result set.
|
|
*
|
|
* @param string $term Raw search term
|
|
* @return SqlSearchResultSet
|
|
*/
|
|
abstract protected function doSearchTitleInDB( $term );
|
|
|
|
/**
|
|
* Return a 'cleaned up' search string
|
|
*
|
|
* @param string $text
|
|
* @return string
|
|
*/
|
|
protected function filter( $text ) {
|
|
// List of chars allowed in the search query.
|
|
// This must include chars used in the search syntax.
|
|
// Usually " (phrase) or * (wildcards) if supported by the engine
|
|
$lc = $this->legalSearchChars( self::CHARS_ALL );
|
|
return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
|
|
}
|
|
|
|
/**
|
|
* Extract the optional namespace prefix and set self::namespaces
|
|
* accordingly and return the query string
|
|
* @param string $term
|
|
* @return string the query string without any namespace prefix
|
|
*/
|
|
final protected function extractNamespacePrefix( $term ) {
|
|
$queryAndNs = self::parseNamespacePrefixes( $term );
|
|
if ( $queryAndNs === false ) {
|
|
return $term;
|
|
}
|
|
$this->namespaces = $queryAndNs[1];
|
|
return $queryAndNs[0];
|
|
}
|
|
}
|