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
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
        String source = "[precio]";
130

    
131
        Compiler compiler = createCompiler();
132
        Code code = compiler.compileExpression(source);
133
        assertEquals("\"precio\"", code.toString());
134

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

    
141
    public void testIdentifier3() {
142
        String source = "\"precio\"";
143

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

    
148
        SymbolTable symbolTable = createSymbolTable();
149
        Optimizer optimizer = createOptimizer(symbolTable);
150
        Code code2 = optimizer.optimize(code);
151
        assertEquals("\"precio\"", code2.toString());
152
    }
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

    
161
        SymbolTable symbolTable = createSymbolTable();
162
        Optimizer optimizer = createOptimizer(symbolTable);
163
        Code code2 = optimizer.optimize(code);
164
        assertEquals("true", code2.toString());
165
    }
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

    
174
        SymbolTable symbolTable = createSymbolTable();
175
        Optimizer optimizer = createOptimizer(symbolTable);
176
        Code code2 = optimizer.optimize(code);
177
        assertEquals("false", code2.toString());
178
    }
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

    
187
        SymbolTable symbolTable = createSymbolTable();
188
        Optimizer optimizer = createOptimizer(symbolTable);
189
        Code code2 = optimizer.optimize(code);
190
        assertEquals("null", code2.toString());
191
    }
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

    
200
        SymbolTable symbolTable = createSymbolTable();
201
        Optimizer optimizer = createOptimizer(symbolTable);
202
        Code code2 = optimizer.optimize(code);
203
        assertEquals("false", code2.toString());
204
    }
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

    
213
        SymbolTable symbolTable = createSymbolTable();
214
        Optimizer optimizer = createOptimizer(symbolTable);
215
        Code code2 = optimizer.optimize(code);
216
        assertEquals("23", code2.toString());
217
    }
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
        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
    }
231

    
232
    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
    
253
    public void testAddMul() {
254
        String source = "precio + 10 * 2 + 20 + 30";
255

    
256
        Compiler compiler = createCompiler();
257

    
258
        Code code = compiler.compileExpression(source);
259
        assertEquals("+(+(+(\"precio\", *(10, 2)), 20), 30)", code.toString());
260

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

    
270
        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
    public void testAddMulPar() {
324
        String source = "(precio + 10) * 2 + 20 + 30";
325

    
326
        Compiler compiler = createCompiler();
327

    
328
        Code code = compiler.compileExpression(source);
329
        assertEquals("+(+(*(+(\"precio\", 10), 2), 20), 30)", code.toString());
330

    
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
    }
336

    
337
    public void testAbs() {
338
        String source = "precio + abs(10)";
339

    
340
        Compiler compiler = createCompiler();
341

    
342
        Code code = compiler.compileExpression(source);
343
        assertEquals("+(\"precio\", abs(10))", code.toString());
344

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

    
351
    public void testAbs2() {
352
        String source = "precio + abs(-10)";
353

    
354
        Compiler compiler = createCompiler();
355

    
356
        Code code = compiler.compileExpression(source);
357
        assertEquals("+(\"precio\", abs(negate(10)))", code.toString());
358

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

    
365
    public void testPI() {
366
        String source = "precio + PI()";
367

    
368
        Compiler compiler = createCompiler();
369

    
370
        Code code = compiler.compileExpression(source);
371
        assertEquals("+(\"precio\", PI())", code.toString());
372

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

    
379
    public void testCeil() {
380
        String source = "precio + CEIL(PI())";
381

    
382
        Compiler compiler = createCompiler();
383

    
384
        Code code = compiler.compileExpression(source);
385
        assertEquals("+(\"precio\", CEIL(PI()))", code.toString());
386

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

    
393
    public void testConcat() {
394
        String source = "CONCAT(precio,' euros')";
395

    
396
        Compiler compiler = createCompiler();
397

    
398
        Code code = compiler.compileExpression(source);
399
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
400

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

    
407
    public void testInvokeFunction1() {
408
        String source = "ST_Area(GEOMETRY)";
409

    
410
        Compiler compiler = createCompiler();
411

    
412
        Code code = compiler.compileExpression(source);
413
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
414

    
415
        SymbolTable symbolTable = createSymbolTable();
416
        Optimizer optimizer = createOptimizer(symbolTable);
417
        Code code2 = optimizer.optimize(code);
418
        assertEquals("ST_Area(\"GEOMETRY\")", code2.toString());
419
    }
420

    
421
    public void testInvokeMethod1() {
422
        String source = "'hola'.length()";
423

    
424
        Compiler compiler = createCompiler();
425

    
426
        Code code = compiler.compileExpression(source);
427
        assertEquals("'hola'->length()", code.toString());
428

    
429
        SymbolTable symbolTable = createSymbolTable();
430
        Optimizer optimizer = createOptimizer(symbolTable);
431
        Code code2 = optimizer.optimize(code);
432
        assertEquals("'hola'->length()", code2.toString());
433
    }
434

    
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
        Compiler compiler = createCompiler();
454
        Code code = compiler.compileExpression(source);
455
        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
    }
484

    
485
}