From 2ebe675ae5ec280a80cbe5e13cefb21af75837be Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 24 Mar 2019 13:56:35 -0700 Subject: [PATCH] Fix an unusual internal cursor in Conpherence Summary: See . Conpherence calls `setAfterID()` and `setBeforeID()` directly on a subquery, but these methods no longer exist. Use a pager instead. This code probably shouldn't exist (we should use some other approach to fetch this data in most cases) but that's a larger change. Test Plan: Sent messages in a Conpherence thread. Before: fatal; after: success. Viewed the Conphrence menu, loaded threads, etc. Reviewers: amckinley Reviewed By: amckinley Differential Revision: https://secure.phabricator.com/D20318 --- .../query/ConpherenceThreadQuery.php | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/applications/conpherence/query/ConpherenceThreadQuery.php b/src/applications/conpherence/query/ConpherenceThreadQuery.php index 5cd6489d65..9c6682a8a7 100644 --- a/src/applications/conpherence/query/ConpherenceThreadQuery.php +++ b/src/applications/conpherence/query/ConpherenceThreadQuery.php @@ -285,23 +285,35 @@ final class ConpherenceThreadQuery } private function loadTransactionsAndHandles(array $conpherences) { - $query = id(new ConpherenceTransactionQuery()) - ->setViewer($this->getViewer()) - ->withObjectPHIDs(array_keys($conpherences)) - ->needHandles(true); + // NOTE: This is older code which has been modernized to the minimum + // standard required by T13266. It probably isn't the best available + // approach to the problems it solves. + + $limit = $this->getTransactionLimit(); + if ($limit) { + // fetch an extra for "show older" scenarios + $limit = $limit + 1; + } else { + $limit = 0xFFFF; + } + + $pager = id(new AphrontCursorPagerView()) + ->setPageSize($limit); // We have to flip these for the underlying query class. The semantics of // paging are tricky business. if ($this->afterTransactionID) { - $query->setBeforeID($this->afterTransactionID); + $pager->setBeforeID($this->afterTransactionID); } else if ($this->beforeTransactionID) { - $query->setAfterID($this->beforeTransactionID); + $pager->setAfterID($this->beforeTransactionID); } - if ($this->getTransactionLimit()) { - // fetch an extra for "show older" scenarios - $query->setLimit($this->getTransactionLimit() + 1); - } - $transactions = $query->execute(); + + $transactions = id(new ConpherenceTransactionQuery()) + ->setViewer($this->getViewer()) + ->withObjectPHIDs(array_keys($conpherences)) + ->needHandles(true) + ->executeWithCursorPager($pager); + $transactions = mgroup($transactions, 'getObjectPHID'); foreach ($conpherences as $phid => $conpherence) { $current_transactions = idx($transactions, $phid, array());