Browse Source

Suggesters information

Sullivan SENECHAL 9 years ago
parent
commit
ad145d33b3

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

@@ -376,6 +376,7 @@ class PackageController extends Controller
         }
 
         $data['dependents'] = $repo->getDependentCount($package->getName());
+        $data['suggesters'] = $repo->getSuggestCount($package->getName());
 
         if ($maintainerForm = $this->createAddMaintainerForm($package)) {
             $data['addMaintainerForm'] = $maintainerForm->createView();
@@ -924,6 +925,36 @@ class PackageController extends Controller
         return $data;
     }
 
+    /**
+     * @Route(
+     *      "/packages/{name}/suggesters",
+     *      name="view_package_suggesters",
+     *      requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+?"}
+     * )
+     * @Template()
+     */
+    public function suggestersAction(Request $req, $name)
+    {
+        $page = $req->query->get('page', 1);
+
+        /** @var PackageRepository $repo */
+        $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
+        $suggestCount = $repo->getSuggestCount($name);
+        $packages = $repo->getSuggests($name, ($page - 1) * 15, 15);
+
+        $paginator = new Pagerfanta(new FixedAdapter($suggestCount, $packages));
+        $paginator->setMaxPerPage(15);
+        $paginator->setCurrentPage($page, false, true);
+
+        $data['packages'] = $paginator;
+        $data['count'] = $suggestCount;
+
+        $data['meta'] = $this->getPackagesMetadata($data['packages']);
+        $data['name'] = $name;
+
+        return $data;
+    }
+
     /**
      * @Route(
      *      "/packages/{name}/stats/all.json",

+ 45 - 0
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -357,6 +357,51 @@ class PackageRepository extends EntityRepository
             ->getResult();
     }
 
+    public function getSuggestCount($name)
+    {
+        $apc = extension_loaded('apcu');
+
+        if ($apc) {
+            $count = apcu_fetch('packagist_suggesterCount_'.$name);
+        }
+
+        if (!isset($count) || !is_numeric($count)) {
+            $count = $this->getEntityManager()->getConnection()->fetchColumn(
+                "SELECT COUNT(DISTINCT v.package_id)
+                FROM package_version v
+                LEFT JOIN link_suggest s ON v.id = s.version_id AND s.packageName = :name
+                WHERE v.development AND (s.packageName IS NOT NULL)",
+                ['name' => $name]
+            );
+
+            if ($apc) {
+                apcu_store('packagist_dependentsCount_'.$name, $count, 7*86400);
+            }
+        }
+
+        return (int) $count;
+    }
+
+    public function getSuggests($name, $offset = 0, $limit = 15)
+    {
+        $qb = $this->getEntityManager()->createQueryBuilder();
+        $qb->select('p.id, p.name, p.description, p.language, p.abandoned, p.replacementPackage')
+            ->from('Packagist\WebBundle\Entity\Package', 'p')
+            ->join('p.versions', 'v')
+            ->leftJoin('v.suggest', 's')
+            ->where('v.development = true')
+            ->andWhere('s.packageName = :name')
+            ->groupBy('p.id, p.name, p.description, p.language, p.abandoned, p.replacementPackage')
+            ->orderBy('p.name')
+            ->setParameter('name', $name);
+
+        return $qb->getQuery()
+            ->setMaxResults($limit)
+            ->setFirstResult($offset)
+            ->useResultCache(true, 7*86400, 'suggesters_'.$name.'_'.$offset.'_'.$limit)
+            ->getResult();
+    }
+
     private function addFilters(QueryBuilder $qb, array $filters)
     {
         foreach ($filters as $name => $value) {

+ 29 - 0
src/Packagist/WebBundle/Resources/views/Package/suggesters.html.twig

@@ -0,0 +1,29 @@
+{% extends "PackagistWebBundle::layout.html.twig" %}
+
+{% set showSearchDesc = 'hide' %}
+
+{% block head_additions %}<meta name="robots" content="noindex, nofollow">{% endblock %}
+
+{% block title %}Suggesters Packages - {{ name }} - {{ parent() }}{% endblock %}
+
+{% block content %}
+    <div class="row">
+        <div class="col-xs-12 package">
+            <div class="package-header">
+                <h2 class="title">
+                    <a href="{{ path("view_package", {name: name}) }}">{{ name }}</a> suggesters
+                    <small>({{ count }})</small>
+                </h2>
+            </div>
+        </div>
+    </div>
+
+    <section class="row">
+        <section class="col-md-12">
+            {% embed "PackagistWebBundle:Web:list.html.twig" with {noLayout: 'true', showAutoUpdateWarning: false} %}
+                {% block content_title %}
+                {% endblock %}
+            {% endembed %}
+        </section>
+    </section>
+{% endblock %}

+ 1 - 0
src/Packagist/WebBundle/Resources/views/Package/viewPackage.html.twig

@@ -167,6 +167,7 @@
                         <div class="facts col-xs-12 col-sm-6 col-md-12">
                             <p><span><a href="{{ path('view_package_stats', {name: package.name}) }}" rel="nofollow">Installs</a>:</span> {% if downloads.total is defined %}{{ downloads.total|number_format(0, '.', '&#8201;')|raw }}{% else %}N/A{% endif %}</p>
                             {% if dependents is defined %}<p><span><a href="{{ path('view_package_dependents', {name: package.name}) }}" rel="nofollow">Dependents</a>:</span> {{ dependents|number_format(0, '.', '&#8201;')|raw }}</p>{% endif %}
+                            {% if suggesters is defined %}<p><span><a href="{{ path('view_package_suggesters', {name: package.name}) }}" rel="nofollow">Suggesters</a>:</span> {{ suggesters|number_format(0, '.', '&#8201;')|raw }}</p>{% endif %}
                             {% if package.gitHubStars is not null %}<p><span>Stars:</span> {{ package.gitHubStars|number_format(0, '.', '&#8201;')|raw }}</p>{% endif %}
                             {% if package.gitHubWatches is not null %}<p><span>Watchers:</span> {{ package.gitHubWatches|number_format(0, '.', '&#8201;')|raw }}</p>{% endif %}
                             {% if package.gitHubForks is not null %}<p><span>Forks:</span> {{ package.gitHubForks|number_format(0, '.', '&#8201;')|raw }}</p>{% endif %}