source: pro-violet-viettel/sourcecode/application/libraries/Doctrine/ORM/Query/Lexer.php @ 345

Last change on this file since 345 was 345, checked in by quyenla, 11 years ago

collaborator page

File size: 7.1 KB
Line 
1<?php
2/*
3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14 *
15 * This software consists of voluntary contributions made by many individuals
16 * and is licensed under the LGPL. For more information, see
17 * <http://www.doctrine-project.org>.
18 */
19
20namespace Doctrine\ORM\Query;
21
22/**
23 * Scans a DQL query for tokens.
24 *
25 * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
26 * @author Janne Vanhala <jpvanhal@cc.hut.fi>
27 * @author Roman Borschel <roman@code-factory.org>
28 * @since 2.0
29 */
30class Lexer extends \Doctrine\Common\Lexer
31{
32    // All tokens that are not valid identifiers must be < 100
33    const T_NONE                = 1;
34    const T_INTEGER             = 2;
35    const T_STRING              = 3;
36    const T_INPUT_PARAMETER     = 4;
37    const T_FLOAT               = 5;
38    const T_CLOSE_PARENTHESIS   = 6;
39    const T_OPEN_PARENTHESIS    = 7;
40    const T_COMMA               = 8;
41    const T_DIVIDE              = 9;
42    const T_DOT                 = 10;
43    const T_EQUALS              = 11;
44    const T_GREATER_THAN        = 12;
45    const T_LOWER_THAN          = 13;
46    const T_MINUS               = 14;
47    const T_MULTIPLY            = 15;
48    const T_NEGATE              = 16;
49    const T_PLUS                = 17;
50    const T_OPEN_CURLY_BRACE    = 18;
51    const T_CLOSE_CURLY_BRACE   = 19;
52
53    // All tokens that are also identifiers should be >= 100
54    const T_IDENTIFIER          = 100;
55    const T_ALL                 = 101;
56    const T_AND                 = 102;
57    const T_ANY                 = 103;
58    const T_AS                  = 104;
59    const T_ASC                 = 105;
60    const T_AVG                 = 106;
61    const T_BETWEEN             = 107;
62    const T_BOTH                = 108;
63    const T_BY                  = 109;
64    const T_CASE                = 110;
65    const T_COALESCE            = 111;
66    const T_COUNT               = 112;
67    const T_DELETE              = 113;
68    const T_DESC                = 114;
69    const T_DISTINCT            = 115;
70    const T_ELSE                = 116;
71    const T_EMPTY               = 117;
72    const T_END                 = 118;
73    const T_ESCAPE              = 119;
74    const T_EXISTS              = 120;
75    const T_FALSE               = 121;
76    const T_FROM                = 122;
77    const T_GROUP               = 123;
78    const T_HAVING              = 124;
79    const T_HIDDEN              = 125;
80    const T_IN                  = 126;
81    const T_INDEX               = 127;
82    const T_INNER               = 128;
83    const T_INSTANCE            = 129;
84    const T_IS                  = 130;
85    const T_JOIN                = 131;
86    const T_LEADING             = 132;
87    const T_LEFT                = 133;
88    const T_LIKE                = 134;
89    const T_MAX                 = 135;
90    const T_MEMBER              = 136;
91    const T_MIN                 = 137;
92    const T_NOT                 = 138;
93    const T_NULL                = 139;
94    const T_NULLIF              = 140;
95    const T_OF                  = 141;
96    const T_OR                  = 142;
97    const T_ORDER               = 143;
98    const T_OUTER               = 144;
99    const T_SELECT              = 145;
100    const T_SET                 = 146;
101    const T_SIZE                = 147;
102    const T_SOME                = 148;
103    const T_SUM                 = 149;
104    const T_THEN                = 150;
105    const T_TRAILING            = 151;
106    const T_TRUE                = 152;
107    const T_UPDATE              = 153;
108    const T_WHEN                = 154;
109    const T_WHERE               = 155;
110    const T_WITH                = 156;
111    const T_PARTIAL             = 157;
112    const T_MOD                 = 158;
113
114    /**
115     * Creates a new query scanner object.
116     *
117     * @param string $input a query string
118     */
119    public function __construct($input)
120    {
121        $this->setInput($input);
122    }
123
124    /**
125     * @inheritdoc
126     */
127    protected function getCatchablePatterns()
128    {
129        return array(
130            '[a-z_\\\][a-z0-9_\:\\\]*[a-z0-9_]{1}',
131            '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?',
132            "'(?:[^']|'')*'",
133            '\?[0-9]*|:[a-z]{1}[a-z0-9_]{0,}'
134        );
135    }
136
137    /**
138     * @inheritdoc
139     */
140    protected function getNonCatchablePatterns()
141    {
142        return array('\s+', '(.)');
143    }
144
145    /**
146     * @inheritdoc
147     */
148    protected function getType(&$value)
149    {
150        $type = self::T_NONE;
151
152        switch (true) {
153            // Recognize numeric values
154            case (is_numeric($value)):
155                if (strpos($value, '.') !== false || stripos($value, 'e') !== false) {
156                    return self::T_FLOAT;
157                }
158
159                return self::T_INTEGER;
160
161            // Recognize quoted strings
162            case ($value[0] === "'"):
163                $value = str_replace("''", "'", substr($value, 1, strlen($value) - 2));
164
165                return self::T_STRING;
166
167            // Recognize identifiers
168            case (ctype_alpha($value[0]) || $value[0] === '_'):
169                $name = 'Doctrine\ORM\Query\Lexer::T_' . strtoupper($value);
170
171                if (defined($name)) {
172                    $type = constant($name);
173
174                    if ($type > 100) {
175                        return $type;
176                    }
177                }
178
179                return self::T_IDENTIFIER;
180
181            // Recognize input parameters
182            case ($value[0] === '?' || $value[0] === ':'):
183                return self::T_INPUT_PARAMETER;
184
185            // Recognize symbols
186            case ($value === '.'): return self::T_DOT;
187            case ($value === ','): return self::T_COMMA;
188            case ($value === '('): return self::T_OPEN_PARENTHESIS;
189            case ($value === ')'): return self::T_CLOSE_PARENTHESIS;
190            case ($value === '='): return self::T_EQUALS;
191            case ($value === '>'): return self::T_GREATER_THAN;
192            case ($value === '<'): return self::T_LOWER_THAN;
193            case ($value === '+'): return self::T_PLUS;
194            case ($value === '-'): return self::T_MINUS;
195            case ($value === '*'): return self::T_MULTIPLY;
196            case ($value === '/'): return self::T_DIVIDE;
197            case ($value === '!'): return self::T_NEGATE;
198            case ($value === '{'): return self::T_OPEN_CURLY_BRACE;
199            case ($value === '}'): return self::T_CLOSE_CURLY_BRACE;
200
201            // Default
202            default:
203                // Do nothing
204        }
205
206        return $type;
207    }
208}
Note: See TracBrowser for help on using the repository browser.