|
3 | 3 | namespace MalteHuebner\DataQueryBundle\Finder; |
4 | 4 |
|
5 | 5 | use Doctrine\ORM\EntityManagerInterface; |
| 6 | +use Doctrine\ORM\Tools\Pagination\Paginator; |
6 | 7 | use FOS\ElasticaBundle\Repository; |
| 8 | +use MalteHuebner\DataQueryBundle\PaginatedResult\PaginatedResult; |
| 9 | +use MalteHuebner\DataQueryBundle\Parameter\FromParameter; |
| 10 | +use MalteHuebner\DataQueryBundle\Parameter\PageParameter; |
7 | 11 | use MalteHuebner\DataQueryBundle\Parameter\ParameterInterface; |
8 | 12 | use MalteHuebner\DataQueryBundle\Parameter\SizeParameter; |
9 | 13 | use MalteHuebner\DataQueryBundle\Query\ElasticQueryInterface; |
@@ -96,4 +100,82 @@ protected function executeOrmQuery(array $queryList, array $parameterList): arra |
96 | 100 |
|
97 | 101 | return $qb->getQuery()->getResult(); |
98 | 102 | } |
| 103 | + |
| 104 | + #[\Override] |
| 105 | + public function executePaginatedQuery(array $queryList, array $parameterList, int $page, int $size): PaginatedResult |
| 106 | + { |
| 107 | + if ($this->entityManager) { |
| 108 | + return $this->executePaginatedOrmQuery($queryList, $parameterList, $page, $size); |
| 109 | + } |
| 110 | + |
| 111 | + if ($this->repository) { |
| 112 | + return $this->executePaginatedElasticQuery($queryList, $parameterList, $page, $size); |
| 113 | + } |
| 114 | + |
| 115 | + return new PaginatedResult([], $page, $size, 0); |
| 116 | + } |
| 117 | + |
| 118 | + protected function executePaginatedElasticQuery(array $queryList, array $parameterList, int $page, int $size): PaginatedResult |
| 119 | + { |
| 120 | + $boolQuery = new \Elastica\Query\BoolQuery(); |
| 121 | + |
| 122 | + /** @var ElasticQueryInterface $query */ |
| 123 | + foreach ($queryList as $query) { |
| 124 | + if ($query instanceof QueryInterface) { |
| 125 | + $boolQuery->addMust($query->createElasticQuery()); |
| 126 | + } |
| 127 | + } |
| 128 | + |
| 129 | + $query = new \Elastica\Query($boolQuery); |
| 130 | + $query->setFrom($page * $size); |
| 131 | + $query->setSize($size); |
| 132 | + |
| 133 | + /** @var ParameterInterface $parameter */ |
| 134 | + foreach ($parameterList as $parameter) { |
| 135 | + if ($parameter instanceof ParameterInterface) { |
| 136 | + $query = $parameter->addToElasticQuery($query); |
| 137 | + } |
| 138 | + } |
| 139 | + |
| 140 | + $paginatorAdapter = $this->repository->createPaginatorAdapter($query); |
| 141 | + $totalItems = $paginatorAdapter->getNbResults(); |
| 142 | + $results = $paginatorAdapter->getSlice(0, $size)->toArray(); |
| 143 | + |
| 144 | + return new PaginatedResult($results, $page, $size, $totalItems); |
| 145 | + } |
| 146 | + |
| 147 | + protected function executePaginatedOrmQuery(array $queryList, array $parameterList, int $page, int $size): PaginatedResult |
| 148 | + { |
| 149 | + $qb = $this->entityManager->createQueryBuilder() |
| 150 | + ->select('e') |
| 151 | + ->from($this->fqcn, 'e') |
| 152 | + ; |
| 153 | + |
| 154 | + /** @var OrmQueryInterface $query */ |
| 155 | + foreach ($queryList as $query) { |
| 156 | + if ($query instanceof OrmQueryInterface) { |
| 157 | + $qb = $query->createOrmQuery($qb); |
| 158 | + } |
| 159 | + } |
| 160 | + |
| 161 | + /** @var ParameterInterface $parameter */ |
| 162 | + foreach ($parameterList as $parameter) { |
| 163 | + if ($parameter instanceof SizeParameter || $parameter instanceof FromParameter || $parameter instanceof PageParameter) { |
| 164 | + continue; |
| 165 | + } |
| 166 | + |
| 167 | + if ($parameter instanceof ParameterInterface && method_exists($parameter, 'addToOrmQuery')) { |
| 168 | + $parameter->addToOrmQuery($qb); |
| 169 | + } |
| 170 | + } |
| 171 | + |
| 172 | + $qb->setFirstResult($page * $size); |
| 173 | + $qb->setMaxResults($size); |
| 174 | + |
| 175 | + $paginator = new Paginator($qb->getQuery()); |
| 176 | + $totalItems = count($paginator); |
| 177 | + $data = iterator_to_array($paginator); |
| 178 | + |
| 179 | + return new PaginatedResult($data, $page, $size, $totalItems); |
| 180 | + } |
99 | 181 | } |
0 commit comments