Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Lexer.php
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 MIT license. For more information, see
17  * <http://www.doctrine-project.org>.
18  */
19
20 namespace 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  */
30 class 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_SOME                = 147;
102     const T_SUM                 = 148;
103     const T_THEN                = 149;
104     const T_TRAILING            = 150;
105     const T_TRUE                = 151;
106     const T_UPDATE              = 152;
107     const T_WHEN                = 153;
108     const T_WHERE               = 154;
109     const T_WITH                = 155;
110     const T_PARTIAL             = 156;
111
112     /**
113      * Creates a new query scanner object.
114      *
115      * @param string $input a query string
116      */
117     public function __construct($input)
118     {
119         $this->setInput($input);
120     }
121
122     /**
123      * @inheritdoc
124      */
125     protected function getCatchablePatterns()
126     {
127         return array(
128             '[a-z_\\\][a-z0-9_\:\\\]*[a-z0-9_]{1}',
129             '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?',
130             "'(?:[^']|'')*'",
131             '\?[0-9]*|:[a-z]{1}[a-z0-9_]{0,}'
132         );
133     }
134
135     /**
136      * @inheritdoc
137      */
138     protected function getNonCatchablePatterns()
139     {
140         return array('\s+', '(.)');
141     }
142
143     /**
144      * @inheritdoc
145      */
146     protected function getType(&$value)
147     {
148         $type = self::T_NONE;
149
150         switch (true) {
151             // Recognize numeric values
152             case (is_numeric($value)):
153                 if (strpos($value, '.') !== false || stripos($value, 'e') !== false) {
154                     return self::T_FLOAT;
155                 }
156
157                 return self::T_INTEGER;
158
159             // Recognize quoted strings
160             case ($value[0] === "'"):
161                 $value = str_replace("''", "'", substr($value, 1, strlen($value) - 2));
162
163                 return self::T_STRING;
164
165             // Recognize identifiers
166             case (ctype_alpha($value[0]) || $value[0] === '_'):
167                 $name = 'Doctrine\ORM\Query\Lexer::T_' . strtoupper($value);
168
169                 if (defined($name)) {
170                     $type = constant($name);
171
172                     if ($type > 100) {
173                         return $type;
174                     }
175                 }
176
177                 return self::T_IDENTIFIER;
178
179             // Recognize input parameters
180             case ($value[0] === '?' || $value[0] === ':'):
181                 return self::T_INPUT_PARAMETER;
182
183             // Recognize symbols
184             case ($value === '.'): return self::T_DOT;
185             case ($value === ','): return self::T_COMMA;
186             case ($value === '('): return self::T_OPEN_PARENTHESIS;
187             case ($value === ')'): return self::T_CLOSE_PARENTHESIS;
188             case ($value === '='): return self::T_EQUALS;
189             case ($value === '>'): return self::T_GREATER_THAN;
190             case ($value === '<'): return self::T_LOWER_THAN;
191             case ($value === '+'): return self::T_PLUS;
192             case ($value === '-'): return self::T_MINUS;
193             case ($value === '*'): return self::T_MULTIPLY;
194             case ($value === '/'): return self::T_DIVIDE;
195             case ($value === '!'): return self::T_NEGATE;
196             case ($value === '{'): return self::T_OPEN_CURLY_BRACE;
197             case ($value === '}'): return self::T_CLOSE_CURLY_BRACE;
198
199             // Default
200             default:
201                 // Do nothing
202         }
203
204         return $type;
205     }
206 }