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
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
import org.gvsig.expressionevaluator.ExpressionBuilder;
9
import org.gvsig.expressionevaluator.ExpressionUtils;
10
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

    
16
public class TestOptimizer extends TestCase {
17

    
18
    public TestOptimizer(String testName) {
19
        super(testName);
20
    }
21

    
22
    @Override
23
    protected void setUp() throws Exception {
24
        super.setUp();
25
        new DefaultLibrariesInitializer().fullInitialize();
26
    }
27

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

    
40
    protected Compiler createCompiler() {
41
        Compiler compiler = ExpressionUtils.createCompiler();
42
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
43
        return compiler;
44
    }
45

    
46
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
47
        Interpreter interpreter = ExpressionUtils.createInterpreter();
48
        interpreter.setSymbolTable(symbolTable);
49
        return interpreter;
50
    }
51

    
52
    protected Optimizer createOptimizer(SymbolTable symbolTable) {
53
        Optimizer optimizer = ExpressionUtils.createOptimizer();
54
        optimizer.setSymbolTable(symbolTable);
55
        return optimizer;
56
    }
57

    
58
    protected MutableSymbolTable createSymbolTable() {
59
        MutableSymbolTable symbolTable = ExpressionUtils.createSymbolTable();
60
        symbolTable.setVar("precio", 200);
61
        symbolTable.setVar("1990", 0.168873933773767);
62
        return symbolTable;
63
    }
64

    
65
    private String createExpr1() {
66
        ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
67

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

    
84
        Compiler compiler = createCompiler();
85
        Code code = compiler.compileExpression(source);
86
        assertEquals("\"precio\"", code.toString());
87

    
88
        SymbolTable symbolTable = createSymbolTable();
89
        Optimizer optimizer = createOptimizer(symbolTable);
90
        Code code2 = optimizer.optimize(code);
91
        assertEquals("\"precio\"", code2.toString());
92
    }
93

    
94
    public void testIdentifier2() {
95
        Compiler compiler = createCompiler();
96
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
97

    
98
        String source = "[precio]";
99

    
100
        Code code = compiler.compileExpression(source);
101
        assertEquals("\"precio\"", code.toString());
102

    
103
        SymbolTable symbolTable = createSymbolTable();
104
        Optimizer optimizer = createOptimizer(symbolTable);
105
        Code code2 = optimizer.optimize(code);
106
        assertEquals("\"precio\"", code2.toString());
107
    }
108

    
109
    public void testIdentifier3() {
110
        String source = "\"precio\"";
111

    
112
        Compiler compiler = createCompiler();
113
        Code code = compiler.compileExpression(source);
114
        assertEquals("\"precio\"", code.toString());
115

    
116
        SymbolTable symbolTable = createSymbolTable();
117
        Optimizer optimizer = createOptimizer(symbolTable);
118
        Code code2 = optimizer.optimize(code);
119
        assertEquals("\"precio\"", code2.toString());
120
    }
121

    
122
    public void testTrue() {
123
        String source = "true";
124

    
125
        Compiler compiler = createCompiler();
126
        Code code = compiler.compileExpression(source);
127
        assertEquals("TRUE", code.toString());
128

    
129
        SymbolTable symbolTable = createSymbolTable();
130
        Optimizer optimizer = createOptimizer(symbolTable);
131
        Code code2 = optimizer.optimize(code);
132
        assertEquals("TRUE", code2.toString());
133
    }
134

    
135
    public void testFalse() {
136
        String source = "false";
137

    
138
        Compiler compiler = createCompiler();
139
        Code code = compiler.compileExpression(source);
140
        assertEquals("FALSE", code.toString());
141

    
142
        SymbolTable symbolTable = createSymbolTable();
143
        Optimizer optimizer = createOptimizer(symbolTable);
144
        Code code2 = optimizer.optimize(code);
145
        assertEquals("FALSE", code2.toString());
146
    }
147

    
148
    public void testNull() {
149
        String source = "null";
150

    
151
        Compiler compiler = createCompiler();
152
        Code code = compiler.compileExpression(source);
153
        assertEquals("NULL", code.toString());
154

    
155
        SymbolTable symbolTable = createSymbolTable();
156
        Optimizer optimizer = createOptimizer(symbolTable);
157
        Code code2 = optimizer.optimize(code);
158
        assertEquals("NULL", code2.toString());
159
    }
160

    
161
    public void testNotTrue() {
162
        String source = "not true";
163

    
164
        Compiler compiler = createCompiler();
165
        Code code = compiler.compileExpression(source);
166
        assertEquals("NOT(TRUE)", code.toString());
167

    
168
        SymbolTable symbolTable = createSymbolTable();
169
        Optimizer optimizer = createOptimizer(symbolTable);
170
        Code code2 = optimizer.optimize(code);
171
        assertEquals("FALSE", code2.toString());
172
    }
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

    
181
        SymbolTable symbolTable = createSymbolTable();
182
        Optimizer optimizer = createOptimizer(symbolTable);
183
        Code code2 = optimizer.optimize(code);
184
        assertEquals("23", code2.toString());
185
    }
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
        assertEquals( "(\"precio\" "+operatorName+" 23)", code.toString());
193

    
194
        SymbolTable symbolTable = createSymbolTable();
195
        Optimizer optimizer = createOptimizer(symbolTable);
196
        Code code2 = optimizer.optimize(code);
197
        assertEquals( "(\"precio\" "+operatorName+" 23)", code2.toString());
198
    }
199

    
200
    public void testOperators() {
201

    
202
        operator("=");
203
        operator("<>");
204
        operator(">");
205
        operator(">=");
206
        operator("<");
207
        operator("<=");
208
        operator("LIKE");
209
        operator("ILIKE");
210
        operator("||");
211
        operator("+");
212
        operator("-");
213
        operator("*");
214
//        operator("^");
215
        operator("OR");
216
        operator("AND");
217
        operator("%");
218
        operator("IS");
219
    }
220

    
221
    
222
    public void testAddMul() {
223
        String source = "precio + 10 * 2 + 20 + 30";
224

    
225
        Compiler compiler = createCompiler();
226

    
227
        Code code = compiler.compileExpression(source);
228
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString());
229

    
230
        SymbolTable symbolTable = createSymbolTable();
231
        Optimizer optimizer = createOptimizer(symbolTable);
232
        Code code2 = optimizer.optimize(code);
233
        assertEquals("(((\"precio\" + 20) + 20) + 30)", code2.toString());
234
    }
235
    
236
    public void testMul0() {
237
        String source = "precio + 10 * 0 + 20 + 30";
238

    
239
        Compiler compiler = createCompiler();
240

    
241
        Code code = compiler.compileExpression(source);
242
        assertEquals("(((\"precio\" + (10 * 0)) + 20) + 30)", code.toString());
243

    
244
        SymbolTable symbolTable = createSymbolTable();
245
        Optimizer optimizer = createOptimizer(symbolTable);
246
        Code code2 = optimizer.optimize(code);
247
        assertEquals("((\"precio\" + 20) + 30)", code2.toString());
248
    }
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
        assertEquals("(((\"precio\" + (10 * 1)) + 20) + 30)", code.toString());
257

    
258
        SymbolTable symbolTable = createSymbolTable();
259
        Optimizer optimizer = createOptimizer(symbolTable);
260
        Code code2 = optimizer.optimize(code);
261
        assertEquals("(((\"precio\" + 10) + 20) + 30)", code2.toString());
262
    }
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
        assertEquals("(((\"precio\" + (10 / 1)) + 20) + 30)", code.toString());
271

    
272
        SymbolTable symbolTable = createSymbolTable();
273
        Optimizer optimizer = createOptimizer(symbolTable);
274
        Code code2 = optimizer.optimize(code);
275
        assertEquals("(((\"precio\" + 10) + 20) + 30)", code2.toString());
276
    }
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
        assertEquals("(((\"precio\" + (0 / 10)) + 20) + 30)", code.toString());
285

    
286
        SymbolTable symbolTable = createSymbolTable();
287
        Optimizer optimizer = createOptimizer(symbolTable);
288
        Code code2 = optimizer.optimize(code);
289
        assertEquals("((\"precio\" + 20) + 30)", code2.toString());
290
    }
291

    
292
    public void testAddMulPar() {
293
        String source = "(precio + 10) * 2 + 20 + 30";
294

    
295
        Compiler compiler = createCompiler();
296

    
297
        Code code = compiler.compileExpression(source);
298
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString());
299

    
300
        SymbolTable symbolTable = createSymbolTable();
301
        Optimizer optimizer = createOptimizer(symbolTable);
302
        Code code2 = optimizer.optimize(code);
303
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code2.toString());
304
    }
305

    
306
    public void testAbs() {
307
        String source = "precio + abs(10)";
308

    
309
        Compiler compiler = createCompiler();
310

    
311
        Code code = compiler.compileExpression(source);
312
        assertEquals("(\"precio\" + abs(10))", code.toString());
313

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

    
320
    public void testAbs2() {
321
        String source = "precio + abs(-10)";
322

    
323
        Compiler compiler = createCompiler();
324

    
325
        Code code = compiler.compileExpression(source);
326
        assertEquals("(\"precio\" + abs(-10))", code.toString());
327

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

    
334
    public void testPI() {
335
        String source = "precio + PI()";
336

    
337
        Compiler compiler = createCompiler();
338

    
339
        Code code = compiler.compileExpression(source);
340
        assertEquals("(\"precio\" + PI())", code.toString());
341

    
342
        SymbolTable symbolTable = createSymbolTable();
343
        Optimizer optimizer = createOptimizer(symbolTable);
344
        Code code2 = optimizer.optimize(code);
345
        assertEquals("(\"precio\" + 3.141592653589793)", code2.toString());
346
    }
347

    
348
    public void testCeil() {
349
        String source = "precio + CEIL(PI())";
350

    
351
        Compiler compiler = createCompiler();
352

    
353
        Code code = compiler.compileExpression(source);
354
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString());
355

    
356
        SymbolTable symbolTable = createSymbolTable();
357
        Optimizer optimizer = createOptimizer(symbolTable);
358
        Code code2 = optimizer.optimize(code);
359
        assertEquals("(\"precio\" + 4.0)", code2.toString());
360
    }
361

    
362
    public void testConcat() {
363
        String source = "CONCAT(precio,' euros')";
364

    
365
        Compiler compiler = createCompiler();
366

    
367
        Code code = compiler.compileExpression(source);
368
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString());
369

    
370
        SymbolTable symbolTable = createSymbolTable();
371
        Optimizer optimizer = createOptimizer(symbolTable);
372
        Code code2 = optimizer.optimize(code);
373
        assertEquals("CONCAT(\"precio\", ' euros')", code2.toString());
374
    }
375

    
376
    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
    public void testInvokeFunction1() {
391
        String source = "ST_Area(GEOMETRY)";
392

    
393
        Compiler compiler = createCompiler();
394

    
395
        Code code = compiler.compileExpression(source);
396
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString());
397

    
398
        SymbolTable symbolTable = createSymbolTable();
399
        Optimizer optimizer = createOptimizer(symbolTable);
400
        Code code2 = optimizer.optimize(code);
401
        assertEquals("ST_Area(\"GEOMETRY\")", code2.toString());
402
    }
403

    
404
    public void testInvokeMethod1() {
405
        String source = "'hola'.length()";
406

    
407
        Compiler compiler = createCompiler();
408

    
409
        Code code = compiler.compileExpression(source);
410
        assertEquals("'hola'->length()", code.toString());
411

    
412
        SymbolTable symbolTable = createSymbolTable();
413
        Optimizer optimizer = createOptimizer(symbolTable);
414
        Code code2 = optimizer.optimize(code);
415
        assertEquals("'hola'->length()", code2.toString());
416
    }
417

    
418
}