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

History | View | Annotate | Download (14.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
    public void testAddMul() {
253
        String source = "precio + 10 * 2 + 20 + 30";
254

    
255
        Compiler compiler = createCompiler();
256

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

    
260
        SymbolTable symbolTable = createSymbolTable();
261
        Optimizer optimizer = createOptimizer(symbolTable);
262
        Code code2 = optimizer.optimize(code);
263
        assertEquals("+(+(+(\"precio\", 20), 20), 30)", code2.toString());
264
    }
265

    
266
    public void testAddMulPar() {
267
        String source = "(precio + 10) * 2 + 20 + 30";
268

    
269
        Compiler compiler = createCompiler();
270

    
271
        Code code = compiler.compileExpression(source);
272
        assertEquals("+(+(*(+(\"precio\", 10), 2), 20), 30)", code.toString());
273

    
274
        SymbolTable symbolTable = createSymbolTable();
275
        Optimizer optimizer = createOptimizer(symbolTable);
276
        Code code2 = optimizer.optimize(code);
277
        assertEquals("+(+(*(+(\"precio\", 10), 2), 20), 30)", code2.toString());
278
    }
279

    
280
    public void testAbs() {
281
        String source = "precio + abs(10)";
282

    
283
        Compiler compiler = createCompiler();
284

    
285
        Code code = compiler.compileExpression(source);
286
        assertEquals("+(\"precio\", abs(10))", code.toString());
287

    
288
        SymbolTable symbolTable = createSymbolTable();
289
        Optimizer optimizer = createOptimizer(symbolTable);
290
        Code code2 = optimizer.optimize(code);
291
        assertEquals("+(\"precio\", 10)", code2.toString());
292
    }
293

    
294
    public void testAbs2() {
295
        String source = "precio + abs(-10)";
296

    
297
        Compiler compiler = createCompiler();
298

    
299
        Code code = compiler.compileExpression(source);
300
        assertEquals("+(\"precio\", abs(-10))", code.toString());
301

    
302
        SymbolTable symbolTable = createSymbolTable();
303
        Optimizer optimizer = createOptimizer(symbolTable);
304
        Code code2 = optimizer.optimize(code);
305
        assertEquals("+(\"precio\", 10)", code2.toString());
306
    }
307

    
308
    public void testPI() {
309
        String source = "precio + PI()";
310

    
311
        Compiler compiler = createCompiler();
312

    
313
        Code code = compiler.compileExpression(source);
314
        assertEquals("+(\"precio\", PI())", code.toString());
315

    
316
        SymbolTable symbolTable = createSymbolTable();
317
        Optimizer optimizer = createOptimizer(symbolTable);
318
        Code code2 = optimizer.optimize(code);
319
        assertEquals("+(\"precio\", 3.141592653589793)", code2.toString());
320
    }
321

    
322
    public void testCeil() {
323
        String source = "precio + CEIL(PI())";
324

    
325
        Compiler compiler = createCompiler();
326

    
327
        Code code = compiler.compileExpression(source);
328
        assertEquals("+(\"precio\", CEIL(PI()))", code.toString());
329

    
330
        SymbolTable symbolTable = createSymbolTable();
331
        Optimizer optimizer = createOptimizer(symbolTable);
332
        Code code2 = optimizer.optimize(code);
333
        assertEquals("+(\"precio\", 4.0)", code2.toString());
334
    }
335

    
336
    public void testConcat() {
337
        String source = "CONCAT(precio,' euros')";
338

    
339
        Compiler compiler = createCompiler();
340

    
341
        Code code = compiler.compileExpression(source);
342
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
343

    
344
        SymbolTable symbolTable = createSymbolTable();
345
        Optimizer optimizer = createOptimizer(symbolTable);
346
        Code code2 = optimizer.optimize(code);
347
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
348
    }
349

    
350
    public void testInvokeFunction1() {
351
        String source = "ST_Area(GEOMETRY)";
352

    
353
        Compiler compiler = createCompiler();
354

    
355
        Code code = compiler.compileExpression(source);
356
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
357

    
358
        SymbolTable symbolTable = createSymbolTable();
359
        Optimizer optimizer = createOptimizer(symbolTable);
360
        Code code2 = optimizer.optimize(code);
361
        assertEquals("ST_Area(\"GEOMETRY\")", code2.toString());
362
    }
363

    
364
    public void testInvokeMethod1() {
365
        String source = "'hola'.length()";
366

    
367
        Compiler compiler = createCompiler();
368

    
369
        Code code = compiler.compileExpression(source);
370
        assertEquals("'hola'->length()", code.toString());
371

    
372
        SymbolTable symbolTable = createSymbolTable();
373
        Optimizer optimizer = createOptimizer(symbolTable);
374
        Code code2 = optimizer.optimize(code);
375
        assertEquals("'hola'->length()", code2.toString());
376
    }
377

    
378
    public void testSpatialExpression1() throws Exception {
379
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
380
        ExpressionBuilder builder = new DefaultExpressionBuilder();
381
        builder.getConfig().set(ExpressionBuilder.Config.geometry_type_support, ExpressionBuilder.GeometrySupportType.WKB);
382

    
383
        String source = builder.and(
384
                builder.custom(this.createExpr1()),
385
                builder.ST_Intersects(
386
                        builder.geometry(createPolygon()),
387
                        builder.column("GEOMETRY")
388
                )
389
        ).toString();
390

    
391
        MutableSymbolTable symbolTable = createSymbolTable();
392
        symbolTable.setVar("campo1", 11);
393
        symbolTable.setVar("GEOMETRY", createPoint(50, 50));
394

    
395
        Interpreter interpreter = createInterpreter(symbolTable);
396
        Compiler compiler = createCompiler();
397
        Code code = compiler.compileExpression(source);
398
        System.out.println(code.toString());
399
        assertEquals(
400
                "and(>(\"campo1\", 10), ST_Intersects(ST_GeomFromWKB(DECODE('000000000300000001000000050000000000000000000000000000000000000000000000004059000000000000405900000000000040590000000000004059000000000000000000000000000000000000000000000000000000000000', 'hex'), 4326), \"GEOMETRY\"))",
401
                code.toString()
402
        );
403

    
404
//        long t1 = System.currentTimeMillis();
405
//        for (int i = 0; i < 1000; i++) {
406
//            interpreter.run(code);
407
//        }
408
//        System.out.println("Sin optimizar: " + (System.currentTimeMillis() - t1));
409

    
410
//        t1 = System.currentTimeMillis();
411
        Optimizer optimizer = createOptimizer(symbolTable);
412
        Code code2 = optimizer.optimize(code);
413
//        System.out.println("Tiempo de optimizacion: " + (System.currentTimeMillis() - t1));
414
        System.out.println(code2.toString());
415
        assertEquals(
416
                "and(>(\"campo1\", 10), ST_Intersects('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'::geometry, \"GEOMETRY\"))",
417
                code2.toString()
418
        );
419

    
420
//        t1 = System.currentTimeMillis();
421
//        for (int i = 0; i < 1000; i++) {
422
//            interpreter.run(code2);
423
//        }
424
//        System.out.println("Optimizado: " + (System.currentTimeMillis() - t1));
425

    
426
    }
427

    
428
}