getType(); if (QueryBuilder::SELECT !== $queryBuilder->getType()) { // @codeCoverageIgnoreStart throw new InvalidArgumentException('Only SELECT queries can be paginated.'); // @codeCoverageIgnoreEnd } $this->queryBuilder = clone $queryBuilder; $this->countQueryBuilderModifier = $countQueryBuilderModifier; } public function getNbResults(): int { $qb = $this->prepareCountQueryBuilder(); $result = $qb->execute()->fetch(); $values = array_values($result); return (int) $values[0]; } /** * @psalm-suppress MixedReturnStatement * * @return array */ public function getSlice(int $offset, int $length): iterable { $qb = clone $this->queryBuilder; return $qb->setMaxResults($length) ->setFirstResult($offset) ->execute() ->fetchAll(); } /** * @psalm-suppress MixedReturnStatement */ private function prepareCountQueryBuilder(): IQueryBuilder { $qb = clone $this->queryBuilder; $callable = $this->countQueryBuilderModifier; $callable($qb); return $qb; } }