ReferenceCompiler   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 104
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 6
dl 0
loc 104
ccs 0
cts 36
cp 0
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A compileReference() 0 13 2
A compile() 0 8 2
A replace() 0 10 2
A convertReferenceToValue() 0 8 2
A convertScalarReference() 0 8 2
A convertObjectReference() 0 15 4
1
<?php
2
3
/**
4
 * This file is part of UnderQuery package.
5
 *
6
 * Copyright (c) 2016 Beniamin Jonatan Šimko
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 Phuria\UnderQuery\QueryCompiler;
13
14
use Phuria\UnderQuery\Language\Expression\RelativeClause;
15
use Phuria\UnderQuery\QueryBuilder\AbstractBuilder;
16
use Phuria\UnderQuery\QueryBuilder\BuilderInterface;
17
use Phuria\UnderQuery\Table\AbstractTable;
18
19
/**
20
 * @author Beniamin Jonatan Šimko <[email protected]>
21
 */
22
class ReferenceCompiler
23
{
24
    /**
25
     * @param CompilerPayload $payload
26
     *
27
     * @return CompilerPayload
28
     */
29
    public function compileReference(CompilerPayload $payload)
30
    {
31
        $builder = $payload->getBuilder();
32
        $references = [];
33
34
        if ($builder instanceof AbstractBuilder) {
35
            $references = $builder->getReferences()->toArray();
36
        }
37
38
        $actualSQL = $this->compile($payload->getActualSQL(), $references);
39
40
        return $payload->updateSQL($actualSQL);
41
    }
42
43
    /**
44
     * @param string $rawSQL
45
     * @param array  $references
46
     *
47
     * @return string
48
     */
49
    public function compile($rawSQL, array $references)
50
    {
51
        foreach ($references as &$value) {
52
            $value = $this->convertReferenceToValue($value);
53
        }
54
55
        return $this->replace($rawSQL, $references);
56
    }
57
58
    /**
59
     * TODO: hardfixed, refactor needed
60
     *
61
     * @param string $rawSQL
62
     * @param array  $references
63
     *
64
     * @return string
65
     */
66
    private function replace($rawSQL, $references)
67
    {
68
        $result = str_replace(array_keys($references), array_values($references), $rawSQL);
69
70
        if (false === strpos($result, '@ref[')) {
71
            return $result;
72
        } else {
73
            return $this->replace($result, $references);
74
        }
75
    }
76
77
    /**
78
     * @param $reference
79
     *
80
     * @return string
81
     */
82
    private function convertReferenceToValue($reference)
83
    {
84
        if (is_scalar($reference)) {
85
            return $this->convertScalarReference($reference);
86
        } else {
87
            return $this->convertObjectReference($reference);
88
        }
89
    }
90
91
    /**
92
     * @param $reference
93
     *
94
     * @return string
95
     */
96
    private function convertScalarReference($reference)
97
    {
98
        if (is_string($reference)) {
99
            return "\"" . $reference ."\"";
100
        }
101
102
        return $reference;
103
    }
104
105
    /**
106
     * @param mixed $reference
107
     *
108
     * @return string
109
     */
110
    private function convertObjectReference($reference)
111
    {
112
        if ($reference instanceof AbstractTable) {
113
            return $reference->getAliasOrName();
114
        } elseif ($reference instanceof BuilderInterface) {
115
            return $reference->buildSQL();
116
        } elseif ($reference instanceof RelativeClause) {
117
            $table = $this->convertObjectReference($reference->getRelatedTable());
118
            $clause = $this->convertObjectReference($reference->getClause());
119
120
            return str_replace($reference->getDirective(), $table . '.', $clause);
121
        }
122
123
        return $reference;
124
    }
125
}