ColumnWriter::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 5
rs 9.4286
cc 1
eloc 3
nc 1
nop 2
1
<?php
2
/**
3
 * Author: Nil Portugués Calderó <[email protected]>
4
 * Date: 6/12/14
5
 * Time: 1:28 AM.
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace NilPortugues\Sql\QueryBuilder\Builder\Syntax;
12
13
use NilPortugues\Sql\QueryBuilder\Builder\GenericBuilder;
14
use NilPortugues\Sql\QueryBuilder\Manipulation\Select;
15
use NilPortugues\Sql\QueryBuilder\Syntax\Column;
16
use NilPortugues\Sql\QueryBuilder\Syntax\SyntaxFactory;
17
18
/**
19
 * Class ColumnWriter.
20
 */
21
class ColumnWriter
22
{
23
    /**
24
     * @var \NilPortugues\Sql\QueryBuilder\Builder\GenericBuilder
25
     */
26
    private $writer;
27
28
    /**
29
     * @var PlaceholderWriter
30
     */
31
    private $placeholderWriter;
32
33
    /**
34
     * @param GenericBuilder    $writer
35
     * @param PlaceholderWriter $placeholderWriter
36
     */
37
    public function __construct(GenericBuilder $writer, PlaceholderWriter $placeholderWriter)
38
    {
39
        $this->writer = $writer;
40
        $this->placeholderWriter = $placeholderWriter;
41
    }
42
43
    /**
44
     * @param Select $select
45
     *
46
     * @return array
47
     */
48
    public function writeSelectsAsColumns(Select $select)
49
    {
50
        $selectAsColumns = $select->getColumnSelects();
51
52
        if (!empty($selectAsColumns)) {
53
            $selectWriter = WriterFactory::createSelectWriter($this->writer, $this->placeholderWriter);
54
            $selectAsColumns = $this->selectColumnToQuery($selectAsColumns, $selectWriter);
55
        }
56
57
        return $selectAsColumns;
58
    }
59
60
    /**
61
     * @param array        $selectAsColumns
62
     * @param SelectWriter $selectWriter
63
     *
64
     * @return mixed
65
     */
66
    protected function selectColumnToQuery(array &$selectAsColumns, SelectWriter $selectWriter)
67
    {
68
        \array_walk(
69
            $selectAsColumns,
70
            function (&$column) use (&$selectWriter) {
71
                $keys = \array_keys($column);
72
                $key = \array_pop($keys);
73
74
                $values = \array_values($column);
75
                $value = $values[0];
76
77
                if (\is_numeric($key)) {
78
                    /* @var Column $value */
79
                    $key = $this->writer->writeTableName($value->getTable());
80
                }
81
                $column = $selectWriter->selectToColumn($key, $value);
82
            }
83
        );
84
85
        return $selectAsColumns;
86
    }
87
88
    /**
89
     * @param Select $select
90
     *
91
     * @return array
92
     */
93
    public function writeValueAsColumns(Select $select)
94
    {
95
        $valueAsColumns = $select->getColumnValues();
96
        $newColumns = [];
97
98
        if (!empty($valueAsColumns)) {
99
            foreach ($valueAsColumns as $alias => $value) {
100
                $value = $this->writer->writePlaceholderValue($value);
101
                $newValueColumn = array($alias => $value);
102
103
                $newColumns[] = SyntaxFactory::createColumn($newValueColumn, null);
104
            }
105
        }
106
107
        return $newColumns;
108
    }
109
110
    /**
111
     * @param Select $select
112
     *
113
     * @return array
114
     */
115
    public function writeFuncAsColumns(Select $select)
116
    {
117
        $funcAsColumns = $select->getColumnFuncs();
118
        $newColumns = [];
119
120
        if (!empty($funcAsColumns)) {
121
            foreach ($funcAsColumns as $alias => $value) {
122
                $funcName = $value['func'];
123
                $funcArgs = (!empty($value['args'])) ? '('.implode(', ', $value['args']).')' : '';
124
125
                $newFuncColumn = array($alias => $funcName.$funcArgs);
126
                $newColumns[] = SyntaxFactory::createColumn($newFuncColumn, null);
127
            }
128
        }
129
130
        return $newColumns;
131
    }
132
133
    /**
134
     * @param Column $column
135
     *
136
     * @return string
137
     */
138
    public function writeColumnWithAlias(Column $column)
139
    {
140
        if (($alias = $column->getAlias()) && !$column->isAll()) {
141
            return $this->writeColumn($column).' AS '.$this->writer->writeColumnAlias($alias);
142
        }
143
144
        return $this->writeColumn($column);
145
    }
146
147
    /**
148
     * @param Column $column
149
     *
150
     * @return string
151
     */
152
    public function writeColumn(Column $column)
153
    {
154
        $alias = $column->getTable()->getAlias();
155
        $table = ($alias) ? $this->writer->writeTableAlias($alias) : $this->writer->writeTable($column->getTable());
156
157
        $columnString = (empty($table)) ? '' : "{$table}.";
158
        $columnString .= $this->writer->writeColumnName($column);
159
160
        return $columnString;
161
    }
162
}
163