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

History | View | Annotate | Download (17.5 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import static junit.framework.Assert.assertEquals;
4
import org.gvsig.expressionevaluator.impl.SQLLexicalAnalyzer;
5
import org.gvsig.expressionevaluator.impl.DefaultCompiler;
6
import junit.framework.TestCase;
7
import org.cresques.cts.IProjection;
8
import org.gvsig.expressionevaluator.LexicalAnalyzer;
9
import org.gvsig.expressionevaluator.Compiler;
10
import org.gvsig.expressionevaluator.Code;
11
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

    
29
public class TestOptimizer extends TestCase {
30

    
31
    public TestOptimizer(String testName) {
32
        super(testName);
33
    }
34

    
35
    @Override
36
    protected void setUp() throws Exception {
37
        super.setUp();
38
        new DefaultLibrariesInitializer().fullInitialize();
39
    }
40

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

    
53
    protected Compiler createCompiler() {
54
        Compiler compiler = new DefaultCompiler();
55
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
56
        return compiler;
57
    }
58

    
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
    public void testIdentifier1() {
116
        String source = "precio";
117

    
118
        Compiler compiler = createCompiler();
119
        Code code = compiler.compileExpression(source);
120
        assertEquals("\"precio\"", code.toString());
121

    
122
        SymbolTable symbolTable = createSymbolTable();
123
        Optimizer optimizer = createOptimizer(symbolTable);
124
        Code code2 = optimizer.optimize(code);
125
        assertEquals("\"precio\"", code2.toString());
126
    }
127

    
128
    public void testIdentifier2() {
129
        Compiler compiler = createCompiler();
130
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
131

    
132
        String source = "[precio]";
133

    
134
        Code code = compiler.compileExpression(source);
135
        assertEquals("\"precio\"", code.toString());
136

    
137
        SymbolTable symbolTable = createSymbolTable();
138
        Optimizer optimizer = createOptimizer(symbolTable);
139
        Code code2 = optimizer.optimize(code);
140
        assertEquals("\"precio\"", code2.toString());
141
    }
142

    
143
    public void testIdentifier3() {
144
        String source = "\"precio\"";
145

    
146
        Compiler compiler = createCompiler();
147
        Code code = compiler.compileExpression(source);
148
        assertEquals("\"precio\"", code.toString());
149

    
150
        SymbolTable symbolTable = createSymbolTable();
151
        Optimizer optimizer = createOptimizer(symbolTable);
152
        Code code2 = optimizer.optimize(code);
153
        assertEquals("\"precio\"", code2.toString());
154
    }
155

    
156
    public void testTrue() {
157
        String source = "true";
158

    
159
        Compiler compiler = createCompiler();
160
        Code code = compiler.compileExpression(source);
161
        assertEquals("TRUE", code.toString());
162

    
163
        SymbolTable symbolTable = createSymbolTable();
164
        Optimizer optimizer = createOptimizer(symbolTable);
165
        Code code2 = optimizer.optimize(code);
166
        assertEquals("TRUE", code2.toString());
167
    }
168

    
169
    public void testFalse() {
170
        String source = "false";
171

    
172
        Compiler compiler = createCompiler();
173
        Code code = compiler.compileExpression(source);
174
        assertEquals("FALSE", code.toString());
175

    
176
        SymbolTable symbolTable = createSymbolTable();
177
        Optimizer optimizer = createOptimizer(symbolTable);
178
        Code code2 = optimizer.optimize(code);
179
        assertEquals("FALSE", code2.toString());
180
    }
181

    
182
    public void testNull() {
183
        String source = "null";
184

    
185
        Compiler compiler = createCompiler();
186
        Code code = compiler.compileExpression(source);
187
        assertEquals("NULL", code.toString());
188

    
189
        SymbolTable symbolTable = createSymbolTable();
190
        Optimizer optimizer = createOptimizer(symbolTable);
191
        Code code2 = optimizer.optimize(code);
192
        assertEquals("NULL", code2.toString());
193
    }
194

    
195
    public void testNotTrue() {
196
        String source = "not true";
197

    
198
        Compiler compiler = createCompiler();
199
        Code code = compiler.compileExpression(source);
200
        assertEquals("NOT(TRUE)", code.toString());
201

    
202
        SymbolTable symbolTable = createSymbolTable();
203
        Optimizer optimizer = createOptimizer(symbolTable);
204
        Code code2 = optimizer.optimize(code);
205
        assertEquals("FALSE", code2.toString());
206
    }
207

    
208
    public void testInteger() {
209
        String source = "23";
210

    
211
        Compiler compiler = createCompiler();
212
        Code code = compiler.compileExpression(source);
213
        assertEquals("23", code.toString());
214

    
215
        SymbolTable symbolTable = createSymbolTable();
216
        Optimizer optimizer = createOptimizer(symbolTable);
217
        Code code2 = optimizer.optimize(code);
218
        assertEquals("23", code2.toString());
219
    }
220

    
221
    public void operator(String operatorName) {
222
        String source = "precio " + operatorName + " 23";
223

    
224
        Compiler compiler = createCompiler();
225
        Code code = compiler.compileExpression(source);
226
        assertEquals( "(\"precio\" "+operatorName+" 23)", code.toString());
227

    
228
        SymbolTable symbolTable = createSymbolTable();
229
        Optimizer optimizer = createOptimizer(symbolTable);
230
        Code code2 = optimizer.optimize(code);
231
        assertEquals( "(\"precio\" "+operatorName+" 23)", code2.toString());
232
    }
233

    
234
    public void testOperators() {
235

    
236
        operator("=");
237
        operator("<>");
238
        operator(">");
239
        operator(">=");
240
        operator("<");
241
        operator("<=");
242
        operator("LIKE");
243
        operator("ILIKE");
244
        operator("||");
245
        operator("+");
246
        operator("-");
247
        operator("*");
248
//        operator("^");
249
        operator("OR");
250
        operator("AND");
251
        operator("%");
252
        operator("IS");
253
    }
254

    
255
    
256
    public void testAddMul() {
257
        String source = "precio + 10 * 2 + 20 + 30";
258

    
259
        Compiler compiler = createCompiler();
260

    
261
        Code code = compiler.compileExpression(source);
262
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
263

    
264
        SymbolTable symbolTable = createSymbolTable();
265
        Optimizer optimizer = createOptimizer(symbolTable);
266
        Code code2 = optimizer.optimize(code);
267
        assertEquals("(((\"precio\" + 20) + 20) + 30)", code2.toString());
268
    }
269
    
270
    public void testMul0() {
271
        String source = "precio + 10 * 0 + 20 + 30";
272

    
273
        Compiler compiler = createCompiler();
274

    
275
        Code code = compiler.compileExpression(source);
276
        assertEquals("(((\"precio\" + (10 * 0)) + 20) + 30)", code.toString());
277

    
278
        SymbolTable symbolTable = createSymbolTable();
279
        Optimizer optimizer = createOptimizer(symbolTable);
280
        Code code2 = optimizer.optimize(code);
281
        assertEquals("((\"precio\" + 20) + 30)", code2.toString());
282
    }
283

    
284
    public void testMul1() {
285
        String source = "precio + 10 * 1 + 20 + 30";
286

    
287
        Compiler compiler = createCompiler();
288

    
289
        Code code = compiler.compileExpression(source);
290
        assertEquals("(((\"precio\" + (10 * 1)) + 20) + 30)", code.toString());
291

    
292
        SymbolTable symbolTable = createSymbolTable();
293
        Optimizer optimizer = createOptimizer(symbolTable);
294
        Code code2 = optimizer.optimize(code);
295
        assertEquals("(((\"precio\" + 10) + 20) + 30)", code2.toString());
296
    }
297

    
298
    public void testDiv1() {
299
        String source = "precio + 10 / 1 + 20 + 30";
300

    
301
        Compiler compiler = createCompiler();
302

    
303
        Code code = compiler.compileExpression(source);
304
        assertEquals("(((\"precio\" + (10 / 1)) + 20) + 30)", code.toString());
305

    
306
        SymbolTable symbolTable = createSymbolTable();
307
        Optimizer optimizer = createOptimizer(symbolTable);
308
        Code code2 = optimizer.optimize(code);
309
        assertEquals("(((\"precio\" + 10) + 20) + 30)", code2.toString());
310
    }
311

    
312
    public void testDiv0() {
313
        String source = "precio + 0 / 10 + 20 + 30";
314

    
315
        Compiler compiler = createCompiler();
316

    
317
        Code code = compiler.compileExpression(source);
318
        assertEquals("(((\"precio\" + (0 / 10)) + 20) + 30)", code.toString());
319

    
320
        SymbolTable symbolTable = createSymbolTable();
321
        Optimizer optimizer = createOptimizer(symbolTable);
322
        Code code2 = optimizer.optimize(code);
323
        assertEquals("((\"precio\" + 20) + 30)", code2.toString());
324
    }
325

    
326
    public void testAddMulPar() {
327
        String source = "(precio + 10) * 2 + 20 + 30";
328

    
329
        Compiler compiler = createCompiler();
330

    
331
        Code code = compiler.compileExpression(source);
332
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
333

    
334
        SymbolTable symbolTable = createSymbolTable();
335
        Optimizer optimizer = createOptimizer(symbolTable);
336
        Code code2 = optimizer.optimize(code);
337
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code2.toString());
338
    }
339

    
340
    public void testAbs() {
341
        String source = "precio + abs(10)";
342

    
343
        Compiler compiler = createCompiler();
344

    
345
        Code code = compiler.compileExpression(source);
346
        assertEquals("(\"precio\" + abs(10))", code.toString());
347

    
348
        SymbolTable symbolTable = createSymbolTable();
349
        Optimizer optimizer = createOptimizer(symbolTable);
350
        Code code2 = optimizer.optimize(code);
351
        assertEquals("(\"precio\" + 10)", code2.toString());
352
    }
353

    
354
    public void testAbs2() {
355
        String source = "precio + abs(-10)";
356

    
357
        Compiler compiler = createCompiler();
358

    
359
        Code code = compiler.compileExpression(source);
360
        assertEquals("(\"precio\" + abs(-(10)))", code.toString());
361

    
362
        SymbolTable symbolTable = createSymbolTable();
363
        Optimizer optimizer = createOptimizer(symbolTable);
364
        Code code2 = optimizer.optimize(code);
365
        assertEquals("(\"precio\" + 10)", code2.toString());
366
    }
367

    
368
    public void testPI() {
369
        String source = "precio + PI()";
370

    
371
        Compiler compiler = createCompiler();
372

    
373
        Code code = compiler.compileExpression(source);
374
        assertEquals("(\"precio\" + PI())", code.toString());
375

    
376
        SymbolTable symbolTable = createSymbolTable();
377
        Optimizer optimizer = createOptimizer(symbolTable);
378
        Code code2 = optimizer.optimize(code);
379
        assertEquals("(\"precio\" + 3.141592653589793)", code2.toString());
380
    }
381

    
382
    public void testCeil() {
383
        String source = "precio + CEIL(PI())";
384

    
385
        Compiler compiler = createCompiler();
386

    
387
        Code code = compiler.compileExpression(source);
388
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
389

    
390
        SymbolTable symbolTable = createSymbolTable();
391
        Optimizer optimizer = createOptimizer(symbolTable);
392
        Code code2 = optimizer.optimize(code);
393
        assertEquals("(\"precio\" + 4.0)", code2.toString());
394
    }
395

    
396
    public void testConcat() {
397
        String source = "CONCAT(precio,' euros')";
398

    
399
        Compiler compiler = createCompiler();
400

    
401
        Code code = compiler.compileExpression(source);
402
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
403

    
404
        SymbolTable symbolTable = createSymbolTable();
405
        Optimizer optimizer = createOptimizer(symbolTable);
406
        Code code2 = optimizer.optimize(code);
407
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
408
    }
409

    
410
    public void testConcat2() {
411
        String source = "CONCAT(precio,' euros')";
412

    
413
        Compiler compiler = createCompiler();
414

    
415
        Code code = compiler.compileExpression(source);
416
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
417

    
418
        SymbolTable symbolTable = createSymbolTable();
419
        Optimizer optimizer = createOptimizer(symbolTable);
420
        Code code2 = optimizer.optimize(code);
421
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
422
    }
423

    
424
    public void testInvokeFunction1() {
425
        String source = "ST_Area(GEOMETRY)";
426

    
427
        Compiler compiler = createCompiler();
428

    
429
        Code code = compiler.compileExpression(source);
430
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
431

    
432
        SymbolTable symbolTable = createSymbolTable();
433
        Optimizer optimizer = createOptimizer(symbolTable);
434
        Code code2 = optimizer.optimize(code);
435
        assertEquals("ST_Area(\"GEOMETRY\")", code2.toString());
436
    }
437

    
438
    public void testInvokeMethod1() {
439
        String source = "'hola'.length()";
440

    
441
        Compiler compiler = createCompiler();
442

    
443
        Code code = compiler.compileExpression(source);
444
        assertEquals("'hola'->length()", code.toString());
445

    
446
        SymbolTable symbolTable = createSymbolTable();
447
        Optimizer optimizer = createOptimizer(symbolTable);
448
        Code code2 = optimizer.optimize(code);
449
        assertEquals("'hola'->length()", code2.toString());
450
    }
451

    
452
    public void testSpatialExpression1() throws Exception {
453
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
454
        ExpressionBuilder builder = new DefaultExpressionBuilder();
455
        builder.geometry_support_type(ExpressionBuilder.GeometrySupportType.WKB);
456

    
457
        String source = builder.and(
458
                builder.custom(this.createExpr1()),
459
                builder.ST_Intersects(
460
                        builder.geometry(createPolygon()),
461
                        builder.column("GEOMETRY")
462
                )
463
        ).toString();
464

    
465
        MutableSymbolTable symbolTable = createSymbolTable();
466
        symbolTable.setVar("campo1", 11);
467
        symbolTable.setVar("GEOMETRY", createPoint(50, 50));
468

    
469
        Interpreter interpreter = createInterpreter(symbolTable);
470
        Compiler compiler = createCompiler();
471
        Code code = compiler.compileExpression(source);
472
        System.out.println(code.toString());
473
        assertEquals(
474
                "((\"campo1\" > 10) AND ST_Intersects(ST_GeomFromWKB(DECODE('000000000300000001000000050000000000000000000000000000000000000000000000004059000000000000405900000000000040590000000000004059000000000000000000000000000000000000000000000000000000000000', 'hex'), 4326), \"GEOMETRY\"))",
475
                code.toString()
476
        );
477

    
478
//        long t1 = System.currentTimeMillis();
479
//        for (int i = 0; i < 1000; i++) {
480
//            interpreter.run(code);
481
//        }
482
//        System.out.println("Sin optimizar: " + (System.currentTimeMillis() - t1));
483

    
484
//        t1 = System.currentTimeMillis();
485
        Optimizer optimizer = createOptimizer(symbolTable);
486
        Code code2 = optimizer.optimize(code);
487
//        System.out.println("Tiempo de optimizacion: " + (System.currentTimeMillis() - t1));
488
        System.out.println(code2.toString());
489
        assertEquals(
490
                "((\"campo1\" > 10) AND ST_Intersects('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'::geometry, \"GEOMETRY\"))",
491
                code2.toString()
492
        );
493

    
494
//        t1 = System.currentTimeMillis();
495
//        for (int i = 0; i < 1000; i++) {
496
//            interpreter.run(code2);
497
//        }
498
//        System.out.println("Optimizado: " + (System.currentTimeMillis() - t1));
499

    
500
    }
501

    
502
}