StringFilter   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 1

Importance

Changes 0
Metric Value
wmc 17
lcom 2
cbo 1
dl 0
loc 71
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
C filter() 0 33 13
A getDefaultOptions() 0 4 1
A getRenderSettings() 0 8 1
A getRegexExpression() 0 8 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Sonata\DoctrineMongoDBAdminBundle\Filter;
15
16
use MongoDB\BSON\Regex;
17
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
18
use Sonata\AdminBundle\Form\Type\Filter\ChoiceType;
19
use Sonata\AdminBundle\Form\Type\Operator\ContainsOperatorType;
20
21
class StringFilter extends Filter
22
{
23
    /**
24
     * @param string $field
25
     * @param array  $data
26
     */
27
    public function filter(ProxyQueryInterface $queryBuilder, $name, $field, $data): void
28
    {
29
        if (!$data || !\is_array($data) || !\array_key_exists('value', $data) || null === $data['value']) {
0 ignored issues
show
Bug Best Practice introduced by Romain Norberg
The expression $data of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
30
            return;
31
        }
32
33
        $data['value'] = trim($data['value']);
34
35
        if ('' === $data['value']) {
36
            return;
37
        }
38
39
        $data['type'] = isset($data['type']) && !empty($data['type']) ? $data['type'] : ContainsOperatorType::TYPE_CONTAINS;
40
41
        $obj = $queryBuilder;
42
        if (self::CONDITION_OR === $this->condition) {
43
            $obj = $queryBuilder->expr();
44
        }
45
46
        if (ContainsOperatorType::TYPE_EQUAL === $data['type']) {
47
            $obj->field($field)->equals($data['value']);
48
        } elseif (ContainsOperatorType::TYPE_CONTAINS === $data['type']) {
49
            $obj->field($field)->equals($this->getRegexExpression($data['value']));
50
        } elseif (ContainsOperatorType::TYPE_NOT_CONTAINS === $data['type']) {
51
            $obj->field($field)->not($this->getRegexExpression($data['value']));
52
        }
53
54
        if (self::CONDITION_OR === $this->condition) {
55
            $queryBuilder->addOr($obj);
56
        }
57
58
        $this->active = true;
59
    }
60
61
    /**
62
     * @return array
63
     */
64
    public function getDefaultOptions()
65
    {
66
        return [];
67
    }
68
69
    public function getRenderSettings()
70
    {
71
        return [ChoiceType::class, [
72
            'field_type' => $this->getFieldType(),
73
            'field_options' => $this->getFieldOptions(),
74
            'label' => $this->getLabel(),
75
        ]];
76
    }
77
78
    /**
79
     * NEXT_MAJOR: Use only Regex when dropping support for doctrine/mongodb-odm 1.x.
80
     *
81
     * @return Regex|\MongoRegex
82
     */
83
    private function getRegexExpression(string $pattern)
84
    {
85
        if (class_exists(Regex::class)) {
86
            return new Regex($pattern, 'i');
87
        }
88
89
        return new \MongoRegex(sprintf('/%s/i', $pattern));
90
    }
91
}
92