svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / test / java / org / gvsig / expressionevaluator / TestGrammarCompiler.java @ 44769
History | View | Annotate | Download (13.7 KB)
1 | 44738 | jjdelcerro | package org.gvsig.expressionevaluator; |
---|---|---|---|
2 | 44139 | jjdelcerro | |
3 | import junit.framework.TestCase; |
||
4 | 44769 | jjdelcerro | import org.gvsig.expressionevaluator.impl.expressionbuilder.formatters.DALFormatter; |
5 | 44139 | jjdelcerro | import org.gvsig.tools.library.impl.DefaultLibrariesInitializer; |
6 | |||
7 | /**
|
||
8 | *
|
||
9 | * @author jjdelcerro
|
||
10 | */
|
||
11 | public class TestGrammarCompiler extends TestCase { |
||
12 | |||
13 | public TestGrammarCompiler(String testName) { |
||
14 | super(testName);
|
||
15 | } |
||
16 | |||
17 | @Override
|
||
18 | protected void setUp() throws Exception { |
||
19 | super.setUp();
|
||
20 | new DefaultLibrariesInitializer().fullInitialize();
|
||
21 | } |
||
22 | |||
23 | @Override
|
||
24 | protected void tearDown() throws Exception { |
||
25 | super.tearDown();
|
||
26 | } |
||
27 | |||
28 | // TODO add test methods here. The name must begin with 'test'. For example:
|
||
29 | // public void testHello() {}
|
||
30 | |||
31 | protected LexicalAnalyzer createLexicalAnalyzer() {
|
||
32 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
33 | LexicalAnalyzer lexer = manager.createLexicalAnalyzer(); |
||
34 | return lexer;
|
||
35 | } |
||
36 | |||
37 | protected org.gvsig.expressionevaluator.Compiler createCompiler() {
|
||
38 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
39 | Compiler compiler = manager.createCompiler();
|
||
40 | compiler.setLexicalAnalyzer(createLexicalAnalyzer()); |
||
41 | return compiler;
|
||
42 | } |
||
43 | |||
44 | protected SymbolTable createSymbolTable() {
|
||
45 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
46 | MutableSymbolTable symbolTable = manager.createSymbolTable(); |
||
47 | symbolTable.setVar("precio", 200); |
||
48 | symbolTable.setVar("1990", 0.168873933773767); |
||
49 | return symbolTable;
|
||
50 | } |
||
51 | |||
52 | protected Interpreter createInterpreter(SymbolTable symbolTable) {
|
||
53 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
54 | Interpreter interpreter = manager.createInterpreter(); |
||
55 | interpreter.setSymbolTable(symbolTable); |
||
56 | return interpreter;
|
||
57 | } |
||
58 | 44738 | jjdelcerro | |
59 | private void link(Code code) { |
||
60 | code.link(createSymbolTable()); |
||
61 | 44139 | jjdelcerro | } |
62 | |||
63 | 44738 | jjdelcerro | public void testSelect() { |
64 | StringBuilder source = new StringBuilder(); |
||
65 | source.append("SELECT * FROM countries;");
|
||
66 | 44139 | jjdelcerro | |
67 | Compiler compiler = createCompiler();
|
||
68 | |||
69 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
70 | link(code); |
||
71 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
|
72 | 44139 | jjdelcerro | } |
73 | |||
74 | 44750 | jjdelcerro | public void testSelect1() { |
75 | StringBuilder source = new StringBuilder(); |
||
76 | source.append("SELECT * FROM countries");
|
||
77 | |||
78 | Compiler compiler = createCompiler();
|
||
79 | |||
80 | Code code = compiler.compileExpression(source.toString()); |
||
81 | link(code); |
||
82 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
|
83 | 44750 | jjdelcerro | } |
84 | |||
85 | 44738 | jjdelcerro | public void testSelect2() { |
86 | StringBuilder source = new StringBuilder(); |
||
87 | source.append("BEGIN ");
|
||
88 | source.append(" SET X = 0; ");
|
||
89 | 44750 | jjdelcerro | source.append(" FOR row in (SELECT * FROM countries;) "); // Con ; |
90 | 44738 | jjdelcerro | source.append(" BEGIN ");
|
91 | source.append(" IF row.LASTCENSUS > 0 THEN ");
|
||
92 | source.append(" SET X = X + row.LASTCENSUS ");
|
||
93 | source.append(" END IF ");
|
||
94 | source.append(" END FOR ");
|
||
95 | source.append("END");
|
||
96 | 44384 | jjdelcerro | |
97 | Compiler compiler = createCompiler();
|
||
98 | |||
99 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
100 | link(code); |
||
101 | 44769 | jjdelcerro | assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
|
102 | 44384 | jjdelcerro | } |
103 | |||
104 | 44750 | jjdelcerro | public void testSelect3() { |
105 | StringBuilder source = new StringBuilder(); |
||
106 | source.append("BEGIN ");
|
||
107 | source.append(" SET X = 0; ");
|
||
108 | source.append(" FOR row in (SELECT * FROM countries) "); // Sin ; |
||
109 | source.append(" BEGIN ");
|
||
110 | source.append(" IF row.LASTCENSUS > 0 THEN ");
|
||
111 | source.append(" SET X = X + row.LASTCENSUS ");
|
||
112 | source.append(" END IF ");
|
||
113 | source.append(" END FOR ");
|
||
114 | source.append("END");
|
||
115 | |||
116 | Compiler compiler = createCompiler();
|
||
117 | |||
118 | Code code = compiler.compileExpression(source.toString()); |
||
119 | link(code); |
||
120 | 44769 | jjdelcerro | assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
|
121 | 44750 | jjdelcerro | } |
122 | |||
123 | 44738 | jjdelcerro | public void testSelectWhere() { |
124 | StringBuilder source = new StringBuilder(); |
||
125 | source.append("SELECT * FROM countries ");
|
||
126 | source.append(" WHERE LASTCENSUS > 0; ");
|
||
127 | 44139 | jjdelcerro | |
128 | Compiler compiler = createCompiler();
|
||
129 | |||
130 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
131 | link(code); |
||
132 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", (\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
|
133 | 44139 | jjdelcerro | } |
134 | |||
135 | 44738 | jjdelcerro | public void testSelectCountWhere() { |
136 | StringBuilder source = new StringBuilder(); |
||
137 | source.append("SELECT COUNT(*) FROM countries ");
|
||
138 | source.append(" WHERE LASTCENSUS > 0 ; ");
|
||
139 | 44384 | jjdelcerro | |
140 | Compiler compiler = createCompiler();
|
||
141 | |||
142 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
143 | link(code); |
||
144 | 44750 | jjdelcerro | assertEquals("SELECT_COUNT(\"countries\", (\"LASTCENSUS\" > 0))", code.toString());
|
145 | 44384 | jjdelcerro | } |
146 | |||
147 | 44738 | jjdelcerro | public void testSelectWhere2() { |
148 | StringBuilder source = new StringBuilder(); |
||
149 | source.append("SELECT * FROM countries ");
|
||
150 | source.append(" WHERE countries.LASTCENSUS > 0 ; ");
|
||
151 | 44139 | jjdelcerro | |
152 | Compiler compiler = createCompiler();
|
||
153 | |||
154 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
155 | link(code); |
||
156 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
|
157 | 44139 | jjdelcerro | } |
158 | |||
159 | 44738 | jjdelcerro | public void testSelectOrder() { |
160 | StringBuilder source = new StringBuilder(); |
||
161 | source.append("SELECT * FROM countries ");
|
||
162 | source.append(" ORDER BY CONTINENT ASC, LASTCENSUS DESC; ");
|
||
163 | 44139 | jjdelcerro | |
164 | Compiler compiler = createCompiler();
|
||
165 | |||
166 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
167 | link(code); |
||
168 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(\"CONTINENT\", \"LASTCENSUS\"), TUPLE(TRUE, FALSE), NULL)", code.toString());
|
169 | 44139 | jjdelcerro | } |
170 | |||
171 | 44738 | jjdelcerro | public void testSelectWhereOrder() { |
172 | StringBuilder source = new StringBuilder(); |
||
173 | source.append("SELECT * FROM countries ");
|
||
174 | source.append(" WHERE LASTCENSUS > 0 ");
|
||
175 | source.append(" ORDER BY ID ; ");
|
||
176 | 44139 | jjdelcerro | |
177 | Compiler compiler = createCompiler();
|
||
178 | |||
179 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
180 | link(code); |
||
181 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"ID\"), TUPLE(TRUE), NULL)", code.toString());
|
182 | 44139 | jjdelcerro | } |
183 | |||
184 | 44738 | jjdelcerro | public void testSelectWhereOrderLimit() { |
185 | StringBuilder source = new StringBuilder(); |
||
186 | source.append("SELECT * FROM countries ");
|
||
187 | source.append(" WHERE LASTCENSUS > 0 ");
|
||
188 | source.append(" ORDER BY LASTCENSUS DESC");
|
||
189 | source.append(" LIMIT 3 ;");
|
||
190 | 44139 | jjdelcerro | |
191 | Compiler compiler = createCompiler();
|
||
192 | |||
193 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
194 | link(code); |
||
195 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"LASTCENSUS\"), TUPLE(FALSE), 3)", code.toString());
|
196 | 44139 | jjdelcerro | } |
197 | |||
198 | 44738 | jjdelcerro | public void testSelectLimit() { |
199 | StringBuilder source = new StringBuilder(); |
||
200 | source.append("SELECT * FROM countries ");
|
||
201 | source.append(" LIMIT 3; ");
|
||
202 | 44139 | jjdelcerro | |
203 | Compiler compiler = createCompiler();
|
||
204 | |||
205 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
206 | link(code); |
||
207 | 44769 | jjdelcerro | assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), 3)", code.toString());
|
208 | 44139 | jjdelcerro | } |
209 | |||
210 | 44738 | jjdelcerro | public void testExists() { |
211 | StringBuilder source = new StringBuilder(); |
||
212 | source.append("EXISTS(NULL)");
|
||
213 | 44139 | jjdelcerro | |
214 | Compiler compiler = createCompiler();
|
||
215 | |||
216 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
217 | link(code); |
||
218 | String id = "????????????????????????????????"; |
||
219 | String s = code.toString();
|
||
220 | s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2); |
||
221 | 44748 | jjdelcerro | assertEquals("EXISTS(NULL, 'EXISTS????????????????????????????????')", s);
|
222 | 44139 | jjdelcerro | } |
223 | |||
224 | 44738 | jjdelcerro | public void testExistsSelect1() { |
225 | StringBuilder source = new StringBuilder(); |
||
226 | source.append("EXISTS(");
|
||
227 | 44769 | jjdelcerro | source.append(" SELECT \"ISO_A2\" FROM countries");
|
228 | 44738 | jjdelcerro | source.append(" WHERE countries.LASTCENSUS > 0 ; ");
|
229 | source.append(")");
|
||
230 | 44139 | jjdelcerro | |
231 | Compiler compiler = createCompiler();
|
||
232 | |||
233 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
234 | link(code); |
||
235 | String id = "????????????????????????????????"; |
||
236 | String s = code.toString();
|
||
237 | s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2); |
||
238 | 44769 | jjdelcerro | assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
|
239 | 44139 | jjdelcerro | } |
240 | |||
241 | 44750 | jjdelcerro | public void testExistsSelect2() { |
242 | StringBuilder source = new StringBuilder(); |
||
243 | source.append("EXISTS(");
|
||
244 | 44769 | jjdelcerro | source.append(" SELECT \"ISO_A2\" FROM countries");
|
245 | 44750 | jjdelcerro | source.append(" WHERE countries.LASTCENSUS > 0 ");
|
246 | source.append(")");
|
||
247 | |||
248 | Compiler compiler = createCompiler();
|
||
249 | |||
250 | Code code = compiler.compileExpression(source.toString()); |
||
251 | link(code); |
||
252 | String id = "????????????????????????????????"; |
||
253 | String s = code.toString();
|
||
254 | s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2); |
||
255 | 44769 | jjdelcerro | assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
|
256 | 44750 | jjdelcerro | } |
257 | |||
258 | 44738 | jjdelcerro | public void testExistsSelectLimit1() { |
259 | StringBuilder source = new StringBuilder(); |
||
260 | source.append("EXISTS(");
|
||
261 | 44769 | jjdelcerro | source.append(" SELECT \"ISO_A2\" FROM countries ");
|
262 | 44738 | jjdelcerro | source.append(" WHERE countries.LASTCENSUS > 0 ");
|
263 | source.append(" LIMIT 1; ");
|
||
264 | source.append(")");
|
||
265 | 44139 | jjdelcerro | |
266 | Compiler compiler = createCompiler();
|
||
267 | |||
268 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
269 | link(code); |
||
270 | String id = "????????????????????????????????"; |
||
271 | String s = code.toString();
|
||
272 | s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2); |
||
273 | 44769 | jjdelcerro | assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
|
274 | 44139 | jjdelcerro | } |
275 | |||
276 | 44738 | jjdelcerro | public void testExistsSelectLimit2() { |
277 | // Sobre la tabla de continentes, para obtener la lista de continentes
|
||
278 | // que tienen paises sin censo.
|
||
279 | // Filtramos continentes por un campo del pais.
|
||
280 | StringBuilder source = new StringBuilder(); |
||
281 | source.append("EXISTS(");
|
||
282 | 44769 | jjdelcerro | source.append(" SELECT \"ISO_A2\" FROM countries");
|
283 | 44738 | jjdelcerro | source.append(" WHERE ");
|
284 | source.append(" continents.NAME = countries.CONTINENT AND ");
|
||
285 | source.append(" countries.LASTCENSUS < 0 ");
|
||
286 | source.append(" LIMIT 1; ");
|
||
287 | source.append(")");
|
||
288 | 44139 | jjdelcerro | |
289 | Compiler compiler = createCompiler();
|
||
290 | |||
291 | 44738 | jjdelcerro | Code code = compiler.compileExpression(source.toString()); |
292 | link(code); |
||
293 | String id = "????????????????????????????????"; |
||
294 | String s = code.toString();
|
||
295 | s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2); |
||
296 | 44769 | jjdelcerro | assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
|
297 | 44139 | jjdelcerro | } |
298 | |||
299 | 44748 | jjdelcerro | public void testExistsSelectLimit3() { |
300 | // Sobre la tabla de continentes, para obtener la lista de continentes
|
||
301 | // que tienen paises sin censo.
|
||
302 | // Filtramos continentes por un campo del pais.
|
||
303 | StringBuilder source = new StringBuilder(); |
||
304 | source.append("EXISTS(");
|
||
305 | 44769 | jjdelcerro | source.append(" SELECT \"ISO_A2\" FROM countries");
|
306 | 44748 | jjdelcerro | source.append(" WHERE ");
|
307 | source.append(" continents.NAME = countries.CONTINENT AND ");
|
||
308 | source.append(" countries.LASTCENSUS < 0 ");
|
||
309 | 44750 | jjdelcerro | source.append(" LIMIT 1 ");
|
310 | 44748 | jjdelcerro | source.append(" ,");
|
311 | source.append(" 'patata'");
|
||
312 | source.append(")");
|
||
313 | |||
314 | Compiler compiler = createCompiler();
|
||
315 | |||
316 | Code code = compiler.compileExpression(source.toString()); |
||
317 | link(code); |
||
318 | 44769 | jjdelcerro | assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'patata')", code.toString());
|
319 | 44748 | jjdelcerro | } |
320 | |||
321 | public void testExistsSelectLimit4() { |
||
322 | StringBuilder source = new StringBuilder(); |
||
323 | source.append("EXISTS(");
|
||
324 | source.append(" SELECT(");
|
||
325 | 44769 | jjdelcerro | source.append(" TUPLE(\"ISO_A2\"), ");
|
326 | 44750 | jjdelcerro | source.append(" countries, ");
|
327 | source.append(" (countries.LASTCENSUS > 0), ");
|
||
328 | source.append(" TUPLE(), ");
|
||
329 | source.append(" TUPLE(), ");
|
||
330 | source.append(" 1 ");
|
||
331 | 44748 | jjdelcerro | source.append(" ) ");
|
332 | source.append(" , ");
|
||
333 | source.append(" 'EXISTS1234567890ABCDEFGHHIJKLMNOPQRSTU' ");
|
||
334 | source.append(") ");
|
||
335 | |||
336 | Compiler compiler = createCompiler();
|
||
337 | |||
338 | Code code = compiler.compileExpression(source.toString()); |
||
339 | link(code); |
||
340 | String id = "????????????????????????????????"; |
||
341 | String s = code.toString();
|
||
342 | s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2); |
||
343 | 44769 | jjdelcerro | assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
|
344 | 44748 | jjdelcerro | } |
345 | |||
346 | 44139 | jjdelcerro | } |