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