Browse Source

Performance improvements

Jordi Boggiano 13 years ago
parent
commit
bf8d3f12e6

+ 14 - 4
src/Packagist/WebBundle/Controller/ApiController.php

@@ -33,17 +33,27 @@ class ApiController extends Controller
      */
      */
     public function packagesAction()
     public function packagesAction()
     {
     {
-        $packages = $this->get('doctrine')
-            ->getRepository('Packagist\WebBundle\Entity\Package')
+        $em = $this->get('doctrine')->getEntityManager();
+
+        gc_enable();
+
+        $packages = $em->getRepository('Packagist\WebBundle\Entity\Package')
             ->getFullPackages();
             ->getFullPackages();
 
 
         $data = array();
         $data = array();
         foreach ($packages as $package) {
         foreach ($packages as $package) {
-            $data[$package->getName()] = $package->toArray();
+            $versions = array();
+            foreach ($package->getVersions() as $version) {
+                $versions[$version->getVersion()] = $version->toArray();
+                $em->detach($version);
+            }
+            $data[$package->getName()] = array('versions' => $versions);
+            $em->detach($package);
         }
         }
+        unset($versions, $package, $packages);
 
 
         $response = new Response(json_encode($data), 200);
         $response = new Response(json_encode($data), 200);
-        $response->setSharedMaxAge(60);
+        $response->setSharedMaxAge(120);
         return $response;
         return $response;
     }
     }
 
 

+ 16 - 4
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -82,10 +82,17 @@ class PackageRepository extends EntityRepository
     public function getStalePackagesForIndexing()
     public function getStalePackagesForIndexing()
     {
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb = $this->getEntityManager()->createQueryBuilder();
-        $qb->select('p, v, t')
+        $qb->select('p, v, t, a, req, rec, sug, rep, con, pro')
             ->from('Packagist\WebBundle\Entity\Package', 'p')
             ->from('Packagist\WebBundle\Entity\Package', 'p')
             ->leftJoin('p.versions', 'v')
             ->leftJoin('p.versions', 'v')
             ->leftJoin('v.tags', 't')
             ->leftJoin('v.tags', 't')
+            ->leftJoin('v.authors', 'a')
+            ->leftJoin('v.require', 'req')
+            ->leftJoin('v.recommend', 'rec')
+            ->leftJoin('v.suggest', 'sug')
+            ->leftJoin('v.replace', 'rep')
+            ->leftJoin('v.conflict', 'con')
+            ->leftJoin('v.provide', 'pro')
             ->where('p.indexedAt IS NULL OR p.indexedAt < p.crawledAt');
             ->where('p.indexedAt IS NULL OR p.indexedAt < p.crawledAt');
 
 
         return $qb->getQuery()->getResult();
         return $qb->getQuery()->getResult();
@@ -117,15 +124,20 @@ class PackageRepository extends EntityRepository
 
 
     public function getFullPackages()
     public function getFullPackages()
     {
     {
-        $qb = $this->getBaseQueryBuilder()
-            ->addSelect('a', 'req', 'rec', 'sug', 'rep', 'con', 'pro')
+        $qb = $this->getEntityManager()->createQueryBuilder();
+        $qb->select('p, v, t, a, req, rec, sug, rep, con, pro')
+            ->from('Packagist\WebBundle\Entity\Package', 'p')
+            ->join('p.versions', 'v')
+            ->leftJoin('v.tags', 't')
             ->leftJoin('v.authors', 'a')
             ->leftJoin('v.authors', 'a')
             ->leftJoin('v.require', 'req')
             ->leftJoin('v.require', 'req')
             ->leftJoin('v.recommend', 'rec')
             ->leftJoin('v.recommend', 'rec')
             ->leftJoin('v.suggest', 'sug')
             ->leftJoin('v.suggest', 'sug')
             ->leftJoin('v.replace', 'rep')
             ->leftJoin('v.replace', 'rep')
             ->leftJoin('v.conflict', 'con')
             ->leftJoin('v.conflict', 'con')
-            ->leftJoin('v.provide', 'pro');
+            ->leftJoin('v.provide', 'pro')
+            ->orderBy('v.development', 'DESC')
+            ->addOrderBy('v.releasedAt', 'DESC');
 
 
         return $qb->getQuery()->getResult();
         return $qb->getQuery()->getResult();
     }
     }

+ 5 - 1
src/Packagist/WebBundle/Entity/Version.php

@@ -20,7 +20,11 @@ use Symfony\Component\Validator\Constraints as Assert;
  * @ORM\Entity(repositoryClass="Packagist\WebBundle\Entity\VersionRepository")
  * @ORM\Entity(repositoryClass="Packagist\WebBundle\Entity\VersionRepository")
  * @ORM\Table(
  * @ORM\Table(
  *     name="package_version",
  *     name="package_version",
- *     uniqueConstraints={@ORM\UniqueConstraint(name="pkg_ver_idx",columns={"package_id","normalizedVersion"})}
+ *     uniqueConstraints={@ORM\UniqueConstraint(name="pkg_ver_idx",columns={"package_id","normalizedVersion"})},
+ *     indexes={
+ *         @ORM\Index(name="release_idx",columns={"releasedAt"}),
+ *         @ORM\Index(name="is_devel_idx",columns={"development"})
+ *     }
  * )
  * )
  * @author Jordi Boggiano <j.boggiano@seld.be>
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
  */