Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
50.00% |
2 / 4 |
CRAP | |
57.14% |
16 / 28 |
| PostRepository | |
0.00% |
0 / 1 |
|
50.00% |
2 / 4 |
10.86 | |
57.14% |
16 / 28 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| findLatest | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 11 |
|||
| findBySearchQuery | |
0.00% |
0 / 1 |
3.01 | |
90.91% |
10 / 11 |
|||
| extractSearchTerms | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| <?php | |
| /* | |
| * This file is part of the Symfony package. | |
| * | |
| * (c) Fabien Potencier <fabien@symfony.com> | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| namespace Smalldb\StateMachine\Test\SymfonyDemo\Repository; | |
| use Smalldb\StateMachine\Test\SymfonyDemo\Entity\Post; | |
| use Smalldb\StateMachine\Test\SymfonyDemo\Entity\Tag; | |
| use Smalldb\StateMachine\Test\SymfonyDemo\Pagination\Paginator; | |
| use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; | |
| use Doctrine\Common\Persistence\ManagerRegistry; | |
| /** | |
| * This custom Doctrine repository contains some methods which are useful when | |
| * querying for blog post information. | |
| * | |
| * See https://symfony.com/doc/current/doctrine/repository.html | |
| * | |
| * @author Ryan Weaver <weaverryan@gmail.com> | |
| * @author Javier Eguiluz <javier.eguiluz@gmail.com> | |
| * @author Yonel Ceruto <yonelceruto@gmail.com> | |
| */ | |
| class PostRepository extends ServiceEntityRepository | |
| { | |
| public function __construct(ManagerRegistry $registry) | |
| { | |
| parent::__construct($registry, Post::class); | |
| } | |
| public function findLatest(int $page = 1, Tag $tag = null): Paginator | |
| { | |
| $qb = $this->createQueryBuilder('p') | |
| ->addSelect('a', 't') | |
| ->innerJoin('p.author', 'a') | |
| ->leftJoin('p.tags', 't') | |
| ->where('p.publishedAt <= :now') | |
| ->orderBy('p.publishedAt', 'DESC') | |
| ->setParameter('now', new \DateTime()) | |
| ; | |
| if (null !== $tag) { | |
| $qb->andWhere(':tag MEMBER OF p.tags') | |
| ->setParameter('tag', $tag); | |
| } | |
| return (new Paginator($qb))->paginate($page); | |
| } | |
| /** | |
| * @return Post[] | |
| */ | |
| public function findBySearchQuery(string $query, int $limit = Post::NUM_ITEMS): array | |
| { | |
| $searchTerms = $this->extractSearchTerms($query); | |
| if (0 === \count($searchTerms)) { | |
| return []; | |
| } | |
| $queryBuilder = $this->createQueryBuilder('p'); | |
| foreach ($searchTerms as $key => $term) { | |
| $queryBuilder | |
| ->orWhere('p.title LIKE :t_'.$key) | |
| ->setParameter('t_'.$key, '%'.$term.'%') | |
| ; | |
| } | |
| return $queryBuilder | |
| ->orderBy('p.publishedAt', 'DESC') | |
| ->setMaxResults($limit) | |
| ->getQuery() | |
| ->getResult(); | |
| } | |
| /** | |
| * Transforms the search string into an array of search terms. | |
| */ | |
| private function extractSearchTerms(string $searchQuery): array | |
| { | |
| $searchQuery = trim(preg_replace('/[[:space:]]+/', ' ', $searchQuery)); | |
| $terms = array_unique(explode(' ', $searchQuery)); | |
| // ignore the search terms that are too short | |
| return array_filter($terms, function ($term) { | |
| return 2 <= mb_strlen($term); | |
| }); | |
| } | |
| } |