public function makePagination(QueryBuilder $query = null)
{
if (is_null($this->_position)) {
throw new Exception('To use Paginationable trait you must fill _position property in your model');
}
/** @var ElasticsearchModel $model */
$model = static::createInstance();
$query = $query ?: new QueryBuilder();
$prevDoc = null;
$nextDoc = null;
$query->fields();
$prevPos = $this->_position - 1;
if ($prevPos >= 0) {
$items = $model->search($query->from($prevPos)->size(3));
$prevDoc = $items->first();
$items = array_values($items->toArray());
if (array_key_exists(2, $items)) {
$nextDoc = $items[2];
}
} else {
$items = $model->search($query->from($this->_position)->size(2));
$total = $items->getTotal();
$nextDoc = $items->last();
$last = $total - 1;
$items = $model->search($query->from($last)->size(1));
$prevDoc = $items->first();
}
if (!$nextDoc) {
$items = $model->search($query->from(0)->size(1));
$nextDoc = $items->first();
}
$this->_previous = $prevDoc;
$this->_next = $nextDoc;
}