Sfoglia il codice sorgente

Improve performance of package page query

Jordi Boggiano 7 anni fa
parent
commit
cf600d69ff

+ 3 - 0
src/Packagist/WebBundle/Controller/PackageController.php

@@ -363,6 +363,7 @@ class PackageController extends Controller
         if (count($versions)) {
             /** @var VersionRepository $versionRepo */
             $versionRepo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
+            $this->getDoctrine()->getManager()->refresh(reset($versions));
             $version = $versionRepo->getFullVersion(reset($versions)->getId());
 
             $expandedVersion = reset($versions);
@@ -372,6 +373,8 @@ class PackageController extends Controller
                     break;
                 }
             }
+
+            $this->getDoctrine()->getManager()->refresh($expandedVersion);
             $expandedVersion = $versionRepo->getFullVersion($expandedVersion->getId());
         }
 

+ 5 - 2
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -159,12 +159,15 @@ class PackageRepository extends EntityRepository
     {
         // first fetch a partial package including joined versions/maintainers, that way
         // the join is cheap and heavy data (description, readme) is not duplicated for each joined row
+        //
+        // fetching everything partial here to avoid fetching tons of data,
+        // this helps for packages like https://packagist.org/packages/ccxt/ccxt
+        // with huge amounts of versions
         $qb = $this->getEntityManager()->createQueryBuilder();
-        $qb->select('partial p.{id}', 'v', 't', 'm')
+        $qb->select('partial p.{id}', 'partial v.{id, version, normalizedVersion, development, releasedAt}', 'partial m.{id, username, email}')
             ->from('Packagist\WebBundle\Entity\Package', 'p')
             ->leftJoin('p.versions', 'v')
             ->leftJoin('p.maintainers', 'm')
-            ->leftJoin('v.tags', 't')
             ->orderBy('v.development', 'DESC')
             ->addOrderBy('v.releasedAt', 'DESC')
             ->where('p.name = ?0')