Passed
Push — master ( bd1833...5bce6d )
by Petr
02:54
created

Database   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Test Coverage

Coverage 93.75%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 34
c 1
b 0
f 0
dl 0
loc 69
ccs 30
cts 32
cp 0.9375
rs 10
wmc 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 2
A getCount() 0 23 4
A getResults() 0 17 4
1
<?php
2
3
namespace kalanis\kw_mapper\Search\Connector;
4
5
6
use kalanis\kw_mapper\Interfaces\IQueryBuilder;
7
use kalanis\kw_mapper\MapperException;
8
use kalanis\kw_mapper\Mappers\Shared\TFilterNulls;
9
use kalanis\kw_mapper\Records\ARecord;
10
use kalanis\kw_mapper\Storage;
11
12
13
/**
14
 * Class Database
15
 * @package kalanis\kw_mapper\Search
16
 * Connect database as datasource
17
 */
18
class Database extends AConnector
19
{
20
    use TFilterNulls;
21
22
    /** @var Storage\Database\ASQL */
23
    protected $database = null;
24
    /** @var Storage\Database\Dialects\ADialect */
25
    protected $dialect = null;
26
    /** @var Database\Filler */
27
    protected $filler = null;
28
29
    /**
30
     * @param ARecord $record
31
     * @throws MapperException
32
     */
33 14
    public function __construct(ARecord $record, ?Storage\Shared\QueryBuilder $builder = null)
34
    {
35 14
        $this->basicRecord = $record;
36 14
        $this->initRecordLookup($record);
37 14
        $config = Storage\Database\ConfigStorage::getInstance()->getConfig($record->getMapper()->getSource());
38 14
        $this->database = Storage\Database\DatabaseSingleton::getInstance()->getDatabase($config);
39 14
        $this->dialect = Storage\Database\Dialects\Factory::getInstance()->getDialectClass($this->database->languageDialect());
40 14
        $this->queryBuilder = $builder ?: new Storage\Database\QueryBuilder($this->dialect);
41 14
        $this->queryBuilder->setBaseTable($record->getMapper()->getAlias());
42 14
        $this->filler = new Database\Filler($this->basicRecord);
43 14
    }
44
45 5
    public function getCount(): int
46
    {
47 5
        $this->queryBuilder->clearColumns();
48 5
        $relations = $this->basicRecord->getMapper()->getRelations();
49 5
        if (empty($this->basicRecord->getMapper()->getPrimaryKeys())) {
50
            // @codeCoverageIgnoreStart
51
            // no PKs in table
52
            $this->queryBuilder->addColumn($this->basicRecord->getMapper()->getAlias(), strval(reset($relations)), 'count', IQueryBuilder::AGGREGATE_COUNT);
53
            // @codeCoverageIgnoreEnd
54
        } else {
55 5
            $pks = $this->basicRecord->getMapper()->getPrimaryKeys();
56 5
            $this->queryBuilder->addColumn($this->basicRecord->getMapper()->getAlias(), strval($relations[strval(reset($pks))]), 'count', IQueryBuilder::AGGREGATE_COUNT);
57
        }
58
59 5
        $lines = $this->database->query(strval($this->dialect->select($this->queryBuilder)), array_filter($this->queryBuilder->getParams(), [$this, 'filterNullValues']));
60 5
        if (empty($lines) || !is_iterable($lines)) {
61
            // @codeCoverageIgnoreStart
62
            // only when something horribly fails
63
            return 0;
64
        }
65
        // @codeCoverageIgnoreEnd
66 5
        $line = reset($lines);
67 5
        return intval(reset($line));
68
    }
69
70 5
    public function getResults(): array
71
    {
72 5
        $this->queryBuilder->clearColumns();
73 5
        $this->filler->initTreeSolver($this->recordsInJoin);
74 5
        foreach ($this->filler->getColumns($this->queryBuilder->getJoins()) as list($table, $column, $alias)) {
75 5
            $this->queryBuilder->addColumn(strval($table), strval($column), strval($alias));
76
        }
77
78 5
        $select = strval($this->dialect->select($this->queryBuilder));
79
//print_r(str_split($select, 100));
80 5
        $rows = $this->database->query($select, array_filter($this->queryBuilder->getParams(), [$this, 'filterNullValues']));
81 5
        if (empty($rows) || !is_iterable($rows)) {
82 2
            return [];
83
        }
84
//print_r($rows);
85
86 5
        return $this->filler->fillResults($rows, $this);
87
    }
88
}
89