wiki.techinc.nl/includes/search/SearchDatabase.php
David Causse 92c20832f1 Deprecate SearchResult::termMatches()
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
2019-06-27 08:44:06 -07:00

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];
}
}