X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryTags.php;h=7f2dc85fb7dca82d6073edd293ef899be28bbaef;hb=87070fc6743bfe5da7b49f07561fc1e0b03897c4;hp=3184564845b6fa2e3c19d17d4da89b987970e6c5;hpb=3c64eb81bdf669a63628ca2fcf37be1241220e9a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php index 3184564845..7f2dc85fb7 100644 --- a/includes/api/ApiQueryTags.php +++ b/includes/api/ApiQueryTags.php @@ -31,15 +31,6 @@ */ class ApiQueryTags extends ApiQueryBase { - /** - * @var ApiResult - */ - private $result; - - private $limit; - private $fld_displayname = false, $fld_description = false, - $fld_hitcount = false; - public function __construct( ApiQuery $query, $moduleName ) { parent::__construct( $query, $moduleName, 'tg' ); } @@ -49,84 +40,77 @@ class ApiQueryTags extends ApiQueryBase { $prop = array_flip( $params['prop'] ); - $this->fld_displayname = isset( $prop['displayname'] ); - $this->fld_description = isset( $prop['description'] ); - $this->fld_hitcount = isset( $prop['hitcount'] ); - - $this->limit = $params['limit']; - $this->result = $this->getResult(); + $fld_displayname = isset( $prop['displayname'] ); + $fld_description = isset( $prop['description'] ); + $fld_hitcount = isset( $prop['hitcount'] ); + $fld_defined = isset( $prop['defined'] ); + + $limit = $params['limit']; + $result = $this->getResult(); + + $definedTags = array_fill_keys( ChangeTags::listDefinedTags(), 0 ); + + # Fetch defined tags that aren't past the continuation + if ( $params['continue'] !== null ) { + $cont = $params['continue']; + $tags = array_filter( array_keys( $definedTags ), function ( $v ) use ( $cont ) { + return $v >= $cont; + } ); + $tags = array_fill_keys( $tags, 0 ); + } else { + $tags = $definedTags; + } + # Merge in all used tags $this->addTables( 'change_tag' ); $this->addFields( 'ct_tag' ); - - $this->addFieldsIf( array( 'hitcount' => 'COUNT(*)' ), $this->fld_hitcount ); - - $this->addOption( 'LIMIT', $this->limit + 1 ); + $this->addFields( array( 'hitcount' => $fld_hitcount ? 'COUNT(*)' : '0' ) ); + $this->addOption( 'LIMIT', $limit + 1 ); $this->addOption( 'GROUP BY', 'ct_tag' ); $this->addWhereRange( 'ct_tag', 'newer', $params['continue'], null ); - $res = $this->select( __METHOD__ ); - - $ok = true; - foreach ( $res as $row ) { - if ( !$ok ) { - break; - } - $ok = $this->doTag( $row->ct_tag, $this->fld_hitcount ? $row->hitcount : 0 ); + $tags[$row->ct_tag] = (int)$row->hitcount; } - // include tags with no hits yet - foreach ( ChangeTags::listDefinedTags() as $tag ) { - if ( !$ok ) { + # Now make sure the array is sorted for proper continuation + ksort( $tags ); + + $count = 0; + foreach ( $tags as $tagName => $hitcount ) { + if ( ++$count > $limit ) { + $this->setContinueEnumParameter( 'continue', $tagName ); break; } - $ok = $this->doTag( $tag, 0 ); - } - - $this->result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'tag' ); - } - - private function doTag( $tagName, $hitcount ) { - static $count = 0; - static $doneTags = array(); - - if ( in_array( $tagName, $doneTags ) ) { - return true; - } - - if ( ++$count > $this->limit ) { - $this->setContinueEnumParameter( 'continue', $tagName ); - - return false; - } - - $tag = array(); - $tag['name'] = $tagName; - if ( $this->fld_displayname ) { - $tag['displayname'] = ChangeTags::tagDescription( $tagName ); - } + $tag = array(); + $tag['name'] = $tagName; - if ( $this->fld_description ) { - $msg = wfMessage( "tag-$tagName-description" ); - $tag['description'] = $msg->exists() ? $msg->text() : ''; - } + if ( $fld_displayname ) { + $tag['displayname'] = ChangeTags::tagDescription( $tagName ); + } - if ( $this->fld_hitcount ) { - $tag['hitcount'] = $hitcount; - } + if ( $fld_description ) { + $msg = $this->msg( "tag-$tagName-description" ); + $tag['description'] = $msg->exists() ? $msg->text() : ''; + } - $doneTags[] = $tagName; + if ( $fld_hitcount ) { + $tag['hitcount'] = $hitcount; + } - $fit = $this->result->addValue( array( 'query', $this->getModuleName() ), null, $tag ); - if ( !$fit ) { - $this->setContinueEnumParameter( 'continue', $tagName ); + if ( $fld_defined && isset( $definedTags[$tagName] ) ) { + $tag['defined'] = ''; + } - return false; + $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $tag ); + if ( !$fit ) { + $this->setContinueEnumParameter( 'continue', $tagName ); + break; + } } - return true; + $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'tag' ); } public function getCacheMode( $params ) { @@ -135,7 +119,9 @@ class ApiQueryTags extends ApiQueryBase { public function getAllowedParams() { return array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -149,34 +135,18 @@ class ApiQueryTags extends ApiQueryBase { 'name', 'displayname', 'description', - 'hitcount' + 'hitcount', + 'defined', ), ApiBase::PARAM_ISMULTI => true ) ); } - public function getParamDescription() { - return array( - 'continue' => 'When more results are available, use this to continue', - 'limit' => 'The maximum number of tags to list', - 'prop' => array( - 'Which properties to get', - ' name - Adds name of tag', - ' displayname - Adds system message for the tag', - ' description - Adds description of the tag', - ' hitcount - Adds the amount of revisions that have this tag', - ), - ); - } - - public function getDescription() { - return 'List change tags.'; - } - - public function getExamples() { + protected function getExamplesMessages() { return array( - 'api.php?action=query&list=tags&tgprop=displayname|description|hitcount' + 'action=query&list=tags&tgprop=displayname|description|hitcount|defined' + => 'apihelp-query+tags-example-simple', ); }