Completed
Push — master ( 06b8db...4cfd67 )
by Sam
02:00
created

Variable::getAlignment()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 3
c 1
b 0
f 0
nc 3
nop 0
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 3
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 1005
    public function __construct($data = [])
92
    {
93 1005
        foreach ($data as $key => $value) {
94 1005
            $this->{$key} = $value;
95
        }
96 1005
    }
97
98
    /**
99
     * @param int $format
100
     * @return bool
101
     */
102 1004
    public static function isNumberFormat($format)
103
    {
104 1004
        return in_array($format, [
105 1004
            self::FORMAT_TYPE_COMMA,
106 1004
            self::FORMAT_TYPE_F,
107 1004
            self::FORMAT_TYPE_DATETIME
108
        ]);
109
    }
110
111
    /**
112
     * This method returns the print / write format code of a variable.
113
     * The returned value is a tuple consisting of the format abbreviation
114
     * (string <= 8 chars) and a meaning (long string).
115
     * Non-existent codes have a (null, null) tuple returned.
116
     *
117
     * @param integer $format
118
     * @return array
119
     */
120
    public static function getFormatInfo($format)
121
    {
122
        switch ($format) {
123
            case 0:
124
                return ['', 'Continuation of string variable'];
125
            case self::FORMAT_TYPE_A:
126
                return ['A', 'Alphanumeric'];
127
            case self::FORMAT_TYPE_AHEX:
128
                return ['AHEX', 'alphanumeric hexadecimal'];
129
            case self::FORMAT_TYPE_COMMA:
130
                return ['COMMA', 'F format with commas'];
131
            case self::FORMAT_TYPE_DOLLAR:
132
                return ['DOLLAR', 'Commas and floating point dollar sign'];
133
            case self::FORMAT_TYPE_F:
134
                return ['F', 'F (default numeric) format'];
135
            case self::FORMAT_TYPE_IB:
136
                return ['IB', 'Integer binary'];
137
            case self::FORMAT_TYPE_PIBHEX:
138
                return ['PIBHEX', 'Positive binary integer - hexadecimal'];
139
            case self::FORMAT_TYPE_P:
140
                return ['P', 'Packed decimal'];
141
            case self::FORMAT_TYPE_PIB:
142
                return ['PIB', 'Positive integer binary (Unsigned)'];
143
            case self::FORMAT_TYPE_PK:
144
                return ['PK', 'Positive packed decimal (Unsigned)'];
145
            case self::FORMAT_TYPE_RB:
146
                return ['RB', 'Floating point binary'];
147
            case self::FORMAT_TYPE_RBHEX:
148
                return ['RBHEX', 'Floating point binary - hexadecimal'];
149
            case self::FORMAT_TYPE_Z:
150
                return ['Z', 'Zoned decimal'];
151
            case self::FORMAT_TYPE_N:
152
                return ['N', 'N format - unsigned with leading zeros'];
153
            case self::FORMAT_TYPE_E:
154
                return ['E', 'E format - with explicit power of ten'];
155
            case self::FORMAT_TYPE_DATE:
156
                return ['DATE', 'Date format dd-mmm-yyyy'];
157
            case self::FORMAT_TYPE_TIME:
158
                return ['TIME', 'Time format hh:mm:ss.s'];
159
            case self::FORMAT_TYPE_DATETIME:
160
                return ['DATETIME', 'Date and time'];
161
            case self::FORMAT_TYPE_ADATE:
162
                return ['ADATE', 'Date in mm/dd/yyyy form'];
163
            case self::FORMAT_TYPE_JDATE:
164
                return ['JDATE', 'Julian date - yyyyddd'];
165
            case self::FORMAT_TYPE_DTIME:
166
                return ['DTIME', 'Date-time dd hh:mm:ss.s'];
167
            case self::FORMAT_TYPE_WKDAY:
168
                return ['WKDAY', 'Day of the week'];
169
            case self::FORMAT_TYPE_MONTH:
170
                return ['MONTH', 'Month'];
171
            case self::FORMAT_TYPE_MOYR:
172
                return ['MOYR', 'mmm yyyy'];
173
            case self::FORMAT_TYPE_QYR:
174
                return ['QYR', 'q Q yyyy'];
175
            case self::FORMAT_TYPE_WKYR:
176
                return ['WKYR', 'ww WK yyyy'];
177
            case self::FORMAT_TYPE_PCT:
178
                return ['PCT', 'Percent - F followed by "%"'];
179
            case self::FORMAT_TYPE_DOT:
180
                return ['DOT', 'Like COMMA, switching dot for comma'];
181
            case self::FORMAT_TYPE_CCA:
182
                return ['CCA', 'User-programmable currency format (1)'];
183
            case self::FORMAT_TYPE_CCB:
184
                return ['CCB', 'User-programmable currency format (2)'];
185
            case self::FORMAT_TYPE_CCC:
186
                return ['CCC', 'User-programmable currency format (3)'];
187
            case self::FORMAT_TYPE_CCD:
188
                return ['CCD', 'User-programmable currency format (4)'];
189
            case self::FORMAT_TYPE_CCE:
190
                return ['CCE', 'User-programmable currency format (5)'];
191
            case self::FORMAT_TYPE_EDATE:
192
                return ['EDATE', 'Date in dd.mm.yyyy style'];
193
            case self::FORMAT_TYPE_SDATE:
194
                return ['SDATE', 'Date in yyyy/mm/dd style'];
195
        }
196
197
        return [null, null];
198
    }
199
200
    /**
201
     * @param int $alignment
202
     * @return string
203
     */
204
    public static function alignmentToString($alignment)
205
    {
206
        switch ($alignment) {
207
            case self::ALIGN_LEFT:
208
                return 'Left';
209
            case self::ALIGN_RIGHT:
210
                return 'Right';
211
            case self::ALIGN_CENTER:
212
                return 'Center';
213
        }
214
215
        return 'Invalid';
216
    }
217
218
    /**
219
     * @return int
220
     */
221 1005
    public function getMeasure()
222
    {
223 1005
        if ($this->measure !== null) {
224 1002
            return $this->measure;
225
        }
226
227 3
        return $this->width == 0 ? self::MEASURE_UNKNOWN : self::MEASURE_NOMINAL;
228
    }
229
230
    /**
231
     * @return int
232
     */
233 1005
    public function getAlignment()
234
    {
235 1005
        if ($this->alignment !== null) {
236 1002
            return $this->alignment;
237
        }
238
239 3
        return $this->width == 0 ? self::ALIGN_RIGHT : self::ALIGN_LEFT;
240
    }
241
242
    /**
243
     * @return int
244
     */
245 1005
    public function getColumns()
246
    {
247 1005
        if ($this->columns !== null) {
248 1002
            return $this->columns;
249
        }
250
251 3
        return 8;
252
    }
253
}
254