Completed
Push — master ( 5d62cd...a400a0 )
by P.R.
04:25
created

Columns   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 185
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 2
Bugs 1 Features 0
Metric Value
wmc 24
c 2
b 1
f 0
lcom 1
cbo 1
dl 0
loc 185
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 3
A combine() 0 16 3
B differentColumnTypes() 0 27 6
B notInOtherSet() 0 21 5
A getColumns() 0 4 1
A getColumnTypeWithCharSetCollation() 0 16 4
A getPreviousColumn() 0 12 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
  public function __construct($columns)
26
  {
27
    foreach ($columns as $column)
28
    {
29
      if (!is_array($column))
30
      {
31
        /** @var ColumnType $column */
32
        $column = $column->getType();
33
      }
34
      /** @var array $column */
35
      $this->columns[$column['column_name']] = new ColumnType($column);
36
    }
37
  }
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
  public static function combine($auditColumnsMetadata, $currentColumnsMetadata)
49
  {
50
    $columns = [];
51
52
    foreach ($auditColumnsMetadata->columns as $column)
53
    {
54
      $columns[] = $column;
55
    }
56
57
    foreach ($currentColumnsMetadata->columns as $column)
58
    {
59
      $columns[] = $column;
60
    }
61
62
    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
  public static function differentColumnTypes($columns1, $columns2)
76
  {
77
    $diff = [];
78
    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
    }
99
100
    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
  public static function notInOtherSet($columns1, $columns2)
114
  {
115
    $diff = [];
116
    if (isset($columns1))
117
    {
118
      foreach ($columns1->columns as $column1)
119
      {
120
        if (!is_array($column1))
121
        {
122
          /** @var ColumnType $column1 */
123
          $column1 = $column1->getType();
124
        }
125
        if (!isset($columns2->columns[$column1['column_name']]))
126
        {
127
          $diff[] = $column1;
128
        }
129
      }
130
    }
131
132
    return new Columns($diff);
133
  }
134
135
  //--------------------------------------------------------------------------------------------------------------------
136
  /**
137
   * Returns the underlying array with metadata of the columns.
138
   *
139
   * @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...
140
   */
141
  public function getColumns()
142
  {
143
    return $this->columns;
144
  }
145
146
  //--------------------------------------------------------------------------------------------------------------------
147
  /**
148
   * Return column type with character set and collation.
149
   *
150
   * @param string $columnName The column name.
151
   *
152
   * @return null|string
153
   */
154
  public function getColumnTypeWithCharSetCollation($columnName)
155
  {
156
    $columns = array_keys($this->columns);
157
    $key     = array_search($columnName, $columns);
158
159
    if ($key!==false)
160
    {
161
      $column                       = $this->columns[$columns[$key]];
162
      $column['character_set_name'] = isset($column['character_set_name']) ? ' '.$column['character_set_name'] : '';
163
      $column['collation_name']     = isset($column['collation_name']) ? ' '.$column['collation_name'] : '';
164
165
      return sprintf('%s%s%s', $column['column_type'], $column['character_set_name'], $column['collation_name']);
166
    }
167
168
    return null;
169
  }
170
171
  //--------------------------------------------------------------------------------------------------------------------
172
  /**
173
   * Returns previous column of a columns. Returns null if the column name is not found in this Columns.
174
   *
175
   * @param string $columnName The column name.
176
   *
177
   * @return null|string
178
   */
179
  public function getPreviousColumn($columnName)
180
  {
181
    $columns = array_keys($this->columns);
182
    $key     = array_search($columnName, $columns);
183
184
    if ($key>=1)
185
    {
186
      return $columns[$key - 1];
187
    }
188
189
    return null;
190
  }
191
192
  //--------------------------------------------------------------------------------------------------------------------
193
}
194
195
//----------------------------------------------------------------------------------------------------------------------
196