DownloadRepository.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php declare(strict_types=1);
  2. namespace Packagist\WebBundle\Entity;
  3. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  4. use Symfony\Bridge\Doctrine\RegistryInterface;
  5. class DownloadRepository extends ServiceEntityRepository
  6. {
  7. public function __construct(RegistryInterface $registry)
  8. {
  9. parent::__construct($registry, Download::class);
  10. }
  11. public function deletePackageDownloads(Package $package)
  12. {
  13. $conn = $this->getEntityManager()->getConnection();
  14. $conn->executeUpdate('DELETE FROM download WHERE package_id = :id', ['id' => $package->getId()]);
  15. }
  16. public function findDataByMajorVersion(Package $package, int $majorVersion)
  17. {
  18. $sql = '
  19. SELECT d.data
  20. FROM package_version v
  21. INNER JOIN download d ON d.id=v.id AND d.type = :versionType
  22. WHERE v.package_id = :package AND v.normalizedVersion LIKE :majorVersion
  23. ';
  24. $stmt = $this->getEntityManager()->getConnection()
  25. ->executeQuery(
  26. $sql,
  27. ['package' => $package->getId(), 'versionType' => Download::TYPE_VERSION, 'majorVersion' => $majorVersion . '.%']
  28. );
  29. $result = $stmt->fetchAll();
  30. $stmt->closeCursor();
  31. return array_map(function (array $row) {
  32. return $row['data'] ? json_decode($row['data'], true) : [];
  33. }, $result);
  34. }
  35. public function findDataByMajorVersions(Package $package)
  36. {
  37. $sql = '
  38. SELECT v.normalizedVersion, d.data
  39. FROM package_version v
  40. INNER JOIN download d ON d.id=v.id AND d.type = :versionType
  41. WHERE v.package_id = :package AND v.development = 0 AND v.normalizedVersion REGEXP "^[0-9]+"
  42. ORDER BY v.normalizedVersion DESC
  43. ';
  44. $stmt = $this->getEntityManager()->getConnection()
  45. ->executeQuery(
  46. $sql,
  47. ['package' => $package->getId(), 'versionType' => Download::TYPE_VERSION]
  48. );
  49. $result = $stmt->fetchAll();
  50. $stmt->closeCursor();
  51. $series = [];
  52. foreach ($result as $row) {
  53. $name = preg_replace('{^(\d+)(\.|$).*}', '$1', $row['normalizedVersion']);
  54. $series[$name][] = $row['data'] ? json_decode($row['data'], true) : [];
  55. }
  56. return $series;
  57. }
  58. }