Merge "Revert "PrefixSearch (ApiOpenSearch) now supports searching in multiple namespaces""
This commit is contained in:
commit
d65e736864
1 changed files with 36 additions and 42 deletions
|
|
@ -51,33 +51,32 @@ abstract class PrefixSearch {
|
|||
*/
|
||||
public function search( $search, $limit, $namespaces = array() ) {
|
||||
$search = trim( $search );
|
||||
if ( $search === '' ) {
|
||||
return array();
|
||||
if ( $search == '' ) {
|
||||
return array(); // Return empty result
|
||||
}
|
||||
|
||||
$namespaces = $this->validateNamespaces( $namespaces );
|
||||
|
||||
// Is this a namespace prefix? Start listing all pages in it.
|
||||
$title = Title::newFromText( $search . 'Dummy' );
|
||||
if ( $title
|
||||
&& $title->getText() === 'Dummy'
|
||||
&& !$title->inNamespace( NS_MAIN )
|
||||
&& !$title->isExternal()
|
||||
) {
|
||||
$this->searchBackend( array( $title->getNamespace() ), '', $limit );
|
||||
}
|
||||
|
||||
// Explicit namespace prefix? Limit search to that namespace.
|
||||
// Find a Title which is not an interwiki and is in NS_MAIN
|
||||
$title = Title::newFromText( $search );
|
||||
if ( $title
|
||||
&& !$title->isExternal()
|
||||
&& !$title->inNamespace( NS_MAIN )
|
||||
) {
|
||||
// This will convert first letter to uppercase if appropriate for the namespace
|
||||
$this->searchBackend( array( $title->getNamespace() ), $title->getText(), $limit );
|
||||
if ( $title && !$title->isExternal() ) {
|
||||
$ns = array( $title->getNamespace() );
|
||||
if ( $ns[0] == NS_MAIN ) {
|
||||
$ns = $namespaces; // no explicit prefix, use default namespaces
|
||||
}
|
||||
return $this->searchBackend(
|
||||
$ns, $title->getText(), $limit );
|
||||
}
|
||||
|
||||
// Is this a namespace prefix?
|
||||
$title = Title::newFromText( $search . 'Dummy' );
|
||||
if ( $title && $title->getText() == 'Dummy'
|
||||
&& $title->getNamespace() != NS_MAIN
|
||||
&& !$title->isExternal() )
|
||||
{
|
||||
$namespaces = array( $title->getNamespace() );
|
||||
$search = '';
|
||||
}
|
||||
|
||||
// Search in all requested namespaces
|
||||
return $this->searchBackend( $namespaces, $search, $limit );
|
||||
}
|
||||
|
||||
|
|
@ -236,33 +235,28 @@ abstract class PrefixSearch {
|
|||
* @return array Array of Title objects
|
||||
*/
|
||||
protected function defaultSearchBackend( $namespaces, $search, $limit ) {
|
||||
$ns = array_shift( $namespaces ); // support only one namespace
|
||||
if ( in_array( NS_MAIN, $namespaces ) ) {
|
||||
$ns = NS_MAIN; // if searching on many always default to main
|
||||
}
|
||||
|
||||
$t = Title::newFromText( $search, $ns );
|
||||
$prefix = $t ? $t->getDBkey() : '';
|
||||
$dbr = wfGetDB( DB_SLAVE );
|
||||
|
||||
// Construct suitable prefix for each namespace, they might differ
|
||||
$prefixes = array();
|
||||
foreach ( $namespaces as $ns ) {
|
||||
$title = Title::makeTitleSafe( $ns, $search );
|
||||
$prefix = $title ? $title->getDBkey() : '';
|
||||
$prefixes[$prefix][] = $ns;
|
||||
}
|
||||
|
||||
$conds = array();
|
||||
foreach ( $prefixes as $prefix => $nss ) {
|
||||
$conds[] = $dbr->makeList( array(
|
||||
'page_namespace' => $nss,
|
||||
'page_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
|
||||
), LIST_AND );
|
||||
}
|
||||
|
||||
$res = $dbr->select( 'page',
|
||||
array( 'page_id', 'page_namespace', 'page_title' ),
|
||||
$dbr->makeList( $conds, LIST_OR ),
|
||||
array(
|
||||
'page_namespace' => $ns,
|
||||
'page_title ' . $dbr->buildLike( $prefix, $dbr->anyString() )
|
||||
),
|
||||
__METHOD__,
|
||||
array( 'LIMIT' => $limit, 'ORDER BY' => 'page_title' )
|
||||
);
|
||||
|
||||
// Shorter than a loop, and doesn't break class api
|
||||
return iterator_to_array( TitleArray::newFromResult( $res ) );
|
||||
$srchres = array();
|
||||
foreach ( $res as $row ) {
|
||||
$srchres[] = Title::newFromRow( $row );
|
||||
}
|
||||
return $srchres;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue