Completed
Push — master ( 8065a1...ffd5ae )
by Albert
04:05
created

PostRepository::search()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 27
ccs 0
cts 22
cp 0
rs 8.8571
cc 1
eloc 18
nc 1
nop 3
crap 2
1
<?php
2
3
namespace Albert221\Blog\Repository\Database;
4
5
use Albert221\Blog\Entity\Post;
6
use Albert221\Blog\Repository\PostRepositoryInterface;
7
use Doctrine\ORM\EntityRepository;
8
9
class PostRepository extends EntityRepository implements PostRepositoryInterface
10
{
11
    /**
12
     * {@inheritdoc}
13
     */
14
    public function count()
15
    {
16
        $query = $this->createQueryBuilder('p')
17
            ->select('count(p.id)')
18
            ->getQuery();
19
20
        return $query->getSingleScalarResult();
21
    }
22
23
    /**
24
     * {@inheritdoc}
25
     */
26
    public function paginated($page, $perPage)
27
    {
28
        $first = ($page - 1) * $perPage;
29
30
        $query = $this->createQueryBuilder('p')
31
            ->setFirstResult($first)
32
            ->setMaxResults($perPage)
33
            ->getQuery();
34
35
        return $query->getResult();
36
    }
37
38
    /**
39
     * {@inheritdoc}
40
     */
41
    public function bySlug($slug)
42
    {
43
        return $this->findOneBy(['slug' => $slug]);
44
    }
45
46
    /**
47
     * {@inheritdoc}
48
     */
49
    public function byCategoryCount($slug)
50
    {
51
        $qb = $this->createQueryBuilder('p');
52
53
        $query = $qb->select('count(p.id)')
54
            ->join('p.category', 'c')
55
            ->where($qb->expr()->eq('c.slug', ':category'))
56
            ->setParameter(':category', $slug)
57
            ->getQuery();
58
59
        return $query->getSingleScalarResult();
60
    }
61
62
    /**
63
     * {@inheritdoc}
64
     */
65
    public function byCategory($slug, $page, $perPage)
66
    {
67
        $first = ($page - 1) * $perPage;
68
        
69
        $qb = $this->createQueryBuilder('p');
70
71
        $query = $qb->join('p.category', 'c')
72
            ->where($qb->expr()->eq('c.slug', ':category'))
73
            ->setParameter(':category', $slug)
74
            ->setFirstResult($first)
75
            ->setMaxResults($perPage)
76
            ->getQuery();
77
78
        return $query->getResult();
79
    }
80
81
    public function byTagCount($slug)
82
    {
83
        $qb = $this->createQueryBuilder('p');
84
85
        $query = $qb->select('count(p.id)')
86
            ->join('p.tags', 't')
87
            ->where($qb->expr()->eq('t.slug', ':tag'))
88
            ->setParameter(':tag', $slug)
89
            ->getQuery();
90
91
        return $query->getSingleScalarResult();
92
    }
93
94
    /**
95
     * {@inheritdoc}
96
     */
97
    public function byTag($slug, $page, $perPage)
98
    {
99
        $first = ($page - 1) * $perPage;
100
101
        $qb = $this->createQueryBuilder('p');
102
103
        $query = $qb->join('p.tags', 't')
104
            ->where($qb->expr()->eq('t.slug', ':tag'))
105
            ->setParameter(':tag', $slug)
106
            ->setFirstResult($first)
107
            ->setMaxResults($perPage)
108
            ->getQuery();
109
110
        return $query->getResult();
111
        
112
    }
113
114
    /**
115
     * {@inheritdoc}
116
     */
117
    public function searchCount($term)
118
    {
119
        $query = $this->createQueryBuilder('p')
120
            ->select('COUNT(p.id)')
121
            ->where('MATCH (p.title, p.content) AGAINST (:term EXPAND) > 1')
122
            ->setParameter(':term', $term)
123
            ->getQuery();
124
125
        return $query->getSingleScalarResult();
126
    }
127
128
    /**
129
     * {@inheritdoc}
130
     */
131
    public function search($term, $page, $perPage)
132
    {
133
        $first = ($page - 1) * $perPage;
134
135
        $query = $this->createQueryBuilder('p')
136
            ->select(
137
                'p as post',
138
                'MATCH (p.title) AGAINST (:term) as title_relevance',
139
                'MATCH (p.title, p.content) AGAINST (:term EXPAND) as relevance'
140
            )
141
            ->where('MATCH (p.title, p.content) AGAINST (:term EXPAND) > 1')
142
            ->orderBy('title_relevance', 'DESC')
143
            ->addOrderBy('relevance', 'DESC')
144
            ->setParameter(':term', $term)
145
            ->setFirstResult($first)
146
            ->setMaxResults($perPage)
147
            ->getQuery();
148
149
        $result = $query->getResult();
150
151
        // because we don't want an array of post and relevances, a post only
152
        array_walk($result, function (&$value) {
153
            $value = $value['post'];
154
        });
155
156
        return $result;
157
    }
158
159
    /**
160
     * {@inheritdoc}
161
     */
162
    public function save(Post $post)
163
    {
164
        $this->getEntityManager()->persist($post);
165
        $this->getEntityManager()->flush();
166
    }
167
}
168