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 @ 44098

History | View | Annotate | Download (16.9 KB)

1 43512 jjdelcerro
package org.gvsig.expresionevaluator.impl;
2
3 44009 jjdelcerro
import static junit.framework.Assert.assertEquals;
4 43512 jjdelcerro
import org.gvsig.expressionevaluator.impl.SQLLexicalAnalyzer;
5
import org.gvsig.expressionevaluator.impl.DefaultCompiler;
6
import junit.framework.TestCase;
7 44009 jjdelcerro
import org.cresques.cts.IProjection;
8 43512 jjdelcerro
import org.gvsig.expressionevaluator.LexicalAnalyzer;
9
import org.gvsig.expressionevaluator.Compiler;
10
import org.gvsig.expressionevaluator.Code;
11 44009 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionBuilder;
12
import org.gvsig.expressionevaluator.Interpreter;
13
import org.gvsig.expressionevaluator.MutableSymbolTable;
14
import org.gvsig.expressionevaluator.Optimizer;
15
import org.gvsig.expressionevaluator.SymbolTable;
16
import org.gvsig.expressionevaluator.impl.DefaultExpressionBuilder;
17
import org.gvsig.expressionevaluator.impl.DefaultInterpreter;
18
import org.gvsig.expressionevaluator.impl.DefaultOptimizer;
19
import org.gvsig.expressionevaluator.impl.DefaultSymbolTable;
20
import org.gvsig.fmap.crs.CRSFactory;
21
import org.gvsig.fmap.geom.Geometry;
22
import org.gvsig.fmap.geom.GeometryLocator;
23
import org.gvsig.fmap.geom.GeometryManager;
24
import org.gvsig.fmap.geom.exception.CreateGeometryException;
25
import org.gvsig.fmap.geom.primitive.Point;
26
import org.gvsig.fmap.geom.primitive.Polygon;
27
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
28 43512 jjdelcerro
29 44009 jjdelcerro
public class TestOptimizer extends TestCase {
30 43512 jjdelcerro
31 44009 jjdelcerro
    public TestOptimizer(String testName) {
32 43512 jjdelcerro
        super(testName);
33
    }
34 44009 jjdelcerro
35 43512 jjdelcerro
    @Override
36
    protected void setUp() throws Exception {
37
        super.setUp();
38 44009 jjdelcerro
        new DefaultLibrariesInitializer().fullInitialize();
39 43512 jjdelcerro
    }
40 44009 jjdelcerro
41 43512 jjdelcerro
    @Override
42
    protected void tearDown() throws Exception {
43
        super.tearDown();
44
    }
45
46
    // TODO add test methods here. The name must begin with 'test'. For example:
47
    // public void testHello() {}
48
    protected LexicalAnalyzer createLexicalAnalyzer() {
49
        SQLLexicalAnalyzer lexer = new SQLLexicalAnalyzer();
50
        return lexer;
51
    }
52 44009 jjdelcerro
53 43512 jjdelcerro
    protected Compiler createCompiler() {
54
        Compiler compiler = new DefaultCompiler();
55
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
56
        return compiler;
57
    }
58 44009 jjdelcerro
59
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
60
        Interpreter interpreter = new DefaultInterpreter();
61
        interpreter.setSymbolTable(symbolTable);
62
        return interpreter;
63
    }
64
65
    protected Optimizer createOptimizer(SymbolTable symbolTable) {
66
        Optimizer optimizer = new DefaultOptimizer(symbolTable);
67
        return optimizer;
68
    }
69
70
    protected MutableSymbolTable createSymbolTable() {
71
        DefaultSymbolTable symbolTable = new DefaultSymbolTable();
72
        symbolTable.setVar("precio", 200);
73
        symbolTable.setVar("1990", 0.168873933773767);
74
        return symbolTable;
75
    }
76
77
    private String createExpr1() {
78
        ExpressionBuilder builder = new DefaultExpressionBuilder();
79
80
        ExpressionBuilder.Value expr1 = builder.gt(
81
                builder.column("campo1"),
82
                builder.constant(10)
83
        );
84
        System.out.println(expr1.toString());
85
        assertEquals(
86
                "( (\"campo1\") > (10) )",
87
                expr1.toString()
88
        );
89
        return expr1.toString();
90
    }
91
92
    private Polygon createPolygon() throws CreateGeometryException {
93
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
94
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
95
96
        Polygon polygon = geometryManager.createPolygon(Geometry.SUBTYPES.GEOM2D);
97
        polygon.addVertex(0, 0);
98
        polygon.addVertex(0, 100);
99
        polygon.addVertex(100, 100);
100
        polygon.addVertex(100, 0);
101
        polygon.addVertex(0, 0);
102
103
        polygon.setProjection(proj);
104
        return polygon;
105
    }
106
107
    private Geometry createPoint(double x, double y) throws CreateGeometryException {
108
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
109
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
110
        Point point = geometryManager.createPoint(x, y, Geometry.SUBTYPES.GEOM2D);
111
        point.setProjection(proj);
112
        return point;
113
    }
114
115 43512 jjdelcerro
    public void testIdentifier1() {
116
        String source = "precio";
117
118
        Compiler compiler = createCompiler();
119
        Code code = compiler.compileExpression(source);
120 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
121 44009 jjdelcerro
122
        SymbolTable symbolTable = createSymbolTable();
123
        Optimizer optimizer = createOptimizer(symbolTable);
124
        Code code2 = optimizer.optimize(code);
125
        assertEquals("\"precio\"", code2.toString());
126 43512 jjdelcerro
    }
127
128
    public void testIdentifier2() {
129
        String source = "[precio]";
130
131
        Compiler compiler = createCompiler();
132
        Code code = compiler.compileExpression(source);
133 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
134 44009 jjdelcerro
135
        SymbolTable symbolTable = createSymbolTable();
136
        Optimizer optimizer = createOptimizer(symbolTable);
137
        Code code2 = optimizer.optimize(code);
138
        assertEquals("\"precio\"", code2.toString());
139 43512 jjdelcerro
    }
140
141
    public void testIdentifier3() {
142
        String source = "\"precio\"";
143
144
        Compiler compiler = createCompiler();
145
        Code code = compiler.compileExpression(source);
146 44006 jjdelcerro
        assertEquals("\"precio\"", code.toString());
147 44009 jjdelcerro
148
        SymbolTable symbolTable = createSymbolTable();
149
        Optimizer optimizer = createOptimizer(symbolTable);
150
        Code code2 = optimizer.optimize(code);
151
        assertEquals("\"precio\"", code2.toString());
152 43512 jjdelcerro
    }
153
154
    public void testTrue() {
155
        String source = "true";
156
157
        Compiler compiler = createCompiler();
158
        Code code = compiler.compileExpression(source);
159
        assertEquals("true", code.toString());
160 44009 jjdelcerro
161
        SymbolTable symbolTable = createSymbolTable();
162
        Optimizer optimizer = createOptimizer(symbolTable);
163
        Code code2 = optimizer.optimize(code);
164
        assertEquals("true", code2.toString());
165 43512 jjdelcerro
    }
166
167
    public void testFalse() {
168
        String source = "false";
169
170
        Compiler compiler = createCompiler();
171
        Code code = compiler.compileExpression(source);
172
        assertEquals("false", code.toString());
173 44009 jjdelcerro
174
        SymbolTable symbolTable = createSymbolTable();
175
        Optimizer optimizer = createOptimizer(symbolTable);
176
        Code code2 = optimizer.optimize(code);
177
        assertEquals("false", code2.toString());
178 43512 jjdelcerro
    }
179
180
    public void testNull() {
181
        String source = "null";
182
183
        Compiler compiler = createCompiler();
184
        Code code = compiler.compileExpression(source);
185
        assertEquals("null", code.toString());
186 44009 jjdelcerro
187
        SymbolTable symbolTable = createSymbolTable();
188
        Optimizer optimizer = createOptimizer(symbolTable);
189
        Code code2 = optimizer.optimize(code);
190
        assertEquals("null", code2.toString());
191 43512 jjdelcerro
    }
192
193
    public void testNotTrue() {
194
        String source = "not true";
195
196
        Compiler compiler = createCompiler();
197
        Code code = compiler.compileExpression(source);
198
        assertEquals("not(true)", code.toString());
199 44009 jjdelcerro
200
        SymbolTable symbolTable = createSymbolTable();
201
        Optimizer optimizer = createOptimizer(symbolTable);
202
        Code code2 = optimizer.optimize(code);
203
        assertEquals("false", code2.toString());
204 43512 jjdelcerro
    }
205
206
    public void testInteger() {
207
        String source = "23";
208
209
        Compiler compiler = createCompiler();
210
        Code code = compiler.compileExpression(source);
211
        assertEquals("23", code.toString());
212 44009 jjdelcerro
213
        SymbolTable symbolTable = createSymbolTable();
214
        Optimizer optimizer = createOptimizer(symbolTable);
215
        Code code2 = optimizer.optimize(code);
216
        assertEquals("23", code2.toString());
217 43512 jjdelcerro
    }
218
219
    public void operator(String operatorName) {
220
        String source = "precio " + operatorName + " 23";
221
222
        Compiler compiler = createCompiler();
223
        Code code = compiler.compileExpression(source);
224 44009 jjdelcerro
        assertEquals(operatorName + "(\"precio\", 23)", code.toString());
225
226
        SymbolTable symbolTable = createSymbolTable();
227
        Optimizer optimizer = createOptimizer(symbolTable);
228
        Code code2 = optimizer.optimize(code);
229
        assertEquals(operatorName + "(\"precio\", 23)", code2.toString());
230 43512 jjdelcerro
    }
231 44009 jjdelcerro
232 43512 jjdelcerro
    public void testOperators() {
233
234
        operator("=");
235
        operator("<>");
236
        operator(">");
237
        operator(">=");
238
        operator("<");
239
        operator("<=");
240
        operator("like");
241
        operator("ilike");
242
        operator("+");
243
        operator("-");
244
        operator("*");
245
//        operator("^");
246
        operator("or");
247
        operator("and");
248
        operator("%");
249
        operator("is");
250
    }
251
252 44010 jjdelcerro
253 43512 jjdelcerro
    public void testAddMul() {
254
        String source = "precio + 10 * 2 + 20 + 30";
255
256
        Compiler compiler = createCompiler();
257 44009 jjdelcerro
258 43512 jjdelcerro
        Code code = compiler.compileExpression(source);
259 44006 jjdelcerro
        assertEquals("+(+(+(\"precio\", *(10, 2)), 20), 30)", code.toString());
260 44009 jjdelcerro
261
        SymbolTable symbolTable = createSymbolTable();
262
        Optimizer optimizer = createOptimizer(symbolTable);
263
        Code code2 = optimizer.optimize(code);
264
        assertEquals("+(+(+(\"precio\", 20), 20), 30)", code2.toString());
265 43512 jjdelcerro
    }
266 44010 jjdelcerro
267
    public void testMul0() {
268
        String source = "precio + 10 * 0 + 20 + 30";
269 44009 jjdelcerro
270 44010 jjdelcerro
        Compiler compiler = createCompiler();
271
272
        Code code = compiler.compileExpression(source);
273
        assertEquals("+(+(+(\"precio\", *(10, 0)), 20), 30)", code.toString());
274
275
        SymbolTable symbolTable = createSymbolTable();
276
        Optimizer optimizer = createOptimizer(symbolTable);
277
        Code code2 = optimizer.optimize(code);
278
        assertEquals("+(+(\"precio\", 20), 30)", code2.toString());
279
    }
280
281
    public void testMul1() {
282
        String source = "precio + 10 * 1 + 20 + 30";
283
284
        Compiler compiler = createCompiler();
285
286
        Code code = compiler.compileExpression(source);
287
        assertEquals("+(+(+(\"precio\", *(10, 1)), 20), 30)", code.toString());
288
289
        SymbolTable symbolTable = createSymbolTable();
290
        Optimizer optimizer = createOptimizer(symbolTable);
291
        Code code2 = optimizer.optimize(code);
292
        assertEquals("+(+(+(\"precio\", 10), 20), 30)", code2.toString());
293
    }
294
295
    public void testDiv1() {
296
        String source = "precio + 10 / 1 + 20 + 30";
297
298
        Compiler compiler = createCompiler();
299
300
        Code code = compiler.compileExpression(source);
301
        assertEquals("+(+(+(\"precio\", /(10, 1)), 20), 30)", code.toString());
302
303
        SymbolTable symbolTable = createSymbolTable();
304
        Optimizer optimizer = createOptimizer(symbolTable);
305
        Code code2 = optimizer.optimize(code);
306
        assertEquals("+(+(+(\"precio\", 10), 20), 30)", code2.toString());
307
    }
308
309
    public void testDiv0() {
310
        String source = "precio + 0 / 10 + 20 + 30";
311
312
        Compiler compiler = createCompiler();
313
314
        Code code = compiler.compileExpression(source);
315
        assertEquals("+(+(+(\"precio\", /(0, 10)), 20), 30)", code.toString());
316
317
        SymbolTable symbolTable = createSymbolTable();
318
        Optimizer optimizer = createOptimizer(symbolTable);
319
        Code code2 = optimizer.optimize(code);
320
        assertEquals("+(+(\"precio\", 20), 30)", code2.toString());
321
    }
322
323 43519 jjdelcerro
    public void testAddMulPar() {
324
        String source = "(precio + 10) * 2 + 20 + 30";
325
326
        Compiler compiler = createCompiler();
327 44009 jjdelcerro
328 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
329 44006 jjdelcerro
        assertEquals("+(+(*(+(\"precio\", 10), 2), 20), 30)", code.toString());
330 44009 jjdelcerro
331
        SymbolTable symbolTable = createSymbolTable();
332
        Optimizer optimizer = createOptimizer(symbolTable);
333
        Code code2 = optimizer.optimize(code);
334
        assertEquals("+(+(*(+(\"precio\", 10), 2), 20), 30)", code2.toString());
335 43519 jjdelcerro
    }
336 44009 jjdelcerro
337 43519 jjdelcerro
    public void testAbs() {
338
        String source = "precio + abs(10)";
339
340
        Compiler compiler = createCompiler();
341 44009 jjdelcerro
342 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
343 44006 jjdelcerro
        assertEquals("+(\"precio\", abs(10))", code.toString());
344 44009 jjdelcerro
345
        SymbolTable symbolTable = createSymbolTable();
346
        Optimizer optimizer = createOptimizer(symbolTable);
347
        Code code2 = optimizer.optimize(code);
348
        assertEquals("+(\"precio\", 10)", code2.toString());
349 43519 jjdelcerro
    }
350 44009 jjdelcerro
351 43519 jjdelcerro
    public void testAbs2() {
352
        String source = "precio + abs(-10)";
353
354
        Compiler compiler = createCompiler();
355 44009 jjdelcerro
356 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
357 44098 jjdelcerro
        assertEquals("+(\"precio\", abs(negate(10)))", code.toString());
358 44009 jjdelcerro
359
        SymbolTable symbolTable = createSymbolTable();
360
        Optimizer optimizer = createOptimizer(symbolTable);
361
        Code code2 = optimizer.optimize(code);
362
        assertEquals("+(\"precio\", 10)", code2.toString());
363 43519 jjdelcerro
    }
364 44009 jjdelcerro
365 43519 jjdelcerro
    public void testPI() {
366
        String source = "precio + PI()";
367
368
        Compiler compiler = createCompiler();
369 44009 jjdelcerro
370 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
371 44006 jjdelcerro
        assertEquals("+(\"precio\", PI())", code.toString());
372 44009 jjdelcerro
373
        SymbolTable symbolTable = createSymbolTable();
374
        Optimizer optimizer = createOptimizer(symbolTable);
375
        Code code2 = optimizer.optimize(code);
376
        assertEquals("+(\"precio\", 3.141592653589793)", code2.toString());
377 43519 jjdelcerro
    }
378 44009 jjdelcerro
379 43519 jjdelcerro
    public void testCeil() {
380
        String source = "precio + CEIL(PI())";
381
382
        Compiler compiler = createCompiler();
383 44009 jjdelcerro
384 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
385 44006 jjdelcerro
        assertEquals("+(\"precio\", CEIL(PI()))", code.toString());
386 44009 jjdelcerro
387
        SymbolTable symbolTable = createSymbolTable();
388
        Optimizer optimizer = createOptimizer(symbolTable);
389
        Code code2 = optimizer.optimize(code);
390
        assertEquals("+(\"precio\", 4.0)", code2.toString());
391 43519 jjdelcerro
    }
392 44009 jjdelcerro
393 43519 jjdelcerro
    public void testConcat() {
394
        String source = "CONCAT(precio,' euros')";
395
396
        Compiler compiler = createCompiler();
397 44009 jjdelcerro
398 43519 jjdelcerro
        Code code = compiler.compileExpression(source);
399 44006 jjdelcerro
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
400 43521 jjdelcerro
401 44009 jjdelcerro
        SymbolTable symbolTable = createSymbolTable();
402
        Optimizer optimizer = createOptimizer(symbolTable);
403
        Code code2 = optimizer.optimize(code);
404
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
405 43521 jjdelcerro
    }
406
407 43989 jjdelcerro
    public void testInvokeFunction1() {
408
        String source = "ST_Area(GEOMETRY)";
409
410
        Compiler compiler = createCompiler();
411 44009 jjdelcerro
412 43989 jjdelcerro
        Code code = compiler.compileExpression(source);
413 44006 jjdelcerro
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
414 44009 jjdelcerro
415
        SymbolTable symbolTable = createSymbolTable();
416
        Optimizer optimizer = createOptimizer(symbolTable);
417
        Code code2 = optimizer.optimize(code);
418
        assertEquals("ST_Area(\"GEOMETRY\")", code2.toString());
419 43989 jjdelcerro
    }
420
421 43939 jjdelcerro
    public void testInvokeMethod1() {
422
        String source = "'hola'.length()";
423
424
        Compiler compiler = createCompiler();
425 44009 jjdelcerro
426 43939 jjdelcerro
        Code code = compiler.compileExpression(source);
427
        assertEquals("'hola'->length()", code.toString());
428 44009 jjdelcerro
429
        SymbolTable symbolTable = createSymbolTable();
430
        Optimizer optimizer = createOptimizer(symbolTable);
431
        Code code2 = optimizer.optimize(code);
432
        assertEquals("'hola'->length()", code2.toString());
433 43939 jjdelcerro
    }
434 44009 jjdelcerro
435
    public void testSpatialExpression1() throws Exception {
436
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
437
        ExpressionBuilder builder = new DefaultExpressionBuilder();
438
        builder.getConfig().set(ExpressionBuilder.Config.geometry_type_support, ExpressionBuilder.GeometrySupportType.WKB);
439
440
        String source = builder.and(
441
                builder.custom(this.createExpr1()),
442
                builder.ST_Intersects(
443
                        builder.geometry(createPolygon()),
444
                        builder.column("GEOMETRY")
445
                )
446
        ).toString();
447
448
        MutableSymbolTable symbolTable = createSymbolTable();
449
        symbolTable.setVar("campo1", 11);
450
        symbolTable.setVar("GEOMETRY", createPoint(50, 50));
451
452
        Interpreter interpreter = createInterpreter(symbolTable);
453 43939 jjdelcerro
        Compiler compiler = createCompiler();
454
        Code code = compiler.compileExpression(source);
455 44009 jjdelcerro
        System.out.println(code.toString());
456
        assertEquals(
457
                "and(>(\"campo1\", 10), ST_Intersects(ST_GeomFromWKB(DECODE('000000000300000001000000050000000000000000000000000000000000000000000000004059000000000000405900000000000040590000000000004059000000000000000000000000000000000000000000000000000000000000', 'hex'), 4326), \"GEOMETRY\"))",
458
                code.toString()
459
        );
460
461
//        long t1 = System.currentTimeMillis();
462
//        for (int i = 0; i < 1000; i++) {
463
//            interpreter.run(code);
464
//        }
465
//        System.out.println("Sin optimizar: " + (System.currentTimeMillis() - t1));
466
467
//        t1 = System.currentTimeMillis();
468
        Optimizer optimizer = createOptimizer(symbolTable);
469
        Code code2 = optimizer.optimize(code);
470
//        System.out.println("Tiempo de optimizacion: " + (System.currentTimeMillis() - t1));
471
        System.out.println(code2.toString());
472
        assertEquals(
473
                "and(>(\"campo1\", 10), ST_Intersects('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'::geometry, \"GEOMETRY\"))",
474
                code2.toString()
475
        );
476
477
//        t1 = System.currentTimeMillis();
478
//        for (int i = 0; i < 1000; i++) {
479
//            interpreter.run(code2);
480
//        }
481
//        System.out.println("Optimizado: " + (System.currentTimeMillis() - t1));
482
483 43939 jjdelcerro
    }
484 43983 jjdelcerro
485 43512 jjdelcerro
}