Handler.php
1 month ago
ListingDateRangeFilterTrait.php
1 month ago
ListingDefinition.php
1 year ago
ListingRepository.php
1 month ago
PageLimit.php
2 years ago
index.php
3 years ago
ListingRepository.php
118 lines
| 1 | <?php declare(strict_types = 1); |
| 2 | |
| 3 | namespace MailPoet\Listing; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Util\Helpers; |
| 9 | use MailPoetVendor\Doctrine\ORM\EntityManager; |
| 10 | use MailPoetVendor\Doctrine\ORM\QueryBuilder; |
| 11 | |
| 12 | abstract class ListingRepository { |
| 13 | /** @var QueryBuilder */ |
| 14 | protected $queryBuilder; |
| 15 | |
| 16 | public function __construct( |
| 17 | EntityManager $entityManager |
| 18 | ) { |
| 19 | $this->queryBuilder = $entityManager->createQueryBuilder(); |
| 20 | } |
| 21 | |
| 22 | public function getData(ListingDefinition $definition): array { |
| 23 | $queryBuilder = clone $this->queryBuilder; |
| 24 | $sortBy = Helpers::underscoreToCamelCase($definition->getSortBy()); |
| 25 | $sortOrder = $this->normalizeSortOrder($definition->getSortOrder()); |
| 26 | $this->applySelectClause($queryBuilder); |
| 27 | $this->applyFromClause($queryBuilder); |
| 28 | $this->applyConstraints($queryBuilder, $definition); |
| 29 | $this->applySorting($queryBuilder, $sortBy, $sortOrder); |
| 30 | $this->applyPaging($queryBuilder, $definition->getOffset(), $definition->getLimit()); |
| 31 | return $queryBuilder->getQuery()->getResult(); |
| 32 | } |
| 33 | |
| 34 | public function getCount(ListingDefinition $definition): int { |
| 35 | $queryBuilder = clone $this->queryBuilder; |
| 36 | $this->applyFromClause($queryBuilder); |
| 37 | $this->applyConstraints($queryBuilder, $definition); |
| 38 | $alias = $queryBuilder->getRootAliases()[0]; |
| 39 | $queryBuilder->select("COUNT(DISTINCT $alias)"); |
| 40 | return (int)$queryBuilder->getQuery()->getSingleScalarResult(); |
| 41 | } |
| 42 | |
| 43 | public function getActionableIds(ListingDefinition $definition): array { |
| 44 | $ids = $definition->getSelection(); |
| 45 | if (!empty($ids)) { |
| 46 | return $ids; |
| 47 | } |
| 48 | $queryBuilder = clone $this->queryBuilder; |
| 49 | $this->applyFromClause($queryBuilder); |
| 50 | $this->applyConstraints($queryBuilder, $definition); |
| 51 | $alias = $queryBuilder->getRootAliases()[0]; |
| 52 | $queryBuilder->select("$alias.id"); |
| 53 | $ids = $queryBuilder->getQuery()->getScalarResult(); |
| 54 | return array_column($ids, 'id'); |
| 55 | } |
| 56 | |
| 57 | public function getGroups(ListingDefinition $definition): array { |
| 58 | return []; |
| 59 | } |
| 60 | |
| 61 | public function getFilters(ListingDefinition $definition): array { |
| 62 | return []; |
| 63 | } |
| 64 | |
| 65 | abstract protected function applySelectClause(QueryBuilder $queryBuilder); |
| 66 | |
| 67 | abstract protected function applyFromClause(QueryBuilder $queryBuilder); |
| 68 | |
| 69 | protected function applyConstraints(QueryBuilder $queryBuilder, ListingDefinition $definition) { |
| 70 | $group = $definition->getGroup(); |
| 71 | if ($group) { |
| 72 | $this->applyGroup($queryBuilder, $group); |
| 73 | } |
| 74 | |
| 75 | $search = $definition->getSearch(); |
| 76 | $parameters = $definition->getParameters(); |
| 77 | |
| 78 | if ($search !== null && strlen(trim($search)) > 0) { |
| 79 | $this->applySearch($queryBuilder, $search, $parameters ?: []); |
| 80 | } |
| 81 | |
| 82 | $filters = $definition->getFilters(); |
| 83 | if ($filters) { |
| 84 | $this->applyFilters($queryBuilder, $filters); |
| 85 | } |
| 86 | |
| 87 | if ($parameters) { |
| 88 | $this->applyParameters($queryBuilder, $parameters); |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | abstract protected function applyGroup(QueryBuilder $queryBuilder, string $group); |
| 93 | |
| 94 | abstract protected function applySearch(QueryBuilder $queryBuilder, string $search, array $parameters); |
| 95 | |
| 96 | abstract protected function applyFilters(QueryBuilder $queryBuilder, array $filters); |
| 97 | |
| 98 | abstract protected function applyParameters(QueryBuilder $queryBuilder, array $parameters); |
| 99 | |
| 100 | protected function applySorting(QueryBuilder $queryBuilder, string $sortBy, string $sortOrder) { |
| 101 | $alias = $this->queryBuilder->getRootAliases()[0]; |
| 102 | $queryBuilder->addOrderBy("$alias.$sortBy", $sortOrder); |
| 103 | } |
| 104 | |
| 105 | protected function normalizeSortOrder(string $sortOrder): string { |
| 106 | $sortOrder = strtolower(trim($sortOrder)); |
| 107 | if ($sortOrder === '') { |
| 108 | return 'asc'; |
| 109 | } |
| 110 | return in_array($sortOrder, ['asc', 'desc'], true) ? $sortOrder : 'desc'; |
| 111 | } |
| 112 | |
| 113 | protected function applyPaging(QueryBuilder $queryBuilder, int $offset, int $limit) { |
| 114 | $queryBuilder->setFirstResult($offset); |
| 115 | $queryBuilder->setMaxResults($limit); |
| 116 | } |
| 117 | } |
| 118 |