Completed
Push — master ( 02bf51...b639a7 )
by WEBEWEB
01:29
created

  A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
/**
4
 * This file is part of the jquery-datatables-bundle package.
5
 *
6
 * (c) 2018 WEBEWEB
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace WBW\Bundle\JQuery\DataTablesBundle\Repository;
13
14
use Doctrine\ORM\EntityRepository;
15
use Doctrine\ORM\QueryBuilder;
16
use WBW\Bundle\JQuery\DataTablesBundle\API\DataTablesWrapper;
17
use WBW\Bundle\JQuery\DataTablesBundle\Provider\DataTablesProviderInterface;
18
19
/**
20
 * Default DataTables repository.
21
 *
22
 * @author webeweb <https://github.com/webeweb/>
23
 * @package WBW\Bundle\JQuery\DataTablesBundle\Repository
24
 * @abstract
25
 */
26
abstract class DefaultDataTablesRepository extends EntityRepository implements DataTablesRepositoryInterface {
27
28
    /**
29
     * Append a DataTables ORDER clause.
30
     *
31
     * @param QueryBuilder $queryBuilder The query builder.
32
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
33
     * @return void
34
     */
35
    public static function appendDataTablesOrder(QueryBuilder $queryBuilder, DataTablesWrapper $dtWrapper) {
36
37
        // Handle each DataTables order.
38
        foreach ($dtWrapper->getRequest()->getOrder() as $dtOrder) {
39
40
            // Get the DataTables column.
41
            $dtColumn = array_values($dtWrapper->getColumns())[$dtOrder->getColumn()];
42
43
            // Check if the DataTables column is orderable.
44
            if (false === $dtColumn->getOrderable()) {
45
                continue;
46
            }
47
48
            // Add the order by.
49
            $queryBuilder->addOrderBy($dtColumn->getMapping()->getAlias(), $dtOrder->getDir());
50
        }
51
    }
52
53
    /**
54
     * Append a DataTables WHERE clause.
55
     *
56
     * @param QueryBuilder $queryBuilder The query builder.
57
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
58
     * @return void
59
     */
60
    public static function appendDataTablesWhere(QueryBuilder $queryBuilder, DataTablesWrapper $dtWrapper) {
61
62
        // Detremines and check the operator.
63
        $operator = self::determineDataTablesOperator($dtWrapper);
64
        if (null === $operator) {
65
            return;
66
        }
67
68
        // Initialize.
69
        $wheres = [];
70
        $params = [];
71
        $values = [];
72
73
        // Handle each DataTables column.
74
        foreach ($dtWrapper->getRequest()->getColumns() as $dtColumn) {
75
76
            // Check the DataTables column.
77
            if ("OR" === $operator || "" !== $dtColumn->getSearch()->getValue()) {
78
79
                // Get the DataTables mapping.
80
                $mapping = $dtColumn->getMapping();
81
82
                // Add.
83
                $wheres[] = $mapping->getAlias() . " LIKE :" . $mapping->getPrefix() . $mapping->getColumn();
84
                $params[] = ":" . $mapping->getPrefix() . $mapping->getColumn();
85
                $values[] = "%" . ("AND" === $operator ? $dtColumn->getSearch()->getValue() : $dtWrapper->getRequest()->getSearch()->getValue()) . "%";
86
            }
87
        }
88
89
        // Set the where clause.
90
        $queryBuilder->andWhere("(" . implode(" " . $operator . " ", $wheres) . ")");
91
        for ($i = count($params) - 1; 0 <= $i; --$i) {
92
            $queryBuilder->setParameter($params[$i], $values[$i]);
93
        }
94
    }
95
96
    /**
97
     * Build a DataTables query builder "Count filtered".
98
     *
99
     * @param DataTablesWrapper $dtWrapper The wrapper.
100
     * @return QueryBuilder Returns the DataTables query builder "Count filtered".
101
     */
102
    protected function buildDataTablesCountFiltered(DataTablesWrapper $dtWrapper) {
103
104
        // Get the prefix.
105
        $prefix = $dtWrapper->getMapping()->getPrefix();
106
107
        // Create a query builder.
108
        $qb = $this->createQueryBuilder($prefix)
109
            ->select("COUNT(" . $prefix . ")");
110
111
        // Append the where clause.
112
        self::appendDataTablesWhere($qb, $dtWrapper);
113
114
        // Return the query builder.
115
        return $qb;
116
    }
117
118
    /**
119
     * Build a DataTables query builder "Count total".
120
     *
121
     * @param DataTablesWrapper $dtWrapper The wrapper.
122
     * @return QueryBuilder Returns the DataTables query builder "Count total".
123
     */
124
    protected function buildDataTablesCountTotal(DataTablesWrapper $dtWrapper) {
125
126
        // Get the prefix.
127
        $prefix = $dtWrapper->getMapping()->getPrefix();
128
129
        // Create a query builder.
130
        $qb = $this->createQueryBuilder($prefix)
131
            ->select("COUNT(" . $prefix . ")");
132
133
        // Return the query builder.
134
        return $qb;
135
    }
136
137
    /**
138
     * Build a DataTables query builder "Export all".
139
     *
140
     * @param DataTablesProviderInterface $dtProvider The provider.
141
     * @return QueryBuilder Returns the DataTables query builder "Export all".
142
     */
143
    protected function buildDataTablesExportAll(DataTablesProviderInterface $dtProvider) {
144
145
        // Create a query builder.
146
        $qb = $this->createQueryBuilder($dtProvider->getPrefix());
147
148
        // Return the query builder.
149
        return $qb;
150
    }
151
152
    /**
153
     * Build a DataTables query builder "Find all".
154
     *
155
     * @param DataTablesWrapper $dtWrapper The wrapper.
156
     * @return QueryBuilder Returns the DataTables query builder "Find all".
157
     */
158
    protected function buildDataTablesFindAll(DataTablesWrapper $dtWrapper) {
159
160
        // Get the prefix.
161
        $prefix = $dtWrapper->getMapping()->getPrefix();
162
163
        // Create a query builder.
164
        $qb = $this->createQueryBuilder($prefix)
165
            ->setFirstResult($dtWrapper->getRequest()->getStart())
166
            ->setMaxResults($dtWrapper->getRequest()->getLength());
167
168
        // Build the where and order clauses.
169
        self::appendDataTablesWhere($qb, $dtWrapper);
170
        self::appendDataTablesOrder($qb, $dtWrapper);
171
172
        // Return the query builder.
173
        return $qb;
174
    }
175
176
    /**
177
     * {@inheritdoc}
178
     */
179
    public function dataTablesCountFiltered(DataTablesWrapper $dtWrapper) {
180
181
        // Build a DataTables query builder.
182
        $qb = $this->buildDataTablesCountFiltered($dtWrapper);
183
184
        // Return the single scalar result.
185
        return intval($qb->getQuery()->getSingleScalarResult());
186
    }
187
188
    /**
189
     * {@inheritdoc}
190
     */
191
    public function dataTablesCountTotal(DataTablesWrapper $dtWrapper) {
192
193
        // Build a DataTables query builder.
194
        $qb = $this->buildDataTablesCountTotal($dtWrapper);
195
196
        // Return the single scalar result.
197
        return intval($qb->getQuery()->getSingleScalarResult());
198
    }
199
200
    /**
201
     * {@inheritdoc}
202
     */
203
    public function dataTablesExportAll(DataTablesProviderInterface $dtProvider) {
204
        return $this->buildDataTablesExportAll($dtProvider);
205
    }
206
207
    /**
208
     * {@inheritdoc}
209
     */
210
    public function dataTablesFindAll(DataTablesWrapper $dtWrapper) {
211
212
        // Build a DataTables query builder.
213
        $qb = $this->buildDataTablesFindAll($dtWrapper);
214
215
        // Return the result.
216
        return $qb->getQuery()->getResult();
217
    }
218
219
    /**
220
     * Determines a DataTables operator.
221
     *
222
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
223
     * @return string Returns the DataTables operator.
224
     */
225
    protected static function determineDataTablesOperator(DataTablesWrapper $dtWrapper) {
226
227
        // Check if the DataTables columns defines a search.
228
        foreach ($dtWrapper->getRequest()->getColumns() as $dtColumn) {
229
            if ("" !== $dtColumn->getSearch()->getValue()) {
230
                return "AND";
231
            }
232
        }
233
234
        // Check if the DataTables defines a search.
235
        if ("" !== $dtWrapper->getRequest()->getSearch()->getValue()) {
236
            return "OR";
237
        }
238
239
        // Return the operator.
240
        return null;
241
    }
242
243
}
244