Completed
Push — 0.4.26 ( 70c06b...d0497d )
by Peter
18:23
created

SqlLike::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2.0625

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
ccs 6
cts 8
cp 0.75
rs 9.4285
cc 2
eloc 8
nc 2
nop 2
crap 2.0625
1
<?php
2
/**
3
 * AnimeDb package
4
 *
5
 * @package   AnimeDb
6
 * @author    Peter Gribanov <[email protected]>
7
 * @copyright Copyright (c) 2011, Peter Gribanov
8
 * @license   http://opensource.org/licenses/GPL-3.0 GPL v3
9
 */
10
11
namespace AnimeDb\Bundle\CatalogBundle\Service\Item\Search\Driver;
12
13
use AnimeDb\Bundle\CatalogBundle\Entity\Search;
14
use AnimeDb\Bundle\CatalogBundle\Repository\Item;
15
use AnimeDb\Bundle\CatalogBundle\Service\Item\Search\DriverInterface;
16
use Doctrine\Bundle\DoctrineBundle\Registry;
17
use AnimeDb\Bundle\CatalogBundle\Service\Item\Search\Selector;
18
use Doctrine\ORM\QueryBuilder;
19
20
/**
21
 * Search driver use a SQL LIKE for select name
22
 *
23
 * @package AnimeDb\Bundle\CatalogBundle\Service\Item\Search\Driver
24
 * @author  Peter Gribanov <[email protected]>
25
 */
26
class SqlLike implements DriverInterface
27
{
28
    /**
29
     * @var Item
30
     */
31
    protected $repository;
32
33
    /**
34
     * @var Selector
35
     */
36
    protected $selector;
37
38
    /**
39
     * @param Registry $doctrine
40
     * @param Selector $selector
41
     */
42 7
    public function __construct(Registry $doctrine, Selector $selector)
43
    {
44 7
        $this->repository = $doctrine->getRepository('AnimeDbCatalogBundle:Item');
45 7
        $this->selector = $selector;
46
47
        // register custom lower()
48 7
        $conn = $doctrine->getConnection()->getWrappedConnection();
49 7
        if (method_exists($conn, 'sqliteCreateFunction')) {
50
            $conn->sqliteCreateFunction('lower', function ($str) {
51
                return mb_strtolower($str, 'UTF8');
52
            }, 1);
53
        }
54 7
    }
55
56
    /**
57
     * @param Search $entity
58
     * @param int $limit
59
     * @param int $offset
60
     * @param string $sort_column
61
     * @param string $sort_direction
62
     *
63
     * @return array {list:[],total:0}
64
     */
65 1
    public function search(Search $entity, $limit, $offset, $sort_column, $sort_direction)
66
    {
67 1
        $selector = $this->selector
68 1
            ->create()
69 1
            ->addCountry($entity)
70 1
            ->addDateAdd($entity)
71 1
            ->addDateEnd($entity)
72 1
            ->addDatePremiere($entity)
73 1
            ->addGenres($entity)
74 1
            ->addLabels($entity)
75 1
            ->addName($entity)
76 1
            ->addStorage($entity)
77 1
            ->addStudio($entity)
78 1
            ->addType($entity)
79 1
            ->sort($sort_column, $sort_direction)
80 1
            ->limit($limit)
81 1
            ->offset($offset);
82
83
        return [
84
            'list' => $selector
85 1
                ->getQuerySelect()
86 1
                ->getQuery()
87 1
                ->getResult(),
88
            'total' => $selector
89 1
                ->getQueryTotal()
90 1
                ->getQuery()
91 1
                ->getSingleScalarResult()
92
        ];
93
    }
94
95
    /**
96
     * @param string $name
97
     * @param int $limit
98
     *
99
     * @return array
100
     */
101 6
    public function searchByName($name, $limit = 0)
102
    {
103 6
        if (!$name) {
104 1
            return [];
105
        }
106
107
        /* @var $selector QueryBuilder */
108 5
        $selector = $this->repository->createQueryBuilder('i');
109
        $selector
110 5
            ->innerJoin('i.names', 'n')
111 5
            ->andWhere('LOWER(i.name) LIKE :name OR LOWER(n.name) LIKE :name')
112 5
            ->setParameter('name', preg_replace('/%+/', '%%', mb_strtolower($name, 'UTF8')).'%');
113
114 5
        if ($limit > 0) {
115 3
            $selector->setMaxResults($limit);
116
        }
117
118
        // get items
119
        return $selector
120 5
            ->groupBy('i')
121 5
            ->getQuery()
122 5
            ->getResult();
123
    }
124
}
125