From f1e044aa280b6577a65381c5a22e6543cc19a378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jakes=CC=8C?= Date: Thu, 27 Feb 2020 14:45:06 +0100 Subject: [PATCH] Add abstract ListingRepository as a base class for all listing repos [MAILPOET-2645] --- lib/Listing/ListingRepository.php | 88 +++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/Listing/ListingRepository.php diff --git a/lib/Listing/ListingRepository.php b/lib/Listing/ListingRepository.php new file mode 100644 index 0000000000..d0a60b2e48 --- /dev/null +++ b/lib/Listing/ListingRepository.php @@ -0,0 +1,88 @@ +queryBuilder = $entityManager->createQueryBuilder(); + } + + public function getData(ListingDefinition $definition): array { + $queryBuilder = clone $this->queryBuilder; + $sortBy = Helpers::underscoreToCamelCase($definition->getSortBy()); + $this->applySelectClause($queryBuilder); + $this->applyFromClause($queryBuilder); + $this->applyConstraints($queryBuilder, $definition); + $this->applySorting($queryBuilder, $sortBy, $definition->getSortOrder()); + $this->applyPaging($queryBuilder, $definition->getOffset(), $definition->getLimit()); + return $queryBuilder->getQuery()->getResult(); + } + + public function getCount(ListingDefinition $definition): int { + $queryBuilder = clone $this->queryBuilder; + $this->applyFromClause($queryBuilder); + $this->applyConstraints($queryBuilder, $definition); + $alias = $queryBuilder->getRootAliases()[0]; + $queryBuilder->select("COUNT($alias)"); + return (int)$queryBuilder->getQuery()->getSingleScalarResult(); + } + + public function getGroups(ListingDefinition $definition): array { + return []; + } + + public function getFilters(ListingDefinition $definition): array { + return []; + } + + abstract protected function applySelectClause(QueryBuilder $queryBuilder); + + abstract protected function applyFromClause(QueryBuilder $queryBuilder); + + protected function applyConstraints(QueryBuilder $queryBuilder, ListingDefinition $definition) { + $group = $definition->getGroup(); + if ($group) { + $this->applyGroup($queryBuilder, $group); + } + + $search = $definition->getSearch(); + if ($search && strlen(trim($search)) > 0) { + $this->applySearch($queryBuilder, $search); + } + + $filters = $definition->getFilters(); + if ($filters) { + $this->applyFilters($queryBuilder, $filters); + } + + $parameters = $definition->getParameters(); + if ($parameters) { + $this->applyParameters($queryBuilder, $parameters); + } + } + + abstract protected function applyGroup(QueryBuilder $queryBuilder, string $group); + + abstract protected function applySearch(QueryBuilder $queryBuilder, string $search); + + abstract protected function applyFilters(QueryBuilder $queryBuilder, array $filters); + + abstract protected function applyParameters(QueryBuilder $queryBuilder, array $parameters); + + protected function applySorting(QueryBuilder $queryBuilder, string $sortBy, string $sortOrder) { + $alias = $this->queryBuilder->getRootAliases()[0]; + $queryBuilder->addOrderBy("$alias.$sortBy", $sortOrder); + } + + protected function applyPaging(QueryBuilder $queryBuilder, int $offset, int $limit) { + $queryBuilder->setFirstResult($offset); + $queryBuilder->setMaxResults($limit); + } +}