Completed
Pull Request — master (#38)
by
unknown
03:15
created

Columns::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 3
Bugs 1 Features 0
Metric Value
c 3
b 1
f 0
dl 0
loc 7
ccs 5
cts 5
cp 1
rs 9.4285
cc 2
eloc 3
nc 2
nop 1
crap 2
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 10
  public function __construct($columns)
26
  {
27 10
    foreach ($columns as $column)
28
    {
29 10
      $this->columns[$column['column_name']] = new ColumnType($column);
30 10
    }
31 10
  }
32
33
  //--------------------------------------------------------------------------------------------------------------------
34
  /**
35
   * Generate array with audit columns and columns from data table.
36
   *
37
   * @param Columns $auditColumnsMetadata   AuditApplication columns for adding to exist columns
38
   * @param Columns $currentColumnsMetadata Exist table columns
39
   *
40
   * @return Columns
41
   */
42 8
  public static function combine($auditColumnsMetadata, $currentColumnsMetadata)
43
  {
44 8
    $columns = [];
45
46
    /** @var ColumnType $column */
47 8
    foreach ($auditColumnsMetadata->columns as $column)
48
    {
49 8
      $columns[] = $column->getType();
50 8
    }
51
    /** @var ColumnType $column */
52 8
    foreach ($currentColumnsMetadata->columns as $column)
53
    {
54 8
      $columns[] = $column->getType();;
0 ignored issues
show
Coding Style introduced by
It is generally recommended to place each PHP statement on a line by itself.

Let’s take a look at an example:

// Bad
$a = 5; $b = 6; $c = 7;

// Good
$a = 5;
$b = 6;
$c = 7;
Loading history...
55 8
    }
56
57 8
    return new Columns($columns);
58
  }
59
60
  //--------------------------------------------------------------------------------------------------------------------
61
  /**
62
   * Compares two Columns objects and returns an array with columns that are in the first columns object and in the
63
   * second Columns object but have different types.
64
   *
65
   * @param Columns $columns1 The first Columns object.
66
   * @param Columns $columns2 The second Columns object.
67
   *
68
   * @return Columns
69
   */
70 8
  public static function differentColumnTypes($columns1, $columns2)
71
  {
72 8
    $diff = [];
73 8
    foreach ($columns2->columns as $column2)
74
    {
75 7
      if (!is_array($column2))
76 7
      {
77
        /** @var ColumnType $column2 */
78 7
        $column2 = $column2->getType();
79 7
      }
80 7
      if (isset($columns1->columns[$column2['column_name']]))
81 7
      {
82 7
        $column1 = $columns1->columns[$column2['column_name']];
83 7
        if (!is_array($column1))
84 7
        {
85
          /** @var ColumnType $column1 */
86 7
          $column1 = $column1->getType();
87 7
        }
88 7
        if ($column2['column_type']!=$column1['column_type'])
89 7
        {
90
          $diff[] = $column1;
91
        }
92 7
      }
93 8
    }
94
95 8
    return new Columns($diff);
96
  }
97
98
  //--------------------------------------------------------------------------------------------------------------------
99
  /**
100
   * Compares two Columns objects and returns an array with columns that are in the first columns object but not in the
101
   * second Columns object.
102
   *
103
   * @param Columns $columns1 The first Columns object.
104
   * @param Columns $columns2 The second Columns object.
105
   *
106
   * @return Columns
107
   */
108 8
  public static function notInOtherSet($columns1, $columns2)
109
  {
110 8
    $diff = [];
111 8
    if (isset($columns1))
112 8
    {
113 8
      foreach ($columns1->columns as $column1)
114
      {
115 8
        if (!is_array($column1))
116 8
        {
117
          /** @var ColumnType $column1 */
118 8
          $column1 = $column1->getType();
119 8
        }
120 8
        if (!isset($columns2->columns[$column1['column_name']]))
121 8
        {
122
          $diff[] = $column1;
123
        }
124 8
      }
125 8
    }
126
127 8
    return new Columns($diff);
128
  }
129
130
  //--------------------------------------------------------------------------------------------------------------------
131
  /**
132
   * Return column type with character set and collation.
133
   *
134
   * @param string $columnName The column name.
135
   *
136
   * @return null|string
137
   */
138
  public function getColumnTypeWithCharSetCollation($columnName)
139
  {
140
    $columns = array_keys($this->columns);
141
    $key     = array_search($columnName, $columns);
142
143
    if ($key!==false)
144
    {
145
      $column                       = $this->columns[$columns[$key]];
146
      $column['character_set_name'] = isset($column['character_set_name']) ? ' '.$column['character_set_name'] : '';
147
      $column['collation_name']     = isset($column['collation_name']) ? ' '.$column['collation_name'] : '';
148
149
      return sprintf('%s%s%s', $column['column_type'], $column['character_set_name'], $column['collation_name']);
150
    }
151
152
    return null;
153
  }
154
155
  //--------------------------------------------------------------------------------------------------------------------
156
  /**
157
   * Returns the underlying array with metadata of the columns.
158
   *
159
   * @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...
160
   */
161 10
  public function getColumns()
162
  {
163 10
    return $this->columns;
164
  }
165
166
  //--------------------------------------------------------------------------------------------------------------------
167
  /**
168
   * Returns the number of columns.
169
   *
170
   * @return int
171
   */
172 8
  public function getNumberOfColumns()
173
  {
174 8
    return count($this->columns);
175
  }
176
177
  //--------------------------------------------------------------------------------------------------------------------
178
  /**
179
   * Returns previous column of a columns. Returns null if the column name is not found in this Columns.
180
   *
181
   * @param string $columnName The column name.
182
   *
183
   * @return null|string
184
   */
185
  public function getPreviousColumn($columnName)
186
  {
187
    $columns = array_keys($this->columns);
188
    $key     = array_search($columnName, $columns);
189
190
    if ($key>=1)
191
    {
192
      return $columns[$key - 1];
193
    }
194
195
    return null;
196
  }
197
198
  //--------------------------------------------------------------------------------------------------------------------
199
}
200
201
//----------------------------------------------------------------------------------------------------------------------
202