diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -4032,6 +4032,7 @@ 'PhabricatorPygmentSetupCheck' => 'applications/config/check/PhabricatorPygmentSetupCheck.php', 'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php', 'PhabricatorQueryConstraint' => 'infrastructure/query/constraint/PhabricatorQueryConstraint.php', + 'PhabricatorQueryIterator' => 'infrastructure/storage/lisk/PhabricatorQueryIterator.php', 'PhabricatorQueryOrderItem' => 'infrastructure/query/order/PhabricatorQueryOrderItem.php', 'PhabricatorQueryOrderTestCase' => 'infrastructure/query/order/__tests__/PhabricatorQueryOrderTestCase.php', 'PhabricatorQueryOrderVector' => 'infrastructure/query/order/PhabricatorQueryOrderVector.php', @@ -9876,6 +9877,7 @@ 'PhabricatorPygmentSetupCheck' => 'PhabricatorSetupCheck', 'PhabricatorQuery' => 'Phobject', 'PhabricatorQueryConstraint' => 'Phobject', + 'PhabricatorQueryIterator' => 'PhutilBufferedIterator', 'PhabricatorQueryOrderItem' => 'Phobject', 'PhabricatorQueryOrderTestCase' => 'PhabricatorTestCase', 'PhabricatorQueryOrderVector' => array( diff --git a/src/infrastructure/storage/lisk/PhabricatorQueryIterator.php b/src/infrastructure/storage/lisk/PhabricatorQueryIterator.php new file mode 100644 --- /dev/null +++ b/src/infrastructure/storage/lisk/PhabricatorQueryIterator.php @@ -0,0 +1,41 @@ +query = $query; + } + + protected function didRewind() { + $this->pager = new AphrontCursorPagerView(); + } + + public function key() { + return $this->current()->getID(); + } + + protected function loadPage() { + if (!$this->pager) { + return array(); + } + + $pager = clone $this->pager; + $query = clone $this->query; + + $results = $query->executeWithCursorPager($pager); + + // If we got less than a full page of results, this was the last set of + // results. Throw away the pager so we end iteration. + if (count($results) < $pager->getPageSize()) { + $this->pager = null; + } else { + $this->pager->setAfterID($pager->getNextPageID()); + } + + return $results; + } + +}