/** * {@inheritdoc} * @throws \Elodex\Exceptions\InvalidArgumentException */ public function scroll(Search $search, callable $callback) { $duration = $search->getScroll(); if (is_null($duration)) { throw new InvalidArgumentException('Scroll duration missing on search query.'); } // Get the first result for the scrolling request. $result = $this->search($search); $scrollId = $result->getScrollId(); try { // Callback for the first set of results. call_user_func($callback, $result); // Check if we do have more documents than we got from the first call. if (count($result) < $result->totalHits()) { // Scroll through the results until we don't get any more hits. while (true) { $result = $this->scrollRequest($scrollId, $duration); $scrollId = $result->getScrollId(); // Check if we didn't get any more results. if (count($result) === 0) { break; } call_user_func($callback, $result); } } } finally { $this->clearScroll($scrollId); } }
/** * Create a new index search query. * * @return \Elodex\Search */ public function newIndexSearch() { $search = new Search(); $search->setModel($this); return $search; }