diff options
Diffstat (limited to 'includes/api/ApiQueryCategoryMembers.php')
-rw-r--r-- | includes/api/ApiQueryCategoryMembers.php | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php index 3909b213..e2f577a2 100644 --- a/includes/api/ApiQueryCategoryMembers.php +++ b/includes/api/ApiQueryCategoryMembers.php @@ -76,17 +76,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { $this->addTables(array('page','categorylinks')); // must be in this order for 'USE INDEX' // Not needed after bug 10280 is applied to servers if($params['sort'] == 'timestamp') - { $this->addOption('USE INDEX', 'cl_timestamp'); - // cl_timestamp will be added by addWhereRange() later - $this->addOption('ORDER BY', 'cl_to'); - } else - { - $dir = ($params['dir'] == 'desc' ? ' DESC' : ''); $this->addOption('USE INDEX', 'cl_sortkey'); - $this->addOption('ORDER BY', 'cl_to, cl_sortkey' . $dir . ', cl_from' . $dir); - } $this->addWhere('cl_from=page_id'); $this->setContinuation($params['continue'], $params['dir']); @@ -94,6 +86,11 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { $this->addWhereFld('page_namespace', $params['namespace']); if($params['sort'] == 'timestamp') $this->addWhereRange('cl_timestamp', ($params['dir'] == 'asc' ? 'newer' : 'older'), $params['start'], $params['end']); + else + { + $this->addWhereRange('cl_sortkey', ($params['dir'] == 'asc' ? 'newer' : 'older'), $params['startsortkey'], $params['endsortkey']); + $this->addWhereRange('cl_from', ($params['dir'] == 'asc' ? 'newer' : 'older'), null, null); + } $limit = $params['limit']; $this->addOption('LIMIT', $limit +1); @@ -157,18 +154,15 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { if (is_null($continue)) return; // This is not a continuation request - $continueList = explode('|', $continue); - $hasError = count($continueList) != 2; - $from = 0; - if (!$hasError && strlen($continueList[1]) > 0) { - $from = intval($continueList[1]); - $hasError = ($from == 0); - } + $pos = strrpos($continue, '|'); + $sortkey = substr($continue, 0, $pos); + $fromstr = substr($continue, $pos + 1); + $from = intval($fromstr); - if ($hasError) + if ($from == 0 && strlen($fromstr) > 0) $this->dieUsage("Invalid continue param. You should pass the original value returned by the previous query", "badcontinue"); - $encSortKey = $this->getDB()->addQuotes($continueList[0]); + $encSortKey = $this->getDB()->addQuotes($sortkey); $encFrom = $this->getDB()->addQuotes($from); $op = ($dir == 'desc' ? '<' : '>'); @@ -225,7 +219,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { ), 'end' => array( ApiBase :: PARAM_TYPE => 'timestamp' - ) + ), + 'startsortkey' => null, + 'endsortkey' => null, ); } @@ -238,6 +234,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { 'dir' => 'In which direction to sort', 'start' => 'Timestamp to start listing from. Can only be used with cmsort=timestamp', 'end' => 'Timestamp to end listing at. Can only be used with cmsort=timestamp', + 'startsortkey' => 'Sortkey to start listing from. Can only be used with cmsort=sortkey', + 'endsortkey' => 'Sortkey to end listing at. Can only be used with cmsort=sortkey', 'continue' => 'For large categories, give the value retured from previous query', 'limit' => 'The maximum number of pages to return.', ); @@ -257,6 +255,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryCategoryMembers.php 35098 2008-05-20 17:13:28Z ialex $'; + return __CLASS__ . ': $Id: ApiQueryCategoryMembers.php 42197 2008-10-18 10:09:19Z ialex $'; } } |