$offset = $params['offset'];
$searchEngine = $this->buildSearchEngine( $params );
- $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) );
+ $suggestions = $searchEngine->completionSearchWithVariants( $search );
+ $titles = $searchEngine->extractTitles( $suggestions );
+
+ if ( $suggestions->hasMoreResults() ) {
+ $this->setContinueEnumParameter( 'offset', $offset + $limit );
+ }
if ( $resultPageSet ) {
- $resultPageSet->setRedirectMergePolicy( function( array $current, array $new ) {
+ $resultPageSet->setRedirectMergePolicy( function ( array $current, array $new ) {
if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
$current['index'] = $new['index'];
}
return $current;
} );
- if ( count( $titles ) > $limit ) {
- $this->setContinueEnumParameter( 'offset', $offset + $limit );
- array_pop( $titles );
- }
$resultPageSet->populateFromTitles( $titles );
foreach ( $titles as $index => $title ) {
$resultPageSet->setGeneratorData( $title, [ 'index' => $index + $offset + 1 ] );
$result = $this->getResult();
$count = 0;
foreach ( $titles as $title ) {
- if ( ++$count > $limit ) {
- $this->setContinueEnumParameter( 'offset', $offset + $limit );
- break;
- }
$vals = [
'ns' => intval( $title->getNamespace() ),
'title' => $title->getPrefixedText(),
$vals['pageid'] = intval( $title->getArticleID() );
}
$fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $vals );
+ ++$count;
if ( !$fit ) {
- $this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
+ $this->setContinueEnumParameter( 'offset', $offset + $count );
break;
}
}
if ( $this->allowedParams !== null ) {
return $this->allowedParams;
}
- $this->allowedParams = [
- 'search' => [
- ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true,
- ],
- 'namespace' => [
- ApiBase::PARAM_DFLT => NS_MAIN,
- ApiBase::PARAM_TYPE => 'namespace',
- ApiBase::PARAM_ISMULTI => true,
- ],
- 'limit' => [
- ApiBase::PARAM_DFLT => 10,
- ApiBase::PARAM_TYPE => 'limit',
- ApiBase::PARAM_MIN => 1,
- // Non-standard value for compatibility with action=opensearch
- ApiBase::PARAM_MAX => 100,
- ApiBase::PARAM_MAX2 => 200,
- ],
- 'offset' => [
- ApiBase::PARAM_DFLT => 0,
- ApiBase::PARAM_TYPE => 'integer',
- ],
- ];
- $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
- 'apihelp-query+prefixsearch-param-profile' );
- if ( $profileParam ) {
- $this->allowedParams['profile'] = $profileParam;
- }
+ $this->allowedParams = $this->buildCommonApiParams();
+
return $this->allowedParams;
}
public function getSearchProfileParams() {
- if ( isset( $this->getAllowedParams()['profile'] ) ) {
- return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
- }
- return [];
+ return [
+ 'profile' => [
+ 'profile-type' => SearchEngine::COMPLETION_PROFILE_TYPE,
+ 'help-message' => 'apihelp-query+prefixsearch-param-profile',
+ ],
+ ];
}
protected function getExamplesMessages() {
}
public function getHelpUrls() {
- return 'https://www.mediawiki.org/wiki/API:Prefixsearch';
+ return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Prefixsearch';
}
}