Completed
Push — master ( dd1269...21c3dd )
by Sam
02:11
created

Variable::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 2
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 2
rs 10
1
<?php
2
3
namespace SPSS\Sav;
4
5
class Variable
6
{
7
    // const TYPE_NUMERIC = 1;
8
    // const TYPE_STRING = 2;
9
10
    const FORMAT_TYPE_A = 1;
11
    const FORMAT_TYPE_AHEX = 2;
12
    const FORMAT_TYPE_COMMA = 3;
13
    const FORMAT_TYPE_DOLLAR = 4;
14
    const FORMAT_TYPE_F = 5;
15
    const FORMAT_TYPE_IB = 6;
16
    const FORMAT_TYPE_PIBHEX = 7;
17
    const FORMAT_TYPE_P = 8;
18
    const FORMAT_TYPE_PIB = 9;
19
    const FORMAT_TYPE_PK = 10;
20
    const FORMAT_TYPE_RB = 11;
21
    const FORMAT_TYPE_RBHEX = 12;
22
    const FORMAT_TYPE_Z = 15;
23
    const FORMAT_TYPE_N = 16;
24
    const FORMAT_TYPE_E = 17;
25
    const FORMAT_TYPE_DATE = 20;
26
    const FORMAT_TYPE_TIME = 21;
27
    const FORMAT_TYPE_DATETIME = 22;
28
    const FORMAT_TYPE_ADATE = 23;
29
    const FORMAT_TYPE_JDATE = 24;
30
    const FORMAT_TYPE_DTIME = 25;
31
    const FORMAT_TYPE_WKDAY = 26;
32
    const FORMAT_TYPE_MONTH = 27;
33
    const FORMAT_TYPE_MOYR = 28;
34
    const FORMAT_TYPE_QYR = 29;
35
    const FORMAT_TYPE_WKYR = 30;
36
    const FORMAT_TYPE_PCT = 31;
37
    const FORMAT_TYPE_DOT = 32;
38
    const FORMAT_TYPE_CCA = 33;
39
    const FORMAT_TYPE_CCB = 34;
40
    const FORMAT_TYPE_CCC = 35;
41
    const FORMAT_TYPE_CCD = 36;
42
    const FORMAT_TYPE_CCE = 37;
43
    const FORMAT_TYPE_EDATE = 38;
44
    const FORMAT_TYPE_SDATE = 39;
45
46
    const ALIGN_LEFT = 0;
47
    const ALIGN_RIGHT = 1;
48
    const ALIGN_CENTER = 2;
49
50
    const MEASURE_UNKNOWN = 0;
51
    const MEASURE_NOMINAL = 1;
52
    const MEASURE_ORDINAL = 2;
53
    const MEASURE_SCALE = 3;
54
55
    const ROLE_INPUT = 0;
56
    const ROLE_TARGET = 1;
57
    const ROLE_BOTH = 2;
58
    const ROLE_NONE = 3;
59
    const ROLE_PARTITION = 4;
60
    const ROLE_SPLIT = 5;
61
62
    public $name;
63
    public $width = 8;
64
    public $decimals = 0;
65
    public $format = 0;
66
    public $columns;
67
    public $alignment;
68
    public $measure;
69
    public $role;
70
    public $label;
71
    public $values = [];
72
    public $missing = [];
73
74
    /**
75
     * @var array
76
     */
77
    public $attributes = [
78
        // '$@Role' => self::ROLE_BOTH
79
    ];
80
81
    /**
82
     * @var array
83
     */
84
    public $data = [];
85
86
    /**
87
     * Variable constructor.
88
     *
89
     * @param array $data
90
     */
91 5
    public function __construct($data = [])
92
    {
93 5
        foreach ($data as $key => $value) {
94 5
            $this->{$key} = $value;
95
        }
96 5
    }
97
98
    /**
99
     * @param int $format
100
     * @return bool
101
     */
102 3
    public static function isNumberFormat($format)
103
    {
104 3
        return in_array($format, [
105 3
            self::FORMAT_TYPE_COMMA,
106 3
            self::FORMAT_TYPE_F,
107
        ]);
108
    }
109
110
    /**
111
     * This method returns the print / write format code of a variable.
112
     * The returned value is a tuple consisting of the format abbreviation
113
     * (string <= 8 chars) and a meaning (long string).
114
     * Non-existent codes have a (null, null) tuple returned.
115
     *
116
     * @param integer $format
117
     * @return array
118
     */
119
    public static function getFormatInfo($format)
120
    {
121
        switch ($format) {
122
            case 0:
123
                return ['', 'Continuation of string variable'];
124
            case self::FORMAT_TYPE_A:
125
                return ['A', 'Alphanumeric'];
126
            case self::FORMAT_TYPE_AHEX:
127
                return ['AHEX', 'alphanumeric hexadecimal'];
128
            case self::FORMAT_TYPE_COMMA:
129
                return ['COMMA', 'F format with commas'];
130
            case self::FORMAT_TYPE_DOLLAR:
131
                return ['DOLLAR', 'Commas and floating point dollar sign'];
132
            case self::FORMAT_TYPE_F:
133
                return ['F', 'F (default numeric) format'];
134
            case self::FORMAT_TYPE_IB:
135
                return ['IB', 'Integer binary'];
136
            case self::FORMAT_TYPE_PIBHEX:
137
                return ['PIBHEX', 'Positive binary integer - hexadecimal'];
138
            case self::FORMAT_TYPE_P:
139
                return ['P', 'Packed decimal'];
140
            case self::FORMAT_TYPE_PIB:
141
                return ['PIB', 'Positive integer binary (Unsigned)'];
142
            case self::FORMAT_TYPE_PK:
143
                return ['PK', 'Positive packed decimal (Unsigned)'];
144
            case self::FORMAT_TYPE_RB:
145
                return ['RB', 'Floating point binary'];
146
            case self::FORMAT_TYPE_RBHEX:
147
                return ['RBHEX', 'Floating point binary - hexadecimal'];
148
            case self::FORMAT_TYPE_Z:
149
                return ['Z', 'Zoned decimal'];
150
            case self::FORMAT_TYPE_N:
151
                return ['N', 'N format - unsigned with leading zeros'];
152
            case self::FORMAT_TYPE_E:
153
                return ['E', 'E format - with explicit power of ten'];
154
            case self::FORMAT_TYPE_DATE:
155
                return ['DATE', 'Date format dd-mmm-yyyy'];
156
            case self::FORMAT_TYPE_TIME:
157
                return ['TIME', 'Time format hh:mm:ss.s'];
158
            case self::FORMAT_TYPE_DATETIME:
159
                return ['DATETIME', 'Date and time'];
160
            case self::FORMAT_TYPE_ADATE:
161
                return ['ADATE', 'Date in mm/dd/yyyy form'];
162
            case self::FORMAT_TYPE_JDATE:
163
                return ['JDATE', 'Julian date - yyyyddd'];
164
            case self::FORMAT_TYPE_DTIME:
165
                return ['DTIME', 'Date-time dd hh:mm:ss.s'];
166
            case self::FORMAT_TYPE_WKDAY:
167
                return ['WKDAY', 'Day of the week'];
168
            case self::FORMAT_TYPE_MONTH:
169
                return ['MONTH', 'Month'];
170
            case self::FORMAT_TYPE_MOYR:
171
                return ['MOYR', 'mmm yyyy'];
172
            case self::FORMAT_TYPE_QYR:
173
                return ['QYR', 'q Q yyyy'];
174
            case self::FORMAT_TYPE_WKYR:
175
                return ['WKYR', 'ww WK yyyy'];
176
            case self::FORMAT_TYPE_PCT:
177
                return ['PCT', 'Percent - F followed by "%"'];
178
            case self::FORMAT_TYPE_DOT:
179
                return ['DOT', 'Like COMMA, switching dot for comma'];
180
            case self::FORMAT_TYPE_CCA:
181
                return ['CCA', 'User-programmable currency format (1)'];
182
            case self::FORMAT_TYPE_CCB:
183
                return ['CCB', 'User-programmable currency format (2)'];
184
            case self::FORMAT_TYPE_CCC:
185
                return ['CCC', 'User-programmable currency format (3)'];
186
            case self::FORMAT_TYPE_CCD:
187
                return ['CCD', 'User-programmable currency format (4)'];
188
            case self::FORMAT_TYPE_CCE:
189
                return ['CCE', 'User-programmable currency format (5)'];
190
            case self::FORMAT_TYPE_EDATE:
191
                return ['EDATE', 'Date in dd.mm.yyyy style'];
192
            case self::FORMAT_TYPE_SDATE:
193
                return ['SDATE', 'Date in yyyy/mm/dd style'];
194
        }
195
196
        return [null, null];
197
    }
198
199
    /**
200
     * @param int $alignment
201
     * @return string
202
     */
203
    public static function alignmentToString($alignment)
204
    {
205
        switch ($alignment) {
206
            case self::ALIGN_LEFT:
207
                return 'Left';
208
            case self::ALIGN_RIGHT:
209
                return 'Right';
210
            case self::ALIGN_CENTER:
211
                return 'Center';
212
        }
213
214
        return 'Invalid';
215
    }
216
217
    /**
218
     * @return int
219
     */
220 5
    public function getMeasure()
221
    {
222 5
        if ($this->measure !== null) {
223 2
            return $this->measure;
224
        }
225
226 3
        return $this->width == 0 ? self::MEASURE_UNKNOWN : self::MEASURE_NOMINAL;
227
    }
228
229
    /**
230
     * @return int
231
     */
232 5
    public function getAlignment()
233
    {
234 5
        if ($this->alignment !== null) {
235 2
            return $this->alignment;
236
        }
237
238 3
        return $this->width == 0 ? self::ALIGN_RIGHT : self::ALIGN_LEFT;
239
    }
240
241
    /**
242
     * @return int
243
     */
244 5
    public function getColumns()
245
    {
246 5
        if ($this->columns !== null) {
247 2
            return $this->columns;
248
        }
249
250 3
        return 8;
251
    }
252
}
253