DataSource   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 135
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
dl 0
loc 135
c 0
b 0
f 0
wmc 11
lcom 1
cbo 3
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A getData() 0 8 1
A getRecordCount() 0 4 1
A getFields() 0 4 1
A getEntityClass() 0 4 1
A getTransformers() 0 4 1
A getEventDispatcher() 0 4 1
A applyTransformers() 0 10 3
A calculateSelectFields() 0 10 1
1
<?php
2
namespace Netdudes\DataSourceryBundle\DataSource;
3
4
use Netdudes\DataSourceryBundle\DataSource\Configuration\Field;
5
use Netdudes\DataSourceryBundle\DataSource\Configuration\FieldInterface;
6
use Netdudes\DataSourceryBundle\DataSource\Driver\Doctrine\DoctrineDriver;
7
use Netdudes\DataSourceryBundle\DataSource\Driver\DriverInterface;
8
use Netdudes\DataSourceryBundle\Query\QueryInterface;
9
use Netdudes\DataSourceryBundle\Transformers\TransformerInterface;
10
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
11
12
class DataSource implements DataSourceInterface
13
{
14
    /**
15
     * @var DoctrineDriver
16
     */
17
    protected $driver;
18
19
    /**
20
     * @var string
21
     */
22
    private $entityClass;
23
24
    /**
25
     * @var Field[]
26
     */
27
    private $fields;
28
29
    /**
30
     * @var TransformerInterface[]
31
     */
32
    private $transformers;
33
34
    /**
35
     * @var EventDispatcherInterface
36
     */
37
    private $eventDispatcher;
38
39
    /**
40
     * @param                          $entityClass
41
     * @param                          $fields
42
     * @param                          $transformers
43
     * @param EventDispatcherInterface $eventDispatcher
44
     * @param DoctrineDriver           $doctrineDriver
45
     */
46
    public function __construct($entityClass, $fields, $transformers, EventDispatcherInterface $eventDispatcher, DriverInterface $doctrineDriver)
47
    {
48
        $this->entityClass = $entityClass;
49
        $this->fields = $fields;
50
        $this->transformers = $transformers;
51
        $this->eventDispatcher = $eventDispatcher;
52
        $this->driver = $doctrineDriver;
0 ignored issues
show
Documentation Bug introduced by
$doctrineDriver is of type object<Netdudes\DataSour...Driver\DriverInterface>, but the property $driver was declared to be of type object<Netdudes\DataSour...octrine\DoctrineDriver>. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
53
    }
54
55
    /**
56
     * Return the data after being processed according to the $query
57
     *
58
     * @param  QueryInterface $query
59
     *
60
     * @return array
61
     */
62
    public function getData(QueryInterface $query)
63
    {
64
        $selectFields = $this->calculateSelectFields($query);
65
        $query->setSelect($selectFields);
66
        $rows = $this->driver->getData($this, $query);
67
68
        return $this->applyTransformers($rows);
69
    }
70
71
    /**
72
     * Return the count of records returned by only filtering the data source,
73
     * before any pagination is done.
74
     *
75
     * @param QueryInterface $query
76
     *
77
     * @return integer
78
     */
79
    public function getRecordCount(QueryInterface $query)
80
    {
81
        return $this->driver->getRecordCount($this, $query);
82
    }
83
84
    /**
85
     * Return list of data source fields available for the data source
86
     *
87
     * @return FieldInterface
88
     */
89
    public function getFields()
90
    {
91
        return $this->fields;
92
    }
93
94
    public function getEntityClass()
95
    {
96
        return $this->entityClass;
97
    }
98
99
    public function getTransformers()
100
    {
101
        return $this->transformers;
102
    }
103
104
    /**
105
     * @return EventDispatcherInterface
106
     */
107
    public function getEventDispatcher()
108
    {
109
        return $this->eventDispatcher;
110
    }
111
112
    /**
113
     * @param $rows
114
     *
115
     * @return mixed
116
     */
117
    protected function applyTransformers($rows)
118
    {
119
        foreach ($this->transformers as $transformer) {
120
            foreach ($rows as $index => $row) {
121
                $rows[$index] = $transformer->transform($row, $this);
122
            }
123
        }
124
125
        return $rows;
126
    }
127
128
    /**
129
     * Build the select including the ones passed in the query plus the ones required by the
130
     * transformers.
131
     *
132
     * @param QueryInterface $query
133
     *
134
     * @return mixed
135
     */
136
    protected function calculateSelectFields(QueryInterface $query)
137
    {
138
        return array_reduce(
139
            $this->getTransformers(),
140
            function ($selectFields, TransformerInterface $transformer) {
141
                return array_unique(array_merge($selectFields, $transformer->getRequiredFieldNames()));
142
            },
143
            $query->getSelect()
144
        );
145
    }
146
}
147