From 04cae75f25ba3836130f7d905fcfc6c856150ba5 Mon Sep 17 00:00:00 2001 From: Bryan Tong Minh Date: Tue, 25 Aug 2009 20:18:12 +0000 Subject: [PATCH] (bug 19999) Made metadata and properties of search results optional. Added srprop and srinfo. --- RELEASE-NOTES | 2 + includes/api/ApiQuerySearch.php | 107 ++++++++++++++++++++++---------- 2 files changed, 75 insertions(+), 34 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index e9ea0498d7..881195eb20 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -487,6 +487,8 @@ this. Was used when mwEmbed was going to be an extension. * (bug 19907) $wgCrossSiteAJAXdomains added to allow specified (or all) external domains to access api.php via AJAX, if the browser supports the Access-Control-Allow-Origin HTTP header +* (bug 19999) Made metadata and properties of search results optional. Added + srprop and srinfo. === Languages updated in 1.16 === diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php index 1d1a44f2b6..6d3422d1a7 100644 --- a/includes/api/ApiQuerySearch.php +++ b/includes/api/ApiQuerySearch.php @@ -35,7 +35,7 @@ if (!defined('MEDIAWIKI')) { */ class ApiQuerySearch extends ApiQueryGeneratorBase { - public function __construct($query, $moduleName) { + public function __construct( $query, $moduleName ) { parent :: __construct($query, $moduleName, 'sr'); } @@ -43,26 +43,32 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { $this->run(); } - public function executeGenerator($resultPageSet) { - $this->run($resultPageSet); + public function executeGenerator( $resultPageSet ) { + $this->run( $resultPageSet ); } - private function run($resultPageSet = null) { + private function run( $resultPageSet = null ) { global $wgContLang; $params = $this->extractRequestParams(); + // Extract parameters $limit = $params['limit']; $query = $params['search']; $what = $params['what']; - if (strval($query) === '') - $this->dieUsage("empty search string is not allowed", 'param-search'); + $searchInfo = array_flip( $params['info'] ); + $prop = array_flip( $params['prop'] ); + + if ( strval( $query ) === '' ) + $this->dieUsage( "empty search string is not allowed", 'param-search' ); + // Create search engine instance and set options $search = SearchEngine::create(); $search->setLimitOffset( $limit+1, $params['offset'] ); $search->setNamespaces( $params['namespace'] ); $search->showRedirects = $params['redirects']; - if ($what == 'text') { + // Perform the actual search + if ( $what == 'text' ) { $matches = $search->searchText( $query ); } elseif( $what == 'title' ) { $matches = $search->searchTitle( $query ); @@ -83,45 +89,56 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { $matches = $search->searchText( $query ); } } - if (is_null($matches)) - $this->dieUsage("{$what} search is disabled", - "search-{$what}-disabled"); + if ( is_null( $matches ) ) + $this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" ); - $totalhits = $matches->getTotalHits(); - if( $totalhits !== null ) { - $this->getResult()->addValue( array( 'query', 'searchinfo' ), 'totalhits', $totalhits ); + // Add search meta data to result + if ( isset( $searchInfo['totalhits'] ) ) { + $totalhits = $matches->getTotalHits(); + if( $totalhits !== null ) { + $this->getResult()->addValue( array( 'query', 'searchinfo' ), + 'totalhits', $totalhits ); + } } - if( $matches->hasSuggestion() ) { - $this->getResult()->addValue( array( 'query', 'searchinfo' ), 'suggestion', - $matches->getSuggestionQuery() ); + if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) { + $this->getResult()->addValue( array( 'query', 'searchinfo' ), + 'suggestion', $matches->getSuggestionQuery() ); } - $terms = $wgContLang->convertForSearchResult($matches->termMatches()); + // Add the search results to the result + $terms = $wgContLang->convertForSearchResult( $matches->termMatches() ); $titles = array (); $count = 0; - while( $result = $matches->next() ) { - if (++ $count > $limit) { + while ( $result = $matches->next() ) { + if ( ++ $count > $limit ) { // We've reached the one extra which shows that there are additional items to be had. Stop here... - $this->setContinueEnumParameter('offset', $params['offset'] + $params['limit']); + $this->setContinueEnumParameter( 'offset', $params['offset'] + $params['limit'] ); break; } // Silently skip broken and missing titles - if ($result->isBrokenTitle() || $result->isMissingRevision()) + if ( $result->isBrokenTitle() || $result->isMissingRevision() ) continue; $title = $result->getTitle(); - if (is_null($resultPageSet)) { + if ( is_null( $resultPageSet ) ) { $vals = array(); - ApiQueryBase::addTitleInfo($vals, $title); - $vals['snippet'] = $result->getTextSnippet($terms); - $vals['size'] = $result->getByteSize(); - $vals['wordcount'] = $result->getWordCount(); - $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() ); - $fit = $this->getResult()->addValue(array('query', $this->getModuleName()), null, $vals); - if(!$fit) - { - $this->setContinueEnumParameter('offset', $params['offset'] + $count - 1); + ApiQueryBase::addTitleInfo( $vals, $title ); + + if ( isset( $prop['snippet'] ) ) + $vals['snippet'] = $result->getTextSnippet( $terms ); + if ( isset( $prop['size'] ) ) + $vals['size'] = $result->getByteSize(); + if ( isset( $prop['wordcount'] ) ) + $vals['wordcount'] = $result->getWordCount(); + if ( isset( $prop['timestamp'] ) ) + $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() ); + + // Add item to results and see whether it fits + $fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), + null, $vals ); + if ( !$fit ) { + $this->setContinueEnumParameter( 'offset', $params['offset'] + $count - 1 ); break; } } else { @@ -129,10 +146,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { } } - if (is_null($resultPageSet)) { - $this->getResult()->setIndexedTagName_internal(array('query', $this->getModuleName()), 'p'); + if ( is_null( $resultPageSet ) ) { + $this->getResult()->setIndexedTagName_internal( array( + 'query', $this->getModuleName() + ), 'p' ); } else { - $resultPageSet->populateFromTitles($titles); + $resultPageSet->populateFromTitles( $titles ); } } @@ -151,6 +170,24 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { 'text', ) ), + 'info' => array( + ApiBase :: PARAM_DFLT => 'totalhits|suggestion', + ApiBase :: PARAM_TYPE => array ( + 'totalhits', + 'suggestion', + ), + ApiBase :: PARAM_ISMULTI => true, + ), + 'prop' => array( + ApiBase :: PARAM_DFLT => 'size|wordcount|timestamp|snippet', + ApiBase :: PARAM_TYPE => array ( + 'size', + 'wordcount', + 'timestamp', + 'snippet', + ), + ApiBase :: PARAM_ISMULTI => true, + ), 'redirects' => false, 'offset' => 0, 'limit' => array ( @@ -168,6 +205,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { 'search' => 'Search for all page titles (or content) that has this value.', 'namespace' => 'The namespace(s) to enumerate.', 'what' => 'Search inside the text or titles.', + 'info' => 'What metadata to return.', + 'prop' => 'What properties to return.', 'redirects' => 'Include redirect pages in the search.', 'offset' => 'Use this value to continue paging (return by query)', 'limit' => 'How many total pages to return.' -- 2.20.1