diff -r 9ba15af20acc -r e48c2e503945 Command/PurgeTagsCommand.php
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Command/PurgeTagsCommand.php Fri Nov 18 17:42:18 2011 +0100
@@ -0,0 +1,100 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace IRI\Bundle\WikiTagBundle\Command;
+
+use Doctrine\ORM\QueryBuilder;
+use Doctrine\ORM\Query\ResultSetMapping;
+use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class PurgeTagsCommand extends ContainerAwareCommand
+{
+ protected function configure()
+ {
+ parent::configure();
+
+ $this
+ ->setName('wikitag:purge-tags')
+ ->setDescription('Purge tags')
+ ->addOption("list","l",InputOption::VALUE_NONE, "List tags tp remove")
+ ->addOption("force","f",InputOption::VALUE_NONE, "Force remove tags");
+ }
+
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $force = $input->getOption('force');
+ $list = $input->getOption('list');
+
+ //get tags with no documents
+ $doctrine = $this->getContainer()->get('doctrine');
+
+ $qb = $doctrine->getEntityManager()->createQueryBuilder();
+ $qb->select('t');
+ $qb->from('WikiTagBundle:Tag','t');
+ $qb->leftJoin('t.documents', 'dt', 'WITH', 't = dt.tag');
+ $qb->addGroupBy('t.id');
+ $qb->having($qb->expr()->eq($qb->expr()->count('dt.id'),':count'));
+ $qb->setParameter("count", 0);
+
+
+ $rsm = new ResultSetMapping();
+ $rsm->addScalarResult("C","C");
+ $count_query = $doctrine->getEntityManager()->createNativeQuery("SELECT COUNT(*) AS C FROM (".$qb->getQuery()->getSQL().") AS T", $rsm);
+ $count_query->setParameter(1, 0);
+
+ $count = $count_query->getSingleScalarResult();
+
+ $output->writeln("$count tag(s) to delete.\n");
+
+ if($list)
+ {
+ $query = $qb->getQuery();
+ $result = $query->getResult();
+
+ $i = 1;
+ foreach($result as $tag)
+ {
+ $output->writeln(strval($i++)."- ".$tag->getLabel());
+ }
+ $output->writeln("");
+ }
+ else
+ {
+ if(! $force && $input->isInteractive())
+ {
+ $dialog = $this->getHelper('dialog');
+ if (!$dialog->askConfirmation($output, 'Confirm deletion? (y/N) : ', false)) {
+ return;
+ }
+ }
+
+
+ $id_delete = array();
+ foreach($qb->getQuery()->getResult() as $tag)
+ {
+ $id_delete[] = $tag->getId();
+ }
+
+ $delete_qb = $doctrine->getEntityManager()->createQueryBuilder();
+ $delete_qb->delete('WikiTagBundle:Tag','tag');
+ $delete_qb->where($delete_qb->expr()->in('tag.id', $id_delete));
+
+ $result = $delete_qb->getQuery()->getResult();
+
+ $output->writeln("Tag deleted : $result \n");
+
+ }
+
+ }
+}
\ No newline at end of file