Browse Source

make packagist:index command usable

Igor Wiedler 14 years ago
parent
commit
c6d639cb23

+ 30 - 7
src/Packagist/WebBundle/Command/IndexPackagesCommand.php

@@ -31,7 +31,7 @@ class IndexPackagesCommand extends ContainerAwareCommand
             ->setName('packagist:index')
             ->setDefinition(array(
                 new InputOption('force', null, InputOption::VALUE_NONE, 'Force a re-indexing of all packages'),
-                new InputOption('package', null, InputOption::VALUE_NONE, 'Package name to index (implicitly enables --force)'),
+                new InputOption('package', null, InputOption::VALUE_NONE, 'Package name to index'),
             ))
             ->setDescription('Indexes packages')
             ->setHelp(<<<EOF
@@ -47,16 +47,36 @@ EOF
     protected function execute(InputInterface $input, OutputInterface $output)
     {
         $verbose = $input->getOption('verbose');
+        $force = $input->getOption('force');
+        $package = $input->getOption('package');
+
         $doctrine = $this->getContainer()->get('doctrine');
         $solarium = $this->getContainer()->get('solarium.client');
 
-        if ($input->getOption('package')) {
+        if ($force && !$package) {
+            if ($verbose) {
+                $output->writeln('Deleting existing index');
+            }
+
+            $update = $solarium->createUpdate();
+
+            $update->addDeleteQuery('*:*');
+            $update->addCommit();
+
+            $solarium->update($update);
+
+            $doctrine
+                ->getEntityManager()
+                ->createQuery('UPDATE PackagistWebBundle:Package p SET p.indexedAt = NULL')
+                ->getResult();
+        }
+
+        if ($package) {
             $packages = array($doctrine->getRepository('PackagistWebBundle:Package')->findOneByName($input->getOption('package')));
-        } elseif ($input->getOption('force')) {
+        } elseif ($force) {
             $packages = $doctrine->getRepository('PackagistWebBundle:Package')->findAll();
         } else {
-            // TODO: query for unindexed packages
-            $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getStalePackages();
+            $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getStalePackagesForIndexing();
         }
 
         foreach ($packages as $package) {
@@ -75,9 +95,12 @@ EOF
                 $update->addDocument($document);
                 $update->addCommit();
 
-                $result = $solarium->update($update);
+                $package->setIndexedAt(new \DateTime);
+
+                $em = $doctrine->getEntityManager();
+                $em->flush();
 
-                var_dump($result->getStatus());
+                $solarium->update($update);
             } catch (\Exception $e) {
                 $output->writeln('<error>Exception: '.$e->getMessage().', skipping package '.$package->getName().'.</error>');
             }

+ 25 - 0
src/Packagist/WebBundle/Entity/Package.php

@@ -88,6 +88,11 @@ class Package
      */
     private $crawledAt;
 
+    /**
+     * @ORM\Column(type="datetime", nullable=true)
+     */
+    private $indexedAt;
+
     private $entityRepository;
 
     public function __construct()
@@ -347,6 +352,26 @@ class Package
         return $this->crawledAt;
     }
 
+    /**
+     * Set indexedAt
+     *
+     * @param datetime $indexedAt
+     */
+    public function setIndexedAt($indexedAt)
+    {
+        $this->indexedAt = $indexedAt;
+    }
+
+    /**
+     * Get indexedAt
+     *
+     * @return datetime $indexedAt
+     */
+    public function getIndexedAt()
+    {
+        return $this->indexedAt;
+    }
+
     /**
      * Add maintainers
      *

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

@@ -30,6 +30,17 @@ class PackageRepository extends EntityRepository
         return $qb->getQuery()->getResult();
     }
 
+    public function getStalePackagesForIndexing()
+    {
+        $qb = $this->getEntityManager()->createQueryBuilder();
+        $qb->select('p, v')
+            ->from('Packagist\WebBundle\Entity\Package', 'p')
+            ->leftJoin('p.versions', 'v')
+            ->where('p.indexedAt IS NULL OR p.indexedAt < ?0')
+            ->setParameters(array(new \DateTime('-1hour')));
+        return $qb->getQuery()->getResult();
+    }
+
     public function findOneByName($name)
     {
         $qb = $this->getBaseQueryBuilder()