(bug 19999) Made metadata and properties of search results optional. Added srprop...
authorBryan Tong Minh <btongminh@users.mediawiki.org>
Tue, 25 Aug 2009 20:18:12 +0000 (20:18 +0000)
committerBryan Tong Minh <btongminh@users.mediawiki.org>
Tue, 25 Aug 2009 20:18:12 +0000 (20:18 +0000)
RELEASE-NOTES
includes/api/ApiQuerySearch.php

index e9ea049..881195e 100644 (file)
@@ -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 ===
 
index 1d1a44f..6d3422d 100644 (file)
@@ -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.'