Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Symfony 6.3 #14

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 1.3.1
### Added
- Support for `Symfony 6.3`

### Dropped
- Support for `Symfony 2.8`

## 1.3.0
### Added
- Support for PHP 8.
Expand Down
10 changes: 6 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@
}
},
"require": {
"php": ">=7.0|>=8.0",
"php": "^7.0|^8.0",
"doctrine/orm": "^2.0",
"psr/log": "^1.0|^2.0",
"symfony/property-access": "^2.8|^3.0|^4.0|^5.0",
"ext-json": "*"
"ext-json": "*",
"symfony/property-access": "^3.4|^4.4|^5.4|^6.3",
"doctrine/annotations": "^1.0|^2.0"
},
"require-dev": {
"phpunit/phpunit": "^6.0|^9.0"
"phpunit/phpunit": "^6.0|^9.0",
"symfony/cache": "^3.4|^4.4|^5.4|^6.3"
},
"config": {
"bin-dir": "bin"
Expand Down
37 changes: 19 additions & 18 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>

<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html -->

<phpunit
backupGlobals = "false"
backupStaticAttributes = "false"
colors = "true"
convertErrorsToExceptions = "true"
convertNoticesToExceptions = "true"
convertWarningsToExceptions = "true"
processIsolation = "false"
stopOnFailure = "false"
syntaxCheck = "false"
bootstrap = "vendor/autoload.php" >
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
backupGlobals="false"
backupStaticAttributes="false"
colors="true" convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
bootstrap="vendor/autoload.php"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">

<coverage>
<include>
<directory>./src</directory>
</include>

<testsuites>
<testsuite name="Project Test Suite">
</coverage>
<testsuites>
<testsuite name="Project Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>

<filter>
<whitelist>
<directory>./src</directory>
</whitelist>
</filter>
</phpunit>
6 changes: 6 additions & 0 deletions src/Exception/TooLargeOffsetException.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@

class TooLargeOffsetException extends PaginationException
{
/**
* @var int
*/
private $maximumOffset;
/**
* @var int
*/
private $givenOffset;

public function __construct(int $maximumOffset, int $givenOffset)
Expand Down
2 changes: 1 addition & 1 deletion src/Service/CursorBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public function invertCursorInclusion(string $cursor): string

/**
* @param mixed $item
* @param array|\Paysera\Pagination\Entity\OrderingConfiguration[] $orderingConfigurations
* @param array|OrderingConfiguration[] $orderingConfigurations
* @return string
*/
public function getCursorFromItem($item, array $orderingConfigurations): string
Expand Down
2 changes: 1 addition & 1 deletion src/Service/Doctrine/FlushingResultIterator.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public function __construct(
$this->entityManager = $entityManager;
}

protected function handleCycleEnd()
protected function handleCycleEnd(): void
{
$this->entityManager->flush();
$this->entityManager->clear();
Expand Down
24 changes: 8 additions & 16 deletions src/Service/Doctrine/QueryAnalyser.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
use Paysera\Pagination\Entity\Doctrine\AnalysedQuery;
use Paysera\Pagination\Entity\OrderingConfiguration;
use Paysera\Pagination\Entity\Doctrine\ConfiguredQuery;
use Paysera\Pagination\Entity\OrderingPair;
use Paysera\Pagination\Entity\Pager;
use InvalidArgumentException;
use Paysera\Pagination\Exception\TooLargeOffsetException;
Expand All @@ -23,7 +22,7 @@ class QueryAnalyser
* @param Pager $pager
* @return AnalysedQuery
*/
public function analyseQuery(ConfiguredQuery $configuredQuery, Pager $pager)
public function analyseQuery(ConfiguredQuery $configuredQuery, Pager $pager): AnalysedQuery
{
$analysedQuery = $this->analyseQueryWithoutPager($configuredQuery);

Expand Down Expand Up @@ -51,7 +50,7 @@ public function analyseQuery(ConfiguredQuery $configuredQuery, Pager $pager)
* @param ConfiguredQuery $configuredQuery
* @return AnalysedQuery
*/
public function analyseQueryWithoutPager(ConfiguredQuery $configuredQuery)
public function analyseQueryWithoutPager(ConfiguredQuery $configuredQuery): AnalysedQuery
{
$queryBuilder = $configuredQuery->getQueryBuilder();
$rootAlias = $this->getRootAlias($queryBuilder);
Expand All @@ -65,11 +64,7 @@ public function analyseQueryWithoutPager(ConfiguredQuery $configuredQuery)
;
}

/**
* @param QueryBuilder $queryBuilder
* @return null|string
*/
private function getRootAlias(QueryBuilder $queryBuilder)
private function getRootAlias(QueryBuilder $queryBuilder): ?string
{
$selectDqlParts = $queryBuilder->getDQLPart('select');
if (!isset($selectDqlParts[0])) {
Expand All @@ -93,14 +88,11 @@ private function getRootAlias(QueryBuilder $queryBuilder)
return $selectParts[0];
}

/**
* @param ConfiguredQuery $configuredQuery
* @param string $rootAlias
* @param array|OrderingPair[] $orderingPairs
* @return array|OrderingConfiguration[]
*/
private function mapToOrderingConfigurations(ConfiguredQuery $configuredQuery, string $rootAlias, array $orderingPairs)
{
private function mapToOrderingConfigurations(
ConfiguredQuery $configuredQuery,
string $rootAlias,
array $orderingPairs
): array {
$orderingConfigurations = [];
$idIncluded = false;
$defaultAscending = null;
Expand Down
2 changes: 1 addition & 1 deletion src/Service/Doctrine/ResultIterator.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function iterate(ConfiguredQuery $configuredQuery, Pager $startPager = nu
}
}

protected function handleCycleEnd()
protected function handleCycleEnd(): void
{
// intentionally empty – override in extended classes
}
Expand Down
89 changes: 48 additions & 41 deletions src/Service/Doctrine/ResultProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@

namespace Paysera\Pagination\Service\Doctrine;

use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\Query\Expr\Andx;
use Doctrine\ORM\Query\Expr\Orx;
use Doctrine\ORM\Query\Expr\GroupBy;
use Doctrine\ORM\Query\Expr\Comparison;
use Doctrine\ORM\QueryBuilder;
use Paysera\Pagination\Entity\Doctrine\AnalysedQuery;
use Paysera\Pagination\Entity\OrderingConfiguration;
use Paysera\Pagination\Entity\Doctrine\ConfiguredQuery;
use Paysera\Pagination\Entity\Pager;
use Paysera\Pagination\Entity\Result;
Expand All @@ -28,6 +29,13 @@ public function __construct(QueryAnalyser $queryAnalyser, CursorBuilderInterface
$this->cursorBuilder = $cursorBuilder;
}

/**
* @param ConfiguredQuery $configuredQuery
* @param Pager $pager
* @return Result
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getResultForQuery(ConfiguredQuery $configuredQuery, Pager $pager): Result
{
$analysedQuery = $this->queryAnalyser->analyseQuery($configuredQuery, $pager);
Expand All @@ -49,6 +57,12 @@ public function getResultForQuery(ConfiguredQuery $configuredQuery, Pager $pager
return $result;
}

/**
* @param ConfiguredQuery $configuredQuery
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getTotalCountForQuery(ConfiguredQuery $configuredQuery): int
{
$analysedQuery = $this->queryAnalyser->analyseQueryWithoutPager($configuredQuery);
Expand Down Expand Up @@ -89,7 +103,7 @@ private function findItems(AnalysedQuery $analysedQuery, Pager $pager)
return $items;
}

private function pageQueryBuilder(AnalysedQuery $analysedQuery, Pager $pager)
private function pageQueryBuilder(AnalysedQuery $analysedQuery, Pager $pager): QueryBuilder
{
$queryBuilder = $analysedQuery->cloneQueryBuilder();

Expand All @@ -115,11 +129,7 @@ private function pageQueryBuilder(AnalysedQuery $analysedQuery, Pager $pager)
return $queryBuilder;
}

/**
* @param QueryBuilder $queryBuilder
* @param array|OrderingConfiguration[] $orderingConfigurations
*/
private function applyOrdering(QueryBuilder $queryBuilder, array $orderingConfigurations)
private function applyOrdering(QueryBuilder $queryBuilder, array $orderingConfigurations): void
{
foreach ($orderingConfigurations as $orderingConfiguration) {
$queryBuilder->addOrderBy(
Expand All @@ -129,39 +139,27 @@ private function applyOrdering(QueryBuilder $queryBuilder, array $orderingConfig
}
}

private function applyOffset(QueryBuilder $queryBuilder, int $offset)
private function applyOffset(QueryBuilder $queryBuilder, int $offset): void
{
$queryBuilder->setFirstResult($offset);
}

/**
* @param QueryBuilder $queryBuilder
* @param string $after
* @param AnalysedQuery $analysedQuery
*/
private function applyAfter(QueryBuilder $queryBuilder, string $after, AnalysedQuery $analysedQuery)
private function applyAfter(QueryBuilder $queryBuilder, string $after, AnalysedQuery $analysedQuery): void
{
$this->applyCursor($queryBuilder, $after, $analysedQuery, false);
}

/**
* @param QueryBuilder $queryBuilder
* @param string $after
* @param AnalysedQuery $analysedQuery
*/
private function applyBefore(QueryBuilder $queryBuilder, string $after, AnalysedQuery $analysedQuery)
private function applyBefore(QueryBuilder $queryBuilder, string $after, AnalysedQuery $analysedQuery): void
{
$this->applyCursor($queryBuilder, $after, $analysedQuery, true);
}

/**
* @param QueryBuilder $queryBuilder
* @param string $cursor
* @param AnalysedQuery $analysedQuery
* @param bool $invert
*/
private function applyCursor(QueryBuilder $queryBuilder, string $cursor, AnalysedQuery $analysedQuery, bool $invert)
{
private function applyCursor(
QueryBuilder $queryBuilder,
string $cursor,
AnalysedQuery $analysedQuery,
bool $invert
): void {
$orderingConfigurations = $analysedQuery->getOrderingConfigurations();
$parsedCursor = $this->cursorBuilder->parseCursor($cursor, count($orderingConfigurations));

Expand Down Expand Up @@ -265,18 +263,18 @@ private function buildResultForTooLargeOffset(AnalysedQuery $analysedQuery): Res
return $result->setHasPrevious(false);
}

$lastItemCursor = $this->cursorBuilder->getCursorFromItem($items[0], $modifiedAnalysedQuery->getOrderingConfigurations());
$lastItemCursor = $this->cursorBuilder->getCursorFromItem(
$items[0],
$modifiedAnalysedQuery->getOrderingConfigurations()
);

return $result
->setHasPrevious(true)
->setPreviousCursor($this->cursorBuilder->buildCursorWithIncludedItem($lastItemCursor))
->setNextCursor($lastItemCursor)
;
}

/**
* @param array|OrderingConfiguration[] $orderingConfigurations
* @return array|OrderingConfiguration[]
*/
private function reverseOrderingDirection(array $orderingConfigurations): array
{
$reversedOrderingConfigurations = [];
Expand All @@ -288,7 +286,7 @@ private function reverseOrderingDirection(array $orderingConfigurations): array
return $reversedOrderingConfigurations;
}

private function existsBeforeCursor(string $previousCursor, AnalysedQuery $analysedQuery)
private function existsBeforeCursor(string $previousCursor, AnalysedQuery $analysedQuery): bool
{
$nextPager = (new Pager())
->setBefore($previousCursor)
Expand All @@ -298,7 +296,7 @@ private function existsBeforeCursor(string $previousCursor, AnalysedQuery $analy
return count($this->findItems($analysedQuery, $nextPager)) > 0;
}

private function existsAfterCursor(string $nextCursor, AnalysedQuery $analysedQuery)
private function existsAfterCursor(string $nextCursor, AnalysedQuery $analysedQuery): bool
{
$nextPager = (new Pager())
->setAfter($nextCursor)
Expand All @@ -308,7 +306,7 @@ private function existsAfterCursor(string $nextCursor, AnalysedQuery $analysedQu
return count($this->findItems($analysedQuery, $nextPager)) > 0;
}

private function calculateTotalCount(Pager $filter, int $resultCount)
private function calculateTotalCount(Pager $filter, int $resultCount): ?int
{
if (
$filter->getOffset() !== null
Expand All @@ -321,6 +319,12 @@ private function calculateTotalCount(Pager $filter, int $resultCount)
return null;
}

/**
* @param AnalysedQuery $analysedQuery
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
private function findCount(AnalysedQuery $analysedQuery): int
{
$countQueryBuilder = $analysedQuery->cloneQueryBuilder();
Expand All @@ -334,6 +338,13 @@ private function findCount(AnalysedQuery $analysedQuery): int
return (int)$countQueryBuilder->getQuery()->getSingleScalarResult();
}

/**
* @param string $groupByColumn
* @param AnalysedQuery $analysedQuery
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
private function findCountWithGroupBy(string $groupByColumn, AnalysedQuery $analysedQuery): int
{
$countQueryBuilder = $analysedQuery->cloneQueryBuilder();
Expand All @@ -355,11 +366,7 @@ private function findCountWithGroupBy(string $groupByColumn, AnalysedQuery $anal
return $nonNullCount + $nullExists;
}

/**
* @param QueryBuilder $queryBuilder
* @return string|null
*/
private function getSingleValidGroupByColumn(QueryBuilder $queryBuilder)
private function getSingleValidGroupByColumn(QueryBuilder $queryBuilder): ?string
{
/** @var GroupBy[] $groupByParts */
$groupByParts = $queryBuilder->getDQLPart('groupBy');
Expand Down
Loading