MediaWiki  master
ApiQueryAllCategories.php
Go to the documentation of this file.
1 <?php
30 
31  public function __construct( ApiQuery $query, $moduleName ) {
32  parent::__construct( $query, $moduleName, 'ac' );
33  }
34 
35  public function execute() {
36  $this->run();
37  }
38 
39  public function getCacheMode( $params ) {
40  return 'public';
41  }
42 
43  public function executeGenerator( $resultPageSet ) {
44  $this->run( $resultPageSet );
45  }
46 
50  private function run( $resultPageSet = null ) {
51  $db = $this->getDB();
52  $params = $this->extractRequestParams();
53 
54  $this->addTables( 'category' );
55  $this->addFields( 'cat_title' );
56 
57  if ( !is_null( $params['continue'] ) ) {
58  $cont = explode( '|', $params['continue'] );
59  $this->dieContinueUsageIf( count( $cont ) != 1 );
60  $op = $params['dir'] == 'descending' ? '<' : '>';
61  $cont_from = $db->addQuotes( $cont[0] );
62  $this->addWhere( "cat_title $op= $cont_from" );
63  }
64 
65  $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
66  $from = ( $params['from'] === null
67  ? null
68  : $this->titlePartToKey( $params['from'], NS_CATEGORY ) );
69  $to = ( $params['to'] === null
70  ? null
71  : $this->titlePartToKey( $params['to'], NS_CATEGORY ) );
72  $this->addWhereRange( 'cat_title', $dir, $from, $to );
73 
74  $min = $params['min'];
75  $max = $params['max'];
76  if ( $dir == 'newer' ) {
77  $this->addWhereRange( 'cat_pages', 'newer', $min, $max );
78  } else {
79  $this->addWhereRange( 'cat_pages', 'older', $max, $min );
80  }
81 
82  if ( isset( $params['prefix'] ) ) {
83  $this->addWhere( 'cat_title' . $db->buildLike(
84  $this->titlePartToKey( $params['prefix'], NS_CATEGORY ),
85  $db->anyString() ) );
86  }
87 
88  $this->addOption( 'LIMIT', $params['limit'] + 1 );
89  $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
90  $this->addOption( 'ORDER BY', 'cat_title' . $sort );
91 
92  $prop = array_flip( $params['prop'] );
93  $this->addFieldsIf( [ 'cat_pages', 'cat_subcats', 'cat_files' ], isset( $prop['size'] ) );
94  if ( isset( $prop['hidden'] ) ) {
95  $this->addTables( [ 'page', 'page_props' ] );
96  $this->addJoinConds( [
97  'page' => [ 'LEFT JOIN', [
98  'page_namespace' => NS_CATEGORY,
99  'page_title=cat_title' ] ],
100  'page_props' => [ 'LEFT JOIN', [
101  'pp_page=page_id',
102  'pp_propname' => 'hiddencat' ] ],
103  ] );
104  $this->addFields( [ 'cat_hidden' => 'pp_propname' ] );
105  }
106 
107  $res = $this->select( __METHOD__ );
108 
109  $pages = [];
110 
111  $result = $this->getResult();
112  $count = 0;
113  foreach ( $res as $row ) {
114  if ( ++$count > $params['limit'] ) {
115  // We've reached the one extra which shows that there are
116  // additional cats to be had. Stop here...
117  $this->setContinueEnumParameter( 'continue', $row->cat_title );
118  break;
119  }
120 
121  // Normalize titles
122  $titleObj = Title::makeTitle( NS_CATEGORY, $row->cat_title );
123  if ( !is_null( $resultPageSet ) ) {
124  $pages[] = $titleObj;
125  } else {
126  $item = [];
127  ApiResult::setContentValue( $item, 'category', $titleObj->getText() );
128  if ( isset( $prop['size'] ) ) {
129  $item['size'] = (int)$row->cat_pages;
130  $item['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
131  $item['files'] = (int)$row->cat_files;
132  $item['subcats'] = (int)$row->cat_subcats;
133  }
134  if ( isset( $prop['hidden'] ) ) {
135  $item['hidden'] = (bool)$row->cat_hidden;
136  }
137  $fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $item );
138  if ( !$fit ) {
139  $this->setContinueEnumParameter( 'continue', $row->cat_title );
140  break;
141  }
142  }
143  }
144 
145  if ( is_null( $resultPageSet ) ) {
146  $result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'c' );
147  } else {
148  $resultPageSet->populateFromTitles( $pages );
149  }
150  }
151 
152  public function getAllowedParams() {
153  return [
154  'from' => null,
155  'continue' => [
156  ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
157  ],
158  'to' => null,
159  'prefix' => null,
160  'dir' => [
161  ApiBase::PARAM_DFLT => 'ascending',
163  'ascending',
164  'descending'
165  ],
166  ],
167  'min' => [
168  ApiBase::PARAM_TYPE => 'integer'
169  ],
170  'max' => [
171  ApiBase::PARAM_TYPE => 'integer'
172  ],
173  'limit' => [
174  ApiBase::PARAM_DFLT => 10,
175  ApiBase::PARAM_TYPE => 'limit',
176  ApiBase::PARAM_MIN => 1,
179  ],
180  'prop' => [
181  ApiBase::PARAM_TYPE => [ 'size', 'hidden' ],
182  ApiBase::PARAM_DFLT => '',
183  ApiBase::PARAM_ISMULTI => true,
185  ],
186  ];
187  }
188 
189  protected function getExamplesMessages() {
190  return [
191  'action=query&list=allcategories&acprop=size'
192  => 'apihelp-query+allcategories-example-size',
193  'action=query&generator=allcategories&gacprefix=List&prop=info'
194  => 'apihelp-query+allcategories-example-generator',
195  ];
196  }
197 
198  public function getHelpUrls() {
199  return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allcategories';
200  }
201 }
select( $method, $extraQuery=[], array &$hookData=null)
Execute a SELECT query based on the values in the internal arrays.
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below...
Definition: ApiBase.php:94
getDB()
Get the Query database connection (read-only)
const LIMIT_BIG2
Fast query, apihighlimits limit.
Definition: ApiBase.php:261
getResult()
Get the result object.
Definition: ApiBase.php:640
addJoinConds( $join_conds)
Add a set of JOIN conditions to the internal array.
const PARAM_DFLT
(null|boolean|integer|string) Default value of the parameter.
Definition: ApiBase.php:55
const LIMIT_BIG1
Fast query, standard limit.
Definition: ApiBase.php:259
executeGenerator( $resultPageSet)
const PARAM_MAX
(integer) Max value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:97
Query module to enumerate all categories, even the ones that don&#39;t have category pages.
$sort
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user...
Definition: ApiBase.php:761
const PARAM_HELP_MSG_PER_VALUE
((string|array|Message)[]) When PARAM_TYPE is an array, this is an array mapping those values to $msg...
Definition: ApiBase.php:164
setContinueEnumParameter( $paramName, $paramValue)
Overridden to set the generator param if in generator mode.
__construct(ApiQuery $query, $moduleName)
static setContentValue(array &$arr, $name, $value, $flags=0)
Add an output value to the array by name and mark as META_CONTENT.
Definition: ApiResult.php:478
addTables( $tables, $alias=null)
Add a set of tables to the internal array.
titlePartToKey( $titlePart, $namespace=NS_MAIN)
Convert an input title or title prefix into a dbkey.
dieContinueUsageIf( $condition)
Die with the &#39;badcontinue&#39; error.
Definition: ApiBase.php:2199
const NS_CATEGORY
Definition: Defines.php:74
getModuleName()
Get the name of the module being executed by this instance.
Definition: ApiBase.php:520
addFields( $value)
Add a set of fields to select to the internal array.
const PARAM_MAX2
(integer) Max value allowed for the parameter for users with the apihighlimits right, for PARAM_TYPE &#39;limit&#39;.
Definition: ApiBase.php:103
This is the main query class.
Definition: ApiQuery.php:37
const PARAM_HELP_MSG
(string|array|Message) Specify an alternative i18n documentation message for this parameter...
Definition: ApiBase.php:131
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:586
addWhere( $value)
Add a set of WHERE clauses to the internal array.
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
Definition: ApiBase.php:58
addFieldsIf( $value, $condition)
Same as addFields(), but add the fields only if a condition is met.
addOption( $name, $value=null)
Add an option such as LIMIT or USE INDEX.
const PARAM_MIN
(integer) Lowest value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:106
run( $resultPageSet=null)
addWhereRange( $field, $dir, $start, $end, $sort=true)
Add a WHERE clause corresponding to a range, and an ORDER BY clause to sort in the right direction...