Completed
Pull Request — master (#31)
by
unknown
03:08
created

Columns::notInOtherSet()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 16
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 16
rs 9.2
cc 4
eloc 7
nc 2
nop 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
      $this->columns[$column['column_name']] = new ColumnType($column);
30
    }
31
  }
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
  public static function combine($auditColumnsMetadata, $currentColumnsMetadata)
43
  {
44
    $columns = [];
45
46
    foreach ($auditColumnsMetadata->columns as $column)
47
    {
48
      $columns[] = $column;
49
    }
50
51
    foreach ($currentColumnsMetadata->columns as $column)
52
    {
53
      $columns[] = $column;
54
    }
55
56
    return new Columns($columns);
57
  }
58
59
  //--------------------------------------------------------------------------------------------------------------------
60
  /**
61
   * Compares two Columns objects and returns an array with columns that are in the first columns object and in the
62
   * second Columns object but have different types.
63
   *
64
   * @param Columns $columns1 The first Columns object.
65
   * @param Columns $columns2 The second Columns object.
66
   *
67
   * @return Columns
68
   */
69
  public static function differentColumnTypes($columns1, $columns2)
70
  {
71
    $diff = [];
72
    foreach ($columns2->columns as $column2)
73
    {
74
      if (isset($columns1->columns[$column2['column_name']]))
75
      {
76
        $column1 = $columns1->columns[$column2['column_name']];
77
        if ($column2['column_type']!=$column1['column_type'])
78
        {
79
          $diff[] = $column1;
80
        }
81
      }
82
    }
83
84
    return new Columns($diff);
85
  }
86
87
  //--------------------------------------------------------------------------------------------------------------------
88
  /**
89
   * Compares two Columns objects and returns an array with columns that are in the first columns object but not in the
90
   * second Columns object.
91
   *
92
   * @param Columns $columns1 The first Columns object.
93
   * @param Columns $columns2 The second Columns object.
94
   *
95
   * @return Columns
96
   */
97
  public static function notInOtherSet($columns1, $columns2)
98
  {
99
    $diff = [];
100
    if (isset($columns1))
101
    {
102
      foreach ($columns1->columns as $column1)
103
      {
104
        if (!isset($columns2->columns[$column1['column_name']]))
105
        {
106
          $diff[] = $column1;
107
        }
108
      }
109
    }
110
111
    return new Columns($diff);
112
  }
113
114
  //--------------------------------------------------------------------------------------------------------------------
115
  /**
116
   * Returns the underlying array with metadata of the columns.
117
   *
118
   * @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...
119
   */
120
  public function getColumns()
121
  {
122
    return $this->columns;
123
  }
124
125
  //--------------------------------------------------------------------------------------------------------------------
126
  /**
127
   * Return column type with character set and collation.
128
   *
129
   * @param string $columnName The column name.
130
   *
131
   * @return null|string
132
   */
133
  public function getColumnTypeWithCharSetCollation($columnName)
134
  {
135
    $columns = array_keys($this->columns);
136
    $key     = array_search($columnName, $columns);
137
138
    if ($key!==false)
139
    {
140
      $column                       = $this->columns[$columns[$key]];
141
      $column['character_set_name'] = isset($column['character_set_name']) ? ' '.$column['character_set_name'] : '';
142
      $column['collation_name']     = isset($column['collation_name']) ? ' '.$column['collation_name'] : '';
143
144
      return sprintf('%s%s%s', $column['column_type'], $column['character_set_name'], $column['collation_name']);
145
    }
146
147
    return null;
148
  }
149
150
  //--------------------------------------------------------------------------------------------------------------------
151
  /**
152
   * Returns previous column of a columns. Returns null if the column name is not found in this Columns.
153
   *
154
   * @param string $columnName The column name.
155
   *
156
   * @return null|string
157
   */
158
  public function getPreviousColumn($columnName)
159
  {
160
    $columns = array_keys($this->columns);
161
    $key     = array_search($columnName, $columns);
162
163
    if ($key>=1)
164
    {
165
      return $columns[$key - 1];
166
    }
167
168
    return null;
169
  }
170
171
  //--------------------------------------------------------------------------------------------------------------------
172
}
173
174
//----------------------------------------------------------------------------------------------------------------------
175