Tokens::initialize()   B
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 26
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 26
rs 8.5806
cc 4
eloc 17
nc 4
nop 0
1
<?php
2
namespace Netdudes\DataSourceryBundle\UQL;
3
4
class Tokens
5
{
6
    public static $terminalTokens;
7
8
    public static $tokenCategories = [
9
        'GROUP_START' => ['T_BRACKET_OPEN'],
10
        'GROUP_END' => ['T_BRACKET_CLOSE'],
11
        'ARRAY_START' => ['T_ARRAY_OPEN'],
12
        'ARRAY_END' => ['T_ARRAY_CLOSE'],
13
        'ARRAY_SEPARATOR' => ['T_ARRAY_SEPARATOR'],
14
        'OPERATOR' => [
15
            'T_OP_EQ',
16
            'T_OP_NEQ',
17
            'T_OP_LT',
18
            'T_OP_GT',
19
            'T_OP_LTE',
20
            'T_OP_GTE',
21
            'T_OP_LIKE',
22
            'T_OP_IN',
23
            'T_OP_NIN',
24
        ],
25
        'LOGIC' => [
26
            'T_OP_AND',
27
            'T_OP_OR',
28
            'T_OP_XOR',
29
        ],
30
        'LITERAL' => [
31
            'T_LITERAL_TRUE',
32
            'T_LITERAL_FALSE',
33
            'T_LITERAL_EMPTY',
34
            'T_FUNCTION_CALL',
35
            'T_LITERAL'
36
        ],
37
        'IDENTIFIER' => ['T_IDENTIFIER'],
38
    ];
39
40
    public static $tokenCanonicalValues = [
41
        'T_BRACKET_OPEN' => ['('],
42
        'T_BRACKET_CLOSE' => [')'],
43
        'T_ARRAY_OPEN' => ['['],
44
        'T_ARRAY_CLOSE' => [']'],
45
        'T_ARRAY_SEPARATOR' => [','],
46
        'T_OP_NEQ' => ['!='],
47
        'T_OP_LTE' => ['<='],
48
        'T_OP_GTE' => ['>='],
49
        'T_OP_LT' => ['<'],
50
        'T_OP_GT' => ['>'],
51
        'T_OP_LIKE' => ['~'],
52
        'T_OP_EQ' => ['='],
53
        'T_OP_IN' => ['in'],
54
        'T_OP_AND' => ['and'],
55
        'T_OP_OR' => ['or'],
56
        'T_OP_XOR' => ['xor'],
57
        'T_LITERAL_FALSE' => ['false'],
58
        'T_LITERAL_TRUE' => ['true'],
59
        'T_LITERAL_EMPTY' => ['empty'],
60
    ];
61
62
    private static $baseTokens = [
63
        "/^(\\()/" => "T_BRACKET_OPEN",
64
        "/^(\\))/" => "T_BRACKET_CLOSE",
65
        "/^(\\[)/" => "T_ARRAY_OPEN",
66
        "/^(\\])/" => "T_ARRAY_CLOSE",
67
        "/^(,)/" => "T_ARRAY_SEPARATOR",
68
        "/^(AND)(\s|$)/i" => "T_LOGIC_AND",
69
        "/^(XOR)(\s|$)/i" => "T_LOGIC_XOR",
70
        "/^(OR)(\s|$)/i" => "T_LOGIC_OR",
71
        "/^(false)(\s|$)/i" => "T_LITERAL_FALSE",
72
        "/^(true)(\s|$)/i" => "T_LITERAL_TRUE",
73
        "/^(empty)(\s|$)/i" => "T_LITERAL_EMPTY",
74
        "/^([a-zA-Z0-9]+\([^\(\)]*\))/" => "T_FUNCTION_CALL",
75
        "/^([0-9]+|'[^']*'|\"[^\"]*\")/" => "T_LITERAL",
76
        "/^([a-zA-Z\\_]+)/" => "T_IDENTIFIER",
77
        "/^(\\s+)/" => "T_WHITESPACE",
78
    ];
79
80
    private static $operators = [
81
        "STRING_NEQ" => ["!=", "not", "is not"],
82
        "NUMERIC_NEQ" => ["!=", "not", "is not"],
83
        "DATETIME_NEQ" => ["!=", "<>", "not", "is not"],
84
        "NUMERIC_LTE" => ["<="],
85
        "DATETIME_LTE" => ["<="],
86
        "NUMERIC_GTE" => [">="],
87
        "DATETIME_GTE" => [">="],
88
        "NUMERIC_LT" => ["<", "less than"],
89
        "DATETIME_LT" => ["<", "before"],
90
        "NUMERIC_GT" => [">", "more than"],
91
        "DATETIME_GT" => [">", "after"],
92
        "STRING_LIKE" => ["~", "like"],
93
        "STRING_EQ" => ["=", "equals", "is"],
94
        "NUMERIC_EQ" => ["=", "equals", "is"],
95
        "DATETIME_EQ" => ["=", "on", "is", "at"],
96
        "IN" => ["in"],
97
        "NIN" => ["not in"],
98
    ];
99
100
    private static $operatorTokenAssociations = [
101
        "T_OP_IN" => ["IN"],
102
        "T_OP_NIN" => ["NIN"],
103
        "T_OP_NEQ" => ["STRING_NEQ", "NUMERIC_NEQ", "DATETIME_NEQ"],
104
        "T_OP_EQ" => ["STRING_EQ", "NUMERIC_EQ", "DATETIME_EQ"],
105
        "T_OP_GTE" => ["NUMERIC_GTE", "DATETIME_GTE"],
106
        "T_OP_GT" => ["NUMERIC_GT", "DATETIME_GT"],
107
        "T_OP_LTE" => ["NUMERIC_LTE", "DATETIME_LTE"],
108
        "T_OP_LT" => ["NUMERIC_LT", "DATETIME_LT"],
109
        "T_OP_LIKE" => ["STRING_LIKE"],
110
    ];
111
112
    /**
113
     * @var bool
114
     */
115
    private static $initialised = false;
116
117
    public static function initialize()
118
    {
119
        if (self::$initialised) {
120
            return;
121
        }
122
123
        $tokens = [];
124
        foreach (self::$operatorTokenAssociations as $token => $operators) {
125
            $strings = [];
126
            foreach ($operators as $operator) {
127
                $strings = array_merge($strings, self::$operators[$operator]);
128
            }
129
            $strings = array_unique($strings);
130
            usort(
131
                $strings,
132
                function ($a, $b) {
133
                    return strlen($a) - strlen($b);
134
                }
135
            );
136
            $regex = "/^(" . implode("|", $strings) . ")(\s|$)/i";
137
            $tokens[$regex] = $token;
138
        }
139
140
        self::$terminalTokens = array_merge($tokens, self::$baseTokens);
141
        self::$initialised = true;
142
    }
143
}
144
145
// Initialise the static class
146
Tokens::initialize();
147