X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryCategoryMembers.php;h=ba8a472815ed248ea9f739a4f7c0072564169173;hb=59254f1bc827cec0872a27d222a3d1f4f9beadda;hp=23dca8194cccf84d5ea55a61aa8750760018dd4c;hpb=5ea924d9dc5a1e9a17d23443009b5a7ded6563e1;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php index 23dca8194c..ba8a472815 100644 --- a/includes/api/ApiQueryCategoryMembers.php +++ b/includes/api/ApiQueryCategoryMembers.php @@ -31,7 +31,7 @@ if (!defined('MEDIAWIKI')) { /** * A query module to enumerate pages that belong to a category. * - * @addtogroup API + * @ingroup API */ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { @@ -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.', );