From 634719088638902adf0710faf46ce3c33cf020b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20ALFAIATE?= Date: Thu, 10 Oct 2019 17:45:26 +0700 Subject: [PATCH] Skip limit subquery if not required --- .../ORM/Tools/Pagination/Paginator.php | 2 +- .../ORM/Functional/Ticket/DDC1685Test.php | 1 + .../ORM/Functional/Ticket/GH7829Test.php | 63 +++++++++++++++++++ .../ORM/Tools/Pagination/PaginatorTest.php | 2 + 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/GH7829Test.php diff --git a/lib/Doctrine/ORM/Tools/Pagination/Paginator.php b/lib/Doctrine/ORM/Tools/Pagination/Paginator.php index 08c924bc598..64cd9e243fa 100644 --- a/lib/Doctrine/ORM/Tools/Pagination/Paginator.php +++ b/lib/Doctrine/ORM/Tools/Pagination/Paginator.php @@ -139,7 +139,7 @@ public function getIterator() $offset = $this->query->getFirstResult(); $length = $this->query->getMaxResults(); - if ($this->fetchJoinCollection) { + if ($this->fetchJoinCollection && $length !== null) { $subQuery = $this->cloneQuery($this->query); if ($this->useOutputWalker($subQuery)) { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1685Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1685Test.php index 576b4e28628..b2cbf513abb 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1685Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1685Test.php @@ -29,6 +29,7 @@ protected function setUp() $dql = "SELECT ad FROM Doctrine\Tests\Models\DDC117\DDC117ArticleDetails ad"; $query = $this->_em->createQuery($dql); + $query->setMaxResults(1); $this->paginator = new Paginator($query); } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7829Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7829Test.php new file mode 100644 index 00000000000..08f91d2a8ea --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH7829Test.php @@ -0,0 +1,63 @@ +useModelSet('cms'); + parent::setUp(); + + $article = new CmsArticle(); + + $article->topic = 'Skip Limit Subquery'; + $article->text = 'Skip Limit Subquery if not required.'; + + $this->_em->persist($article); + $this->_em->flush(); + $this->_em->clear(); + + $this->_em->getConnection()->getConfiguration()->setSQLLogger($this->logger = new DebugStack()); + } + + public function testPaginatorWithLimitSubquery() : void + { + $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsArticle a'); + $query->setMaxResults(1); + + $paginator = new Paginator($query, true); + $paginator->setUseOutputWalkers(false); + + $paginator->count(); + $paginator->getIterator(); + + $this->assertCount(3, $this->logger->queries); + } + + public function testPaginatorWithLimitSubquerySkipped() : void + { + $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsArticle a'); + + $paginator = new Paginator($query, true); + $paginator->setUseOutputWalkers(false); + + $paginator->count(); + $paginator->getIterator(); + + $this->assertCount(2, $this->logger->queries); + } +} diff --git a/tests/Doctrine/Tests/ORM/Tools/Pagination/PaginatorTest.php b/tests/Doctrine/Tests/ORM/Tools/Pagination/PaginatorTest.php index 4b4fc5202bd..20b2abdda17 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Pagination/PaginatorTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/Pagination/PaginatorTest.php @@ -61,6 +61,7 @@ public function testExtraParametersAreStrippedWhenWalkerRemovingOriginalSelectEl WHERE u.id = :paramInWhere' ); $query->setParameters(['paramInWhere' => $paramInWhere, 'paramInSubSelect' => $paramInSubSelect]); + $query->setMaxResults(1); $paginator = (new Paginator($query, true))->setUseOutputWalkers(false); $this->connection->expects($this->exactly(3))->method('executeQuery'); @@ -113,6 +114,7 @@ private function createPaginatorWithExtraParametersWithoutOutputWalkers(array $w $query = new Query($this->em); $query->setDQL('SELECT u FROM Doctrine\\Tests\\Models\\CMS\\CmsUser u'); $query->setParameters(['paramInWhere' => 1]); + $query->setMaxResults(1); return (new Paginator($query, true))->setUseOutputWalkers(false); }