Browse Source

Serialize versions in batches of 100 instead of doing it all at once

Jordi Boggiano 6 years ago
parent
commit
43728ee096

+ 8 - 9
src/Packagist/WebBundle/Entity/Package.php

@@ -191,16 +191,15 @@ class Package
     public function toArray(VersionRepository $versionRepo)
     {
         $versions = array();
-        $versionIds = [];
-        $this->versions = $versionRepo->refreshVersions($this->getVersions());
-        foreach ($this->getVersions() as $version) {
-            $versionIds[] = $version->getId();
-        }
-        $versionData = $versionRepo->getVersionData($versionIds);
-        foreach ($this->getVersions() as $version) {
-            /** @var $version Version */
-            $versions[$version->getVersion()] = $version->toArray($versionData);
+        $partialVersions = $this->getVersions()->toArray();
+
+        while ($partialVersions) {
+            $slice = array_splice($partialVersions, 0, 100);
+            $fullVersions = $versionRepo->refreshVersions($slice);
+            $versionData = $versionRepo->getVersionData(array_map(function ($v) { return $v->getId(); }, $fullVersions));
+            $versions = array_merge($versions, $versionRepo->detachToArray($fullVersions, $versionData));
         }
+
         $maintainers = array();
         foreach ($this->getMaintainers() as $maintainer) {
             /** @var $maintainer User */

+ 15 - 0
src/Packagist/WebBundle/Entity/VersionRepository.php

@@ -79,6 +79,21 @@ class VersionRepository extends EntityRepository
         return $refreshedVersions;
     }
 
+    /**
+     * @param Version[] $versions
+     */
+    public function detachToArray(array $versions, array $versionData): array
+    {
+        $res = [];
+        $em = $this->getEntityManager();
+        foreach ($versions as $version) {
+            $res[$version->getVersion()] = $version->toArray($versionData);
+            $em->detach($version);
+        }
+
+        return $res;
+    }
+
     public function getVersionData(array $versionIds)
     {
         $links = [