Browse Source

Paginating results for proper number of items

As suggested by @stof i moved all result limitation to use the paginator already in place in the app.
This also centralizes the access to the `number of items` configuration
Rafael Dohms 12 years ago
parent
commit
188a06b314

+ 31 - 8
src/Packagist/WebBundle/Controller/FeedController.php

@@ -13,6 +13,9 @@
 namespace Packagist\WebBundle\Controller;
 
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Doctrine\ORM\QueryBuilder;
+use Pagerfanta\Adapter\DoctrineORMAdapter;
+use Pagerfanta\Pagerfanta;
 use Zend\Feed\Writer\Entry;
 use Zend\Feed\Writer\Feed;
 use Packagist\WebBundle\Entity\Package;
@@ -40,8 +43,8 @@ class FeedController extends Controller
     {
         /** @var $repo \Packagist\WebBundle\Entity\VersionRepository */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
-        $packages = $repo->getLatestVersionWithPackage(
-            $this->container->getParameter('packagist_web.rss_max_items')
+        $packages = $this->getLimitedResults(
+            $repo->getQueryBuilderForLatestVersionWithPackage()
         );
 
         $feed = $this->buildFeed(
@@ -65,8 +68,8 @@ class FeedController extends Controller
     {
         /** @var $repo \Packagist\WebBundle\Entity\PackageRepository */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
-        $packages = $repo->getNewestPackages(
-            $this->container->getParameter('packagist_web.rss_max_items')
+        $packages = $this->getLimitedResults(
+            $repo->getQueryBuilderForNewestPackages()
         );
 
         $feed = $this->buildFeed(
@@ -90,9 +93,8 @@ class FeedController extends Controller
     {
         /** @var $repo \Packagist\WebBundle\Entity\PackageRepository */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
-        $packages = $repo->getLatestPackagesByVendor(
-            $filter,
-            $this->container->getParameter('packagist_web.rss_max_items')
+        $packages = $this->getLimitedResults(
+            $repo->getQueryBuilderForLatestPackagesByVendor($filter)
         );
 
         $feed = $this->buildFeed(
@@ -104,6 +106,24 @@ class FeedController extends Controller
         return $this->buildResponse($feed);
     }
 
+    /**
+     * Limits a query to the desired number of results
+     *
+     * @param \Doctrine\ORM\QueryBuilder $queryBuilder
+     *
+     * @return array|\Traversable
+     */
+    protected function getLimitedResults(QueryBuilder $queryBuilder)
+    {
+        $paginator = new Pagerfanta(new DoctrineORMAdapter($queryBuilder));
+        $paginator->setMaxPerPage(
+            $this->container->getParameter('packagist_web.rss_max_items')
+        );
+        $paginator->setCurrentPage(1);
+
+        return $paginator->getCurrentPageResults();
+    }
+
     /**
      * Builds the desired feed
      *
@@ -128,7 +148,10 @@ class FeedController extends Controller
         }
 
         if ($this->getRequest()->getRequestFormat() == 'atom') {
-            $feed->setFeedLink($this->getRequest()->getUri(), $this->getRequest()->getRequestFormat());
+            $feed->setFeedLink(
+                $this->getRequest()->getUri(),
+                $this->getRequest()->getRequestFormat()
+            );
         }
 
         return $feed;

+ 6 - 17
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -218,33 +218,26 @@ class PackageRepository extends EntityRepository
     /**
      * Gets the most recent packages created
      *
-     * @param int|null $max
-     *
-     * @return array
+     * @return QueryBuilder
      */
-    public function getNewestPackages($max = null)
+    public function getQueryBuilderForNewestPackages()
     {
         $qb = $this->getBaseQueryBuilder();
 
         $qb->orderBy('p.createdAt', 'DESC');
         $qb->addOrderBy('v.releasedAt', 'DESC');
 
-        if (null !== $max) {
-            $qb->setMaxResults($max);
-        }
-
-        return $qb->getQuery()->getResult();
+        return $qb;
     }
 
     /**
      * Gets the latest packages/versions released by a selected vendor
      *
      * @param string $vendor
-     * @param int|null $max
      *
-     * @return array
+     * @return QueryBuilder
      */
-    public function getLatestPackagesByVendor($vendor, $max = null)
+    public function getQueryBuilderForLatestPackagesByVendor($vendor)
     {
         $qb = $this->getBaseQueryBuilder();
 
@@ -253,10 +246,6 @@ class PackageRepository extends EntityRepository
         $qb->where('p.name LIKE ?0');
         $qb->setParameter(0, $vendor.'/%');
 
-        if (null !== $max) {
-            $qb->setMaxResults($max);
-        }
-
-        return $qb->getQuery()->getResult();
+        return $qb;
     }
 }

+ 3 - 9
src/Packagist/WebBundle/Entity/VersionRepository.php

@@ -71,11 +71,9 @@ class VersionRepository extends EntityRepository
     /**
      * Returns the latest versions released
      *
-     * @param int|null $max
-     *
-     * @return array
+     * @return \Doctrine\ORM\QueryBuilder
      */
-    public function getLatestVersionWithPackage($max = null)
+    public function getQueryBuilderForLatestVersionWithPackage()
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb->select('v', 't', 'a', 'p')
@@ -85,10 +83,6 @@ class VersionRepository extends EntityRepository
             ->leftJoin('v.package', 'p')
             ->orderBy('v.releasedAt', 'DESC');
 
-        if (null !== $max) {
-            $qb->setMaxResults($max);
-        }
-
-        return $qb->getQuery()->getResult();
+        return $qb;
     }
 }