Passed
Pull Request — 2.x (#225)
by
unknown
18:45
created

SubQuery::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 5
nc 1
nop 2
dl 0
loc 8
rs 10
c 1
b 0
f 1
1
<?php
2
3
/**
4
 * This file is part of Cycle ORM package.
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
declare(strict_types=1);
11
12
namespace Cycle\Database\Injection;
13
14
use Cycle\Database\Driver\CompilerInterface;
15
use Cycle\Database\Query\Interpolator;
16
use Cycle\Database\Query\QueryParameters;
17
use Cycle\Database\Query\SelectQuery;
18
19
/**
20
 * This fragment is used to inject a whole select statement into
21
 * FROM and SELECT parts of the query.
22
 * Examples:
23
 * ```
24
 * $subQuery = new SubQuery($queryBuilder->select()->from(['users']),'u');
25
 * $query = $queryBuilder->select()->from($subQuery);
26
 * ```
27
 * Will provide SQL like this: SELECT * FROM (SELECT * FROM users) AS u
28
 *
29
 * ```
30
 * $subQuery = new SubQuery($queryBuilder->select()->from(['users']),'u');
31
*  $query = $queryBuilder->select($subQuery)->from(['employee']);
32
 * ```
33
 * Will provide SQL like this: SELECT *, (SELECT * FROM users) AS u FROM employee
34
 */
35
class SubQuery implements FragmentInterface
36
{
37
    private SelectQuery $query;
38
    private string $alias;
39
40
    /** @var ParameterInterface[] */
41
    private array $parameters;
42
43
    public function __construct(SelectQuery $query, string $alias)
44
    {
45
        $this->query = $query;
46
        $this->alias = $alias;
47
48
        $parameters = new QueryParameters();
49
        $this->query->sqlStatement($parameters);
50
        $this->parameters = $parameters->getParameters();
51
    }
52
53
    public function getType(): int
54
    {
55
        return CompilerInterface::SUBQUERY;
56
    }
57
58
    public function getTokens(): array
59
    {
60
        return \array_merge(
61
            [
62
                'alias' => $this->alias,
63
                'parameters' => $this->parameters,
64
            ],
65
            $this->query->getTokens(),
66
        );
67
    }
68
69
    public function getQuery(): SelectQuery
70
    {
71
        return $this->query;
72
    }
73
74
    public function __toString(): string
75
    {
76
        $parameters = new QueryParameters();
77
78
        return Interpolator::interpolate(
79
            $this->query->sqlStatement($parameters),
80
            $parameters->getParameters(),
81
        );
82
    }
83
}
84