protected function execute(InputInterface $input, OutputInterface $output)
 {
     $title = $input->getArgument('title');
     $image = $input->getArgument('image');
     $thumbnail = $input->getArgument('thumbnail');
     $alias = $input->getOption('alias');
     $series = new Series();
     $series->setTitle($title)->setImage($image)->setThumbnail($thumbnail);
     if ($alias) {
         $series->setAlias($alias);
     }
     $om = $this->getContainer()->get('doctrine')->getManager();
     $repo = $om->getRepository(Series::class);
     $repo->create($series);
     $serializer = $this->getContainer()->get('jms_serializer');
     $output->write($serializer->serialize($series, 'json'));
 }
 /**
  * @Route("/{alias}/markov", name="series_markov")
  * @Method({"GET"})
  * @Template("ChaosTangentFansubEbooksAppBundle:Series:markov.html.twig")
  * @ParamConverter("series", class="Entity:Series", options={"repository_method": "getSeries", "map_method_signature": true})
  */
 public function markovAction(Series $series, Request $request)
 {
     $corpus = '';
     foreach ($series->getFiles() as $file) {
         foreach ($file->getLines() as $line) {
             $corpus .= $line->getLine() . ' ';
         }
     }
     $corpus = preg_split('/\\s+/u', $corpus, 0, PREG_SPLIT_NO_EMPTY);
     $length = 140;
     $startPoint = mt_rand(0, count($corpus) - 1);
     $output = $corpus[$startPoint];
     $lastWord = $corpus[$startPoint];
     while (mb_strlen($output) < $length) {
         $nextWords = [];
         reset($corpus);
         while ((list($k, $v) = each($corpus)) !== false) {
             if ($v != $lastWord) {
                 continue;
             }
             $nextWords[] = next($corpus);
         }
         $nextWord = $nextWords[array_rand($nextWords)];
         $output .= ' ' . $nextWord;
         $lastWord = $nextWord;
     }
     return new Response($output);
     return [];
 }
 /**
  * Search for a line
  *
  * @param string $q The search query
  * @param integer $page The page of results to retrieve
  * @param integer $perPage How many results to retrieve
  * @return SearchResult The search results
  * @see ChaosTangent\FansubEbooks\Bundle\AppBundle\DataFixtures\ORM\CreateSearchIndex
  */
 public function search($q, $page = 1, $perPage = 30, Series $series = null)
 {
     if (empty(trim($q))) {
         return new SearchResult($q, [], 0, $page, $perPage);
     }
     // default query parameters
     $defaultParams = [':query' => trim($q), ':config' => 'english'];
     // default where clause
     $whereClause = 'WHERE to_tsvector(:config, l.line) @@ to_tsquery(:query)';
     if ($series !== null) {
         $whereClause .= ' AND f.series_id = :series';
         $defaultParams['series'] = $series->getId();
     }
     // count total results from search query
     $countSql = 'SELECT COUNT(l.id)
         FROM lines l
         JOIN files f ON f.id = l.file_id ' . $whereClause;
     $total = $this->_em->getConnection()->fetchColumn($countSql, $defaultParams, 0);
     // get the selected page of results from search query
     $rsm = new ResultSetMappingBuilder($this->_em);
     $rsm->addRootEntityFromClassMetadata('ChaosTangent\\FansubEbooks\\Entity\\Line', 'l');
     $rsm->addScalarResult('positive_votes', 'positive_votes', 'integer');
     $rsm->addScalarResult('negative_votes', 'negative_votes', 'integer');
     $rsm->addScalarResult('tweet_id', 'tweet_id');
     $sql = 'SELECT ' . $rsm->generateSelectClause() . ',
             SUM(CASE WHEN v.positive = true THEN 1 ELSE 0 END) AS positive_votes,
             SUM(CASE WHEN v.positive = false THEN 1 ELSE 0 END) AS negative_votes,
             t.tweet_id
         FROM lines l
         JOIN files f ON f.id = l.file_id
         LEFT JOIN votes v ON v.line_id = l.id
         LEFT JOIN tweets t ON t.line_id = l.id ' . $whereClause . '
         GROUP BY l.id, t.tweet_id
         ORDER BY ts_rank(to_tsvector(:config, l.line), to_tsquery(:query))
         LIMIT :limit OFFSET :offset';
     $query = $this->_em->createNativeQuery($sql, $rsm);
     $query->setParameters(array_merge($defaultParams, ['limit' => $perPage, 'offset' => ($page - 1) * $perPage]));
     $result = $query->getResult();
     $ret = [];
     foreach ($result as $row) {
         $ret[] = $row[0]->setPositiveVoteCount($row['positive_votes'])->setNegativeVoteCount($row['negative_votes'])->setTweetId($row['tweet_id']);
     }
     // bundle it all into a searchresult object
     return new SearchResult($q, $ret, $total, $page, $perPage);
 }