Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / test / java / org / gvsig / expresionevaluator / impl / TestOptimizer.java @ 44644

History | View | Annotate | Download (13.8 KB)

1 43512 jjdelcerro
package org.gvsig.expresionevaluator.impl;
2
3
import org.gvsig.expressionevaluator.impl.SQLLexicalAnalyzer;
4
import junit.framework.TestCase;
5
import org.gvsig.expressionevaluator.LexicalAnalyzer;
6
import org.gvsig.expressionevaluator.Compiler;
7
import org.gvsig.expressionevaluator.Code;
8 44009 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionBuilder;
9 44644 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionUtils;
10 44009 jjdelcerro
import org.gvsig.expressionevaluator.Interpreter;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12
import org.gvsig.expressionevaluator.Optimizer;
13
import org.gvsig.expressionevaluator.SymbolTable;
14
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
15 43512 jjdelcerro
16 44009 jjdelcerro
public class TestOptimizer extends TestCase {
17 43512 jjdelcerro
18 44009 jjdelcerro
    public TestOptimizer(String testName) {
19 43512 jjdelcerro
        super(testName);
20
    }
21 44009 jjdelcerro
22 43512 jjdelcerro
    @Override
23
    protected void setUp() throws Exception {
24
        super.setUp();
25 44009 jjdelcerro
        new DefaultLibrariesInitializer().fullInitialize();
26 43512 jjdelcerro
    }
27 44009 jjdelcerro
28 43512 jjdelcerro
    @Override
29
    protected void tearDown() throws Exception {
30
        super.tearDown();
31
    }
32
33
    // TODO add test methods here. The name must begin with 'test'. For example:
34
    // public void testHello() {}
35
    protected LexicalAnalyzer createLexicalAnalyzer() {
36
        SQLLexicalAnalyzer lexer = new SQLLexicalAnalyzer();
37
        return lexer;
38
    }
39 44009 jjdelcerro
40 43512 jjdelcerro
    protected Compiler createCompiler() {
41 44644 jjdelcerro
        Compiler compiler = ExpressionUtils.createCompiler();
42 43512 jjdelcerro
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
43
        return compiler;
44
    }
45 44009 jjdelcerro
46
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
47 44644 jjdelcerro
        Interpreter interpreter = ExpressionUtils.createInterpreter();
48 44009 jjdelcerro
        interpreter.setSymbolTable(symbolTable);
49
        return interpreter;
50
    }
51
52
    protected Optimizer createOptimizer(SymbolTable symbolTable) {
53 44644 jjdelcerro
        Optimizer optimizer = ExpressionUtils.createOptimizer();
54
        optimizer.setSymbolTable(symbolTable);
55 44009 jjdelcerro
        return optimizer;
56
    }
57
58
    protected MutableSymbolTable createSymbolTable() {
59 44644 jjdelcerro
        MutableSymbolTable symbolTable = ExpressionUtils.createSymbolTable();
60 44009 jjdelcerro
        symbolTable.setVar("precio", 200);
61
        symbolTable.setVar("1990", 0.168873933773767);
62
        return symbolTable;
63
    }
64
65
    private String createExpr1() {
66 44644 jjdelcerro
        ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
67 44009 jjdelcerro
68
        ExpressionBuilder.Value expr1 = builder.gt(
69
                builder.column("campo1"),
70
                builder.constant(10)
71
        );
72
        System.out.println(expr1.toString());
73
        assertEquals(
74
                "( (\"campo1\") > (10) )",
75
                expr1.toString()
76
        );
77
        return expr1.toString();
78
    }
79
80
81 43512 jjdelcerro
    public void testIdentifier1() {
82
        String source = "precio";
83
84
        Compiler compiler = createCompiler();
85
        Code code = compiler.compileExpression(source);
86 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
87 44009 jjdelcerro
88
        SymbolTable symbolTable = createSymbolTable();
89
        Optimizer optimizer = createOptimizer(symbolTable);
90
        Code code2 = optimizer.optimize(code);
91
        assertEquals("\"precio\"", code2.toString());
92 43512 jjdelcerro
    }
93
94
    public void testIdentifier2() {
95 44139 jjdelcerro
        Compiler compiler = createCompiler();
96
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
97
98 43512 jjdelcerro
        String source = "[precio]";
99
100
        Code code = compiler.compileExpression(source);
101 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
102 44009 jjdelcerro
103
        SymbolTable symbolTable = createSymbolTable();
104
        Optimizer optimizer = createOptimizer(symbolTable);
105
        Code code2 = optimizer.optimize(code);
106
        assertEquals("\"precio\"", code2.toString());
107 43512 jjdelcerro
    }
108
109
    public void testIdentifier3() {
110
        String source = "\"precio\"";
111
112
        Compiler compiler = createCompiler();
113
        Code code = compiler.compileExpression(source);
114 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
115 44009 jjdelcerro
116
        SymbolTable symbolTable = createSymbolTable();
117
        Optimizer optimizer = createOptimizer(symbolTable);
118
        Code code2 = optimizer.optimize(code);
119
        assertEquals("\"precio\"", code2.toString());
120 43512 jjdelcerro
    }
121
122
    public void testTrue() {
123
        String source = "true";
124
125
        Compiler compiler = createCompiler();
126
        Code code = compiler.compileExpression(source);
127 44139 jjdelcerro
        assertEquals("TRUE", code.toString());
128 44009 jjdelcerro
129
        SymbolTable symbolTable = createSymbolTable();
130
        Optimizer optimizer = createOptimizer(symbolTable);
131
        Code code2 = optimizer.optimize(code);
132 44139 jjdelcerro
        assertEquals("TRUE", code2.toString());
133 43512 jjdelcerro
    }
134
135
    public void testFalse() {
136
        String source = "false";
137
138
        Compiler compiler = createCompiler();
139
        Code code = compiler.compileExpression(source);
140 44139 jjdelcerro
        assertEquals("FALSE", code.toString());
141 44009 jjdelcerro
142
        SymbolTable symbolTable = createSymbolTable();
143
        Optimizer optimizer = createOptimizer(symbolTable);
144
        Code code2 = optimizer.optimize(code);
145 44139 jjdelcerro
        assertEquals("FALSE", code2.toString());
146 43512 jjdelcerro
    }
147
148
    public void testNull() {
149
        String source = "null";
150
151
        Compiler compiler = createCompiler();
152
        Code code = compiler.compileExpression(source);
153 44139 jjdelcerro
        assertEquals("NULL", code.toString());
154 44009 jjdelcerro
155
        SymbolTable symbolTable = createSymbolTable();
156
        Optimizer optimizer = createOptimizer(symbolTable);
157
        Code code2 = optimizer.optimize(code);
158 44139 jjdelcerro
        assertEquals("NULL", code2.toString());
159 43512 jjdelcerro
    }
160
161
    public void testNotTrue() {
162
        String source = "not true";
163
164
        Compiler compiler = createCompiler();
165
        Code code = compiler.compileExpression(source);
166 44139 jjdelcerro
        assertEquals("NOT(TRUE)", code.toString());
167 44009 jjdelcerro
168
        SymbolTable symbolTable = createSymbolTable();
169
        Optimizer optimizer = createOptimizer(symbolTable);
170
        Code code2 = optimizer.optimize(code);
171 44139 jjdelcerro
        assertEquals("FALSE", code2.toString());
172 43512 jjdelcerro
    }
173
174
    public void testInteger() {
175
        String source = "23";
176
177
        Compiler compiler = createCompiler();
178
        Code code = compiler.compileExpression(source);
179
        assertEquals("23", code.toString());
180 44009 jjdelcerro
181
        SymbolTable symbolTable = createSymbolTable();
182
        Optimizer optimizer = createOptimizer(symbolTable);
183
        Code code2 = optimizer.optimize(code);
184
        assertEquals("23", code2.toString());
185 43512 jjdelcerro
    }
186
187
    public void operator(String operatorName) {
188
        String source = "precio " + operatorName + " 23";
189
190
        Compiler compiler = createCompiler();
191
        Code code = compiler.compileExpression(source);
192 44198 jjdelcerro
        assertEquals( "(\"precio\" "+operatorName+" 23)", code.toString());
193 44009 jjdelcerro
194
        SymbolTable symbolTable = createSymbolTable();
195
        Optimizer optimizer = createOptimizer(symbolTable);
196
        Code code2 = optimizer.optimize(code);
197 44198 jjdelcerro
        assertEquals( "(\"precio\" "+operatorName+" 23)", code2.toString());
198 43512 jjdelcerro
    }
199 44009 jjdelcerro
200 43512 jjdelcerro
    public void testOperators() {
201
202
        operator("=");
203
        operator("<>");
204
        operator(">");
205
        operator(">=");
206
        operator("<");
207
        operator("<=");
208 44139 jjdelcerro
        operator("LIKE");
209
        operator("ILIKE");
210
        operator("||");
211 43512 jjdelcerro
        operator("+");
212
        operator("-");
213
        operator("*");
214
//        operator("^");
215 44139 jjdelcerro
        operator("OR");
216
        operator("AND");
217 43512 jjdelcerro
        operator("%");
218 44139 jjdelcerro
        operator("IS");
219 43512 jjdelcerro
    }
220
221 44010 jjdelcerro
222 43512 jjdelcerro
    public void testAddMul() {
223
        String source = "precio + 10 * 2 + 20 + 30";
224
225
        Compiler compiler = createCompiler();
226 44009 jjdelcerro
227 43512 jjdelcerro
        Code code = compiler.compileExpression(source);
228 44198 jjdelcerro
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
229 44009 jjdelcerro
230
        SymbolTable symbolTable = createSymbolTable();
231
        Optimizer optimizer = createOptimizer(symbolTable);
232
        Code code2 = optimizer.optimize(code);
233 44198 jjdelcerro
        assertEquals("(((\"precio\" + 20) + 20) + 30)", code2.toString());
234 43512 jjdelcerro
    }
235 44010 jjdelcerro
236
    public void testMul0() {
237
        String source = "precio + 10 * 0 + 20 + 30";
238 44009 jjdelcerro
239 44010 jjdelcerro
        Compiler compiler = createCompiler();
240
241
        Code code = compiler.compileExpression(source);
242 44198 jjdelcerro
        assertEquals("(((\"precio\" + (10 * 0)) + 20) + 30)", code.toString());
243 44010 jjdelcerro
244
        SymbolTable symbolTable = createSymbolTable();
245
        Optimizer optimizer = createOptimizer(symbolTable);
246
        Code code2 = optimizer.optimize(code);
247 44198 jjdelcerro
        assertEquals("((\"precio\" + 20) + 30)", code2.toString());
248 44010 jjdelcerro
    }
249
250
    public void testMul1() {
251
        String source = "precio + 10 * 1 + 20 + 30";
252
253
        Compiler compiler = createCompiler();
254
255
        Code code = compiler.compileExpression(source);
256 44198 jjdelcerro
        assertEquals("(((\"precio\" + (10 * 1)) + 20) + 30)", code.toString());
257 44010 jjdelcerro
258
        SymbolTable symbolTable = createSymbolTable();
259
        Optimizer optimizer = createOptimizer(symbolTable);
260
        Code code2 = optimizer.optimize(code);
261 44198 jjdelcerro
        assertEquals("(((\"precio\" + 10) + 20) + 30)", code2.toString());
262 44010 jjdelcerro
    }
263
264
    public void testDiv1() {
265
        String source = "precio + 10 / 1 + 20 + 30";
266
267
        Compiler compiler = createCompiler();
268
269
        Code code = compiler.compileExpression(source);
270 44198 jjdelcerro
        assertEquals("(((\"precio\" + (10 / 1)) + 20) + 30)", code.toString());
271 44010 jjdelcerro
272
        SymbolTable symbolTable = createSymbolTable();
273
        Optimizer optimizer = createOptimizer(symbolTable);
274
        Code code2 = optimizer.optimize(code);
275 44198 jjdelcerro
        assertEquals("(((\"precio\" + 10) + 20) + 30)", code2.toString());
276 44010 jjdelcerro
    }
277
278
    public void testDiv0() {
279
        String source = "precio + 0 / 10 + 20 + 30";
280
281
        Compiler compiler = createCompiler();
282
283
        Code code = compiler.compileExpression(source);
284 44198 jjdelcerro
        assertEquals("(((\"precio\" + (0 / 10)) + 20) + 30)", code.toString());
285 44010 jjdelcerro
286
        SymbolTable symbolTable = createSymbolTable();
287
        Optimizer optimizer = createOptimizer(symbolTable);
288
        Code code2 = optimizer.optimize(code);
289 44198 jjdelcerro
        assertEquals("((\"precio\" + 20) + 30)", code2.toString());
290 44010 jjdelcerro
    }
291
292 43519 jjdelcerro
    public void testAddMulPar() {
293
        String source = "(precio + 10) * 2 + 20 + 30";
294
295
        Compiler compiler = createCompiler();
296 44009 jjdelcerro
297 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
298 44198 jjdelcerro
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
299 44009 jjdelcerro
300
        SymbolTable symbolTable = createSymbolTable();
301
        Optimizer optimizer = createOptimizer(symbolTable);
302
        Code code2 = optimizer.optimize(code);
303 44198 jjdelcerro
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code2.toString());
304 43519 jjdelcerro
    }
305 44009 jjdelcerro
306 43519 jjdelcerro
    public void testAbs() {
307
        String source = "precio + abs(10)";
308
309
        Compiler compiler = createCompiler();
310 44009 jjdelcerro
311 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
312 44198 jjdelcerro
        assertEquals("(\"precio\" + abs(10))", code.toString());
313 44009 jjdelcerro
314
        SymbolTable symbolTable = createSymbolTable();
315
        Optimizer optimizer = createOptimizer(symbolTable);
316
        Code code2 = optimizer.optimize(code);
317 44198 jjdelcerro
        assertEquals("(\"precio\" + 10)", code2.toString());
318 43519 jjdelcerro
    }
319 44009 jjdelcerro
320 43519 jjdelcerro
    public void testAbs2() {
321
        String source = "precio + abs(-10)";
322
323
        Compiler compiler = createCompiler();
324 44009 jjdelcerro
325 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
326 44211 jjdelcerro
        assertEquals("(\"precio\" + abs(-10))", code.toString());
327 44009 jjdelcerro
328
        SymbolTable symbolTable = createSymbolTable();
329
        Optimizer optimizer = createOptimizer(symbolTable);
330
        Code code2 = optimizer.optimize(code);
331 44198 jjdelcerro
        assertEquals("(\"precio\" + 10)", code2.toString());
332 43519 jjdelcerro
    }
333 44009 jjdelcerro
334 43519 jjdelcerro
    public void testPI() {
335
        String source = "precio + PI()";
336
337
        Compiler compiler = createCompiler();
338 44009 jjdelcerro
339 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
340 44198 jjdelcerro
        assertEquals("(\"precio\" + PI())", code.toString());
341 44009 jjdelcerro
342
        SymbolTable symbolTable = createSymbolTable();
343
        Optimizer optimizer = createOptimizer(symbolTable);
344
        Code code2 = optimizer.optimize(code);
345 44198 jjdelcerro
        assertEquals("(\"precio\" + 3.141592653589793)", code2.toString());
346 43519 jjdelcerro
    }
347 44009 jjdelcerro
348 43519 jjdelcerro
    public void testCeil() {
349
        String source = "precio + CEIL(PI())";
350
351
        Compiler compiler = createCompiler();
352 44009 jjdelcerro
353 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
354 44198 jjdelcerro
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
355 44009 jjdelcerro
356
        SymbolTable symbolTable = createSymbolTable();
357
        Optimizer optimizer = createOptimizer(symbolTable);
358
        Code code2 = optimizer.optimize(code);
359 44198 jjdelcerro
        assertEquals("(\"precio\" + 4.0)", code2.toString());
360 43519 jjdelcerro
    }
361 44009 jjdelcerro
362 43519 jjdelcerro
    public void testConcat() {
363
        String source = "CONCAT(precio,' euros')";
364
365
        Compiler compiler = createCompiler();
366 44009 jjdelcerro
367 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
368 44006 jjdelcerro
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
369 43521 jjdelcerro
370 44009 jjdelcerro
        SymbolTable symbolTable = createSymbolTable();
371
        Optimizer optimizer = createOptimizer(symbolTable);
372
        Code code2 = optimizer.optimize(code);
373
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
374 43521 jjdelcerro
    }
375
376 44139 jjdelcerro
    public void testConcat2() {
377
        String source = "CONCAT(precio,' euros')";
378
379
        Compiler compiler = createCompiler();
380
381
        Code code = compiler.compileExpression(source);
382
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
383
384
        SymbolTable symbolTable = createSymbolTable();
385
        Optimizer optimizer = createOptimizer(symbolTable);
386
        Code code2 = optimizer.optimize(code);
387
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
388
    }
389
390 43989 jjdelcerro
    public void testInvokeFunction1() {
391
        String source = "ST_Area(GEOMETRY)";
392
393
        Compiler compiler = createCompiler();
394 44009 jjdelcerro
395 43989 jjdelcerro
        Code code = compiler.compileExpression(source);
396 44006 jjdelcerro
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
397 44009 jjdelcerro
398
        SymbolTable symbolTable = createSymbolTable();
399
        Optimizer optimizer = createOptimizer(symbolTable);
400
        Code code2 = optimizer.optimize(code);
401
        assertEquals("ST_Area(\"GEOMETRY\")", code2.toString());
402 43989 jjdelcerro
    }
403
404 43939 jjdelcerro
    public void testInvokeMethod1() {
405
        String source = "'hola'.length()";
406
407
        Compiler compiler = createCompiler();
408 44009 jjdelcerro
409 43939 jjdelcerro
        Code code = compiler.compileExpression(source);
410
        assertEquals("'hola'->length()", code.toString());
411 44009 jjdelcerro
412
        SymbolTable symbolTable = createSymbolTable();
413
        Optimizer optimizer = createOptimizer(symbolTable);
414
        Code code2 = optimizer.optimize(code);
415
        assertEquals("'hola'->length()", code2.toString());
416 43939 jjdelcerro
    }
417 44009 jjdelcerro
418 43512 jjdelcerro
}