From 370e83bb0dfd0c70de268c93bf07ad5ee0897192 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Fri, 15 Aug 2008 01:29:47 +0200 Subject: Update auf 1.13.0 --- includes/api/ApiQueryCategories.php | 73 ++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 13 deletions(-) (limited to 'includes/api/ApiQueryCategories.php') diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php index 63d42bfa..51492d63 100644 --- a/includes/api/ApiQueryCategories.php +++ b/includes/api/ApiQueryCategories.php @@ -30,8 +30,8 @@ if (!defined('MEDIAWIKI')) { /** * A query module to enumerate categories the set of pages belong to. - * - * @addtogroup API + * + * @ingroup API */ class ApiQueryCategories extends ApiQueryGeneratorBase { @@ -59,8 +59,8 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { 'cl_from', 'cl_to' )); - - $fld_sortkey = false; + + $fld_sortkey = $fld_timestamp = false; if (!is_null($prop)) { foreach($prop as $p) { switch ($p) { @@ -68,24 +68,51 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { $this->addFields('cl_sortkey'); $fld_sortkey = true; break; + case 'timestamp': + $this->addFields('cl_timestamp'); + $fld_timestamp = true; + break; default : ApiBase :: dieDebug(__METHOD__, "Unknown prop=$p"); } } } - + $this->addTables('categorylinks'); $this->addWhereFld('cl_from', array_keys($this->getPageSet()->getGoodTitles())); - $this->addOption('ORDER BY', "cl_from, cl_to"); + if(!is_null($params['continue'])) { + $cont = explode('|', $params['continue']); + if(count($cont) != 2) + $this->dieUsage("Invalid continue param. You should pass the " . + "original value returned by the previous query", "_badcontinue"); + $clfrom = intval($cont[0]); + $clto = $this->getDb()->strencode($this->titleToKey($cont[1])); + $this->addWhere("cl_from > $clfrom OR ". + "(cl_from = $clfrom AND ". + "cl_to >= '$clto')"); + } + # Don't order by cl_from if it's constant in the WHERE clause + if(count($this->getPageSet()->getGoodTitles()) == 1) + $this->addOption('ORDER BY', 'cl_to'); + else + $this->addOption('ORDER BY', "cl_from, cl_to"); $db = $this->getDB(); $res = $this->select(__METHOD__); if (is_null($resultPageSet)) { - + $data = array(); - $lastId = 0; // database has no ID 0 + $lastId = 0; // database has no ID 0 + $count = 0; while ($row = $db->fetchObject($res)) { + if (++$count > $params['limit']) { + // We've reached the one extra which shows that + // there are additional pages to be had. Stop here... + $this->setContinueEnumParameter('continue', $row->cl_from . + '|' . $this->keyToTitle($row->cl_to)); + break; + } if ($lastId != $row->cl_from) { if($lastId != 0) { $this->addPageSubItems($lastId, $data); @@ -93,13 +120,15 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { } $lastId = $row->cl_from; } - + $title = Title :: makeTitle(NS_CATEGORY, $row->cl_to); - + $vals = array(); ApiQueryBase :: addTitleInfo($vals, $title); if ($fld_sortkey) $vals['sortkey'] = $row->cl_sortkey; + if ($fld_timestamp) + $vals['timestamp'] = $row->cl_timestamp; $data[] = $vals; } @@ -112,6 +141,14 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { $titles = array(); while ($row = $db->fetchObject($res)) { + if (++$count > $params['limit']) { + // We've reached the one extra which shows that + // there are additional pages to be had. Stop here... + $this->setContinueEnumParameter('continue', $row->cl_from . + '|' . $this->keyToTitle($row->cl_to)); + break; + } + $titles[] = Title :: makeTitle(NS_CATEGORY, $row->cl_to); } $resultPageSet->populateFromTitles($titles); @@ -126,14 +163,25 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { ApiBase :: PARAM_ISMULTI => true, ApiBase :: PARAM_TYPE => array ( 'sortkey', + 'timestamp', ) - ) + ), + 'limit' => array( + ApiBase :: PARAM_DFLT => 10, + ApiBase :: PARAM_TYPE => 'limit', + ApiBase :: PARAM_MIN => 1, + ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1, + ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2 + ), + 'continue' => null, ); } public function getParamDescription() { return array ( 'prop' => 'Which additional properties to get for each category.', + 'limit' => 'How many categories to return', + 'continue' => 'When more results are available, use this to continue', ); } @@ -151,7 +199,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryCategories.php 30222 2008-01-28 19:05:26Z catrope $'; + return __CLASS__ . ': $Id: ApiQueryCategories.php 37909 2008-07-22 13:26:15Z catrope $'; } } - -- cgit v1.2.3-54-g00ecf