Passed
Push — master ( 5d8af1...e44bd6 )
by Petr
09:24
created

Database::getResults()   B

Complexity

Conditions 7
Paths 8

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 7

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 15
c 1
b 0
f 0
nc 8
nop 0
dl 0
loc 26
ccs 16
cts 16
cp 1
crap 7
rs 8.8333
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
    protected Storage\Database\ASQL $database;
23
    protected Storage\Database\Dialects\ADialect $dialect;
24
    protected Database\Filler $filler;
25
26
    /**
27
     * @param ARecord $record
28
     * @throws MapperException
29
     */
30 15
    public function __construct(ARecord $record, ?Storage\Shared\QueryBuilder $builder = null)
31
    {
32 15
        $this->basicRecord = $record;
33 15
        $this->initRecordLookup($record);
34 15
        $config = Storage\Database\ConfigStorage::getInstance()->getConfig($record->getMapper()->getSource());
35 15
        $this->database = Storage\Database\DatabaseSingleton::getInstance()->getDatabase($config);
36 15
        $this->dialect = Storage\Database\Dialects\Factory::getInstance()->getDialectClass($this->database->languageDialect());
37 15
        $this->queryBuilder = $builder ?: new Storage\Database\QueryBuilder($this->dialect);
38 15
        $this->queryBuilder->setBaseTable($record->getMapper()->getAlias());
39 15
        $this->filler = new Database\Filler($this->basicRecord);
40
    }
41
42 6
    public function getCount(): int
43
    {
44 6
        $countQueryBuilder = clone $this->queryBuilder;
45 6
        $countQueryBuilder->clearColumns();
46 6
        $countQueryBuilder->clearOrdering();
47 6
        $relations = $this->basicRecord->getMapper()->getRelations();
48 6
        if (empty($this->basicRecord->getMapper()->getPrimaryKeys())) {
49
            // @codeCoverageIgnoreStart
50
            // no PKs in table
51
            $countQueryBuilder->addColumn($this->basicRecord->getMapper()->getAlias(), strval(reset($relations)), 'count', IQueryBuilder::AGGREGATE_COUNT);
52
            // @codeCoverageIgnoreEnd
53
        } else {
54 6
            $pks = $this->basicRecord->getMapper()->getPrimaryKeys();
55 6
            $countQueryBuilder->addColumn($this->basicRecord->getMapper()->getAlias(), strval($relations[strval(reset($pks))]), 'count', IQueryBuilder::AGGREGATE_COUNT);
56
        }
57
58 6
        $lines = $this->database->query(strval($this->dialect->select($countQueryBuilder)), array_filter($countQueryBuilder->getParams(), [$this, 'filterNullValues']));
59 6
        if (empty($lines) || !is_iterable($lines)) {
60
            // @codeCoverageIgnoreStart
61
            // only when something horribly fails
62
            return 0;
63
        }
64
        // @codeCoverageIgnoreEnd
65 6
        $line = reset($lines);
66 6
        return intval(reset($line));
67
    }
68
69 6
    public function getResults(): array
70
    {
71 6
        $resultQueryBuilder = clone $this->queryBuilder;
72 6
        $resultQueryBuilder->clearColumns();
73 6
        $this->filler->initTreeSolver($this->recordsInJoin);
74 6
        foreach ($this->filler->getColumns($resultQueryBuilder->getJoins()) as list($table, $column, $alias)) {
75 6
            $resultQueryBuilder->addColumn(strval($table), strval($column), strval($alias));
76
        }
77 6
        if (empty($resultQueryBuilder->getOrdering())) {
78 6
            $basicRelations = $this->basicRecord->getMapper()->getRelations();
79 6
            foreach ($this->basicRecord->getMapper()->getPrimaryKeys() as $primaryKey) {
80 6
                if (isset($basicRelations[$primaryKey])) {
81 6
                    $resultQueryBuilder->addOrderBy($resultQueryBuilder->getBaseTable(), $basicRelations[$primaryKey], IQueryBuilder::ORDER_ASC);
82
                }
83
            }
84
        }
85
86 6
        $select = strval($this->dialect->select($resultQueryBuilder));
87
//print_r(str_split($select, 100));
88 6
        $rows = $this->database->query($select, array_filter($resultQueryBuilder->getParams(), [$this, 'filterNullValues']));
89 6
        if (empty($rows) || !is_iterable($rows)) {
90 3
            return [];
91
        }
92
//print_r($rows);
93
94 6
        return $this->filler->fillResults($rows, $this);
95
    }
96
}
97