Completed
Push — master ( 8e2df9...a28e9f )
by P.R.
06:05
created

Columns::getNumberOfColumns()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
//----------------------------------------------------------------------------------------------------------------------
3
namespace SetBased\Audit\MySql\Table;
4
5
//----------------------------------------------------------------------------------------------------------------------
6
/**
7
 * Class for metadata of table columns.
8
 */
9
class Columns
10
{
11
  //--------------------------------------------------------------------------------------------------------------------
12
  /**
13
   * The metadata of the columns.
14
   *
15
   * @var array<string,ColumnType>
16
   */
17
  private $columns = [];
18
19
  //--------------------------------------------------------------------------------------------------------------------
20
  /**
21
   * Object constructor.
22
   *
23
   * @param array[] $columns The metadata of the columns as returned by DataLayer::getTableColumns().
24
   */
25 4
  public function __construct($columns)
26
  {
27 4
    foreach ($columns as $column)
28
    {
29 4
      if (!is_array($column))
30 4
      {
31
        /** @var ColumnType $column */
32 2
        $column = $column->getType();
33 2
      }
34
      /** @var array $column */
35 4
      $this->columns[$column['column_name']] = new ColumnType($column);
36 4
    }
37 4
  }
38
39
  //--------------------------------------------------------------------------------------------------------------------
40
  /**
41
   * Generate array with audit columns and columns from data table.
42
   *
43
   * @param Columns $auditColumnsMetadata   AuditApplication columns for adding to exist columns
44
   * @param Columns $currentColumnsMetadata Exist table columns
45
   *
46
   * @return Columns
47
   */
48 2
  public static function combine($auditColumnsMetadata, $currentColumnsMetadata)
49
  {
50 2
    $columns = [];
51
52 2
    foreach ($auditColumnsMetadata->columns as $column)
53
    {
54 2
      $columns[] = $column;
55 2
    }
56
57 2
    foreach ($currentColumnsMetadata->columns as $column)
58
    {
59 2
      $columns[] = $column;
60 2
    }
61
62 2
    return new Columns($columns);
63
  }
64
65
  //--------------------------------------------------------------------------------------------------------------------
66
  /**
67
   * Compares two Columns objects and returns an array with columns that are in the first columns object and in the
68
   * second Columns object but have different types.
69
   *
70
   * @param Columns $columns1 The first Columns object.
71
   * @param Columns $columns2 The second Columns object.
72
   *
73
   * @return Columns
74
   */
75 2
  public static function differentColumnTypes($columns1, $columns2)
76
  {
77 2
    $diff = [];
78 2
    foreach ($columns2->columns as $column2)
79
    {
80
      if (!is_array($column2))
81
      {
82
        /** @var ColumnType $column2 */
83
        $column2 = $column2->getType();
84
      }
85
      if (isset($columns1->columns[$column2['column_name']]))
86
      {
87
        $column1 = $columns1->columns[$column2['column_name']];
88
        if (!is_array($column1))
89
        {
90
          /** @var ColumnType $column1 */
91
          $column1 = $column1->getType();
92
        }
93
        if ($column2['column_type']!=$column1['column_type'])
94
        {
95
          $diff[] = $column1;
96
        }
97
      }
98 2
    }
99
100 2
    return new Columns($diff);
101
  }
102
103
  //--------------------------------------------------------------------------------------------------------------------
104
  /**
105
   * Compares two Columns objects and returns an array with columns that are in the first columns object but not in the
106
   * second Columns object.
107
   *
108
   * @param Columns $columns1 The first Columns object.
109
   * @param Columns $columns2 The second Columns object.
110
   *
111
   * @return Columns
112
   */
113 2
  public static function notInOtherSet($columns1, $columns2)
114
  {
115 2
    $diff = [];
116 2
    if (isset($columns1))
117 2
    {
118 2
      foreach ($columns1->columns as $column1)
119
      {
120 2
        if (!is_array($column1))
121 2
        {
122
          /** @var ColumnType $column1 */
123 2
          $column1 = $column1->getType();
124 2
        }
125 2
        if (!isset($columns2->columns[$column1['column_name']]))
126 2
        {
127
          $diff[] = $column1;
128
        }
129 2
      }
130 2
    }
131
132 2
    return new Columns($diff);
133
  }
134
135
  //--------------------------------------------------------------------------------------------------------------------
136
  /**
137
   * Return column type with character set and collation.
138
   *
139
   * @param string $columnName The column name.
140
   *
141
   * @return null|string
142
   */
143
  public function getColumnTypeWithCharSetCollation($columnName)
144
  {
145
    $columns = array_keys($this->columns);
146
    $key     = array_search($columnName, $columns);
147
148
    if ($key!==false)
149
    {
150
      $column                       = $this->columns[$columns[$key]];
151
      $column['character_set_name'] = isset($column['character_set_name']) ? ' '.$column['character_set_name'] : '';
152
      $column['collation_name']     = isset($column['collation_name']) ? ' '.$column['collation_name'] : '';
153
154
      return sprintf('%s%s%s', $column['column_type'], $column['character_set_name'], $column['collation_name']);
155
    }
156
157
    return null;
158
  }
159
160
  //--------------------------------------------------------------------------------------------------------------------
161
  /**
162
   * Returns the underlying array with metadata of the columns.
163
   *
164
   * @return array[]
0 ignored issues
show
Documentation introduced by
Should the return type not be array<string,\SetBased\A...MySQl\Table\ColumnType>?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
165
   */
166 4
  public function getColumns()
167
  {
168 4
    return $this->columns;
169
  }
170
171
  //--------------------------------------------------------------------------------------------------------------------
172
  /**
173
   * Returns the number of columns.
174
   *
175
   * @return int
176
   */
177 2
  public function getNumberOfColumns()
178
  {
179 2
    return count($this->columns);
180
  }
181
182
  //--------------------------------------------------------------------------------------------------------------------
183
  /**
184
   * Returns previous column of a columns. Returns null if the column name is not found in this Columns.
185
   *
186
   * @param string $columnName The column name.
187
   *
188
   * @return null|string
189
   */
190
  public function getPreviousColumn($columnName)
191
  {
192
    $columns = array_keys($this->columns);
193
    $key     = array_search($columnName, $columns);
194
195
    if ($key>=1)
196
    {
197
      return $columns[$key - 1];
198
    }
199
200
    return null;
201
  }
202
203
  //--------------------------------------------------------------------------------------------------------------------
204
}
205
206
//----------------------------------------------------------------------------------------------------------------------
207