Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / test / java / org / gvsig / expressionevaluator / TestGrammarCompiler.java @ 44750

History | View | Annotate | Download (13.5 KB)

1
package org.gvsig.expressionevaluator;
2

    
3
import junit.framework.TestCase;
4
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
5

    
6
/**
7
 *
8
 * @author jjdelcerro
9
 */
10
public class TestGrammarCompiler extends TestCase {
11

    
12
    public TestGrammarCompiler(String testName) {
13
        super(testName);
14
    }
15

    
16
    @Override
17
    protected void setUp() throws Exception {
18
        super.setUp();
19
        new DefaultLibrariesInitializer().fullInitialize();
20
    }
21

    
22
    @Override
23
    protected void tearDown() throws Exception {
24
        super.tearDown();
25
    }
26

    
27
    // TODO add test methods here. The name must begin with 'test'. For example:
28
    // public void testHello() {}
29
    
30
    protected LexicalAnalyzer createLexicalAnalyzer() {
31
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
32
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
33
        return lexer;
34
    }
35

    
36
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
37
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
38
        Compiler compiler = manager.createCompiler();
39
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
40
        return compiler;
41
    }
42

    
43
    protected SymbolTable createSymbolTable() {
44
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
45
        MutableSymbolTable symbolTable = manager.createSymbolTable();
46
        symbolTable.setVar("precio", 200);
47
        symbolTable.setVar("1990", 0.168873933773767);
48
        return symbolTable;
49
    }
50

    
51
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
52
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
53
        Interpreter interpreter = manager.createInterpreter();
54
        interpreter.setSymbolTable(symbolTable);
55
        return interpreter;
56
    }
57
    
58
    private void link(Code code) {
59
      code.link(createSymbolTable());
60
    }
61

    
62
    public void testSelect() {
63
        StringBuilder source = new StringBuilder();
64
        source.append("SELECT * FROM countries;");
65

    
66
        Compiler compiler = createCompiler();
67

    
68
        Code code = compiler.compileExpression(source.toString());
69
        link(code);
70
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
71
    }
72

    
73
    public void testSelect1() {
74
        StringBuilder source = new StringBuilder();
75
        source.append("SELECT * FROM countries");
76

    
77
        Compiler compiler = createCompiler();
78

    
79
        Code code = compiler.compileExpression(source.toString());
80
        link(code);
81
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
82
    }
83
    
84
    public void testSelect2() {
85
        StringBuilder source = new StringBuilder();
86
        source.append("BEGIN ");
87
        source.append("  SET X = 0; ");
88
        source.append("  FOR row in (SELECT * FROM countries;) "); // Con ;
89
        source.append("    BEGIN ");
90
        source.append("      IF row.LASTCENSUS > 0 THEN ");
91
        source.append("        SET X = X + row.LASTCENSUS ");
92
        source.append("      END IF ");
93
        source.append("    END FOR ");
94
        source.append("END");
95

    
96
        Compiler compiler = createCompiler();
97

    
98
        Code code = compiler.compileExpression(source.toString());
99
        link(code);
100
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
101
    }
102

    
103
    public void testSelect3() {
104
        StringBuilder source = new StringBuilder();
105
        source.append("BEGIN ");
106
        source.append("  SET X = 0; ");
107
        source.append("  FOR row in (SELECT * FROM countries) "); // Sin ;
108
        source.append("    BEGIN ");
109
        source.append("      IF row.LASTCENSUS > 0 THEN ");
110
        source.append("        SET X = X + row.LASTCENSUS ");
111
        source.append("      END IF ");
112
        source.append("    END FOR ");
113
        source.append("END");
114

    
115
        Compiler compiler = createCompiler();
116

    
117
        Code code = compiler.compileExpression(source.toString());
118
        link(code);
119
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
120
    }
121

    
122
    public void testSelectWhere() {
123
        StringBuilder source = new StringBuilder();
124
        source.append("SELECT * FROM countries  ");
125
        source.append("  WHERE LASTCENSUS > 0;  ");
126

    
127
        Compiler compiler = createCompiler();
128

    
129
        Code code = compiler.compileExpression(source.toString());
130
        link(code);
131
        assertEquals("SELECT(NULL, \"countries\", (\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
132
    }
133

    
134
    public void testSelectCountWhere() {
135
        StringBuilder source = new StringBuilder();
136
        source.append("SELECT COUNT(*) FROM countries  ");
137
        source.append("  WHERE LASTCENSUS > 0 ; ");
138

    
139
        Compiler compiler = createCompiler();
140

    
141
        Code code = compiler.compileExpression(source.toString());
142
        link(code);
143
        assertEquals("SELECT_COUNT(\"countries\", (\"LASTCENSUS\" > 0))", code.toString());
144
    }
145

    
146
    public void testSelectWhere2() {
147
        StringBuilder source = new StringBuilder();
148
        source.append("SELECT * FROM countries  ");
149
        source.append("  WHERE countries.LASTCENSUS > 0 ; ");
150

    
151
        Compiler compiler = createCompiler();
152

    
153
        Code code = compiler.compileExpression(source.toString());
154
        link(code);
155
        assertEquals("SELECT(NULL, \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
156
    }
157

    
158
    public void testSelectOrder() {
159
        StringBuilder source = new StringBuilder();
160
        source.append("SELECT * FROM countries  ");
161
        source.append("  ORDER BY CONTINENT ASC, LASTCENSUS DESC; ");
162

    
163
        Compiler compiler = createCompiler();
164

    
165
        Code code = compiler.compileExpression(source.toString());
166
        link(code);
167
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(\"CONTINENT\", \"LASTCENSUS\"), TUPLE(TRUE, FALSE), NULL)", code.toString());
168
    }
169

    
170
    public void testSelectWhereOrder() {
171
        StringBuilder source = new StringBuilder();
172
        source.append("SELECT * FROM countries  ");
173
        source.append("  WHERE LASTCENSUS > 0  ");
174
        source.append("  ORDER BY ID ; ");
175

    
176
        Compiler compiler = createCompiler();
177

    
178
        Code code = compiler.compileExpression(source.toString());
179
        link(code);
180
        assertEquals("SELECT(NULL, \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"ID\"), TUPLE(TRUE), NULL)", code.toString());
181
    }
182

    
183
    public void testSelectWhereOrderLimit() {
184
        StringBuilder source = new StringBuilder();
185
        source.append("SELECT * FROM countries  ");
186
        source.append("  WHERE LASTCENSUS > 0  ");
187
        source.append("  ORDER BY LASTCENSUS DESC");
188
        source.append("  LIMIT 3 ;");
189

    
190
        Compiler compiler = createCompiler();
191

    
192
        Code code = compiler.compileExpression(source.toString());
193
        link(code);
194
        assertEquals("SELECT(NULL, \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"LASTCENSUS\"), TUPLE(FALSE), 3)", code.toString());
195
    }
196

    
197
    public void testSelectLimit() {
198
        StringBuilder source = new StringBuilder();
199
        source.append("SELECT * FROM countries  ");
200
        source.append("  LIMIT 3; ");
201

    
202
        Compiler compiler = createCompiler();
203

    
204
        Code code = compiler.compileExpression(source.toString());
205
        link(code);
206
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), 3)", code.toString());
207
    }
208

    
209
    public void testExists() {
210
        StringBuilder source = new StringBuilder();
211
        source.append("EXISTS(NULL)");
212

    
213
        Compiler compiler = createCompiler();
214

    
215
        Code code = compiler.compileExpression(source.toString());
216
        link(code);
217
        String id = "????????????????????????????????";
218
        String s = code.toString();
219
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
220
        assertEquals("EXISTS(NULL, 'EXISTS????????????????????????????????')", s);
221
    }
222

    
223
    public void testExistsSelect1() {
224
        StringBuilder source = new StringBuilder();
225
        source.append("EXISTS(");
226
        source.append(" SELECT 1 FROM countries");
227
        source.append("   WHERE countries.LASTCENSUS > 0 ; ");
228
        source.append(")");
229

    
230
        Compiler compiler = createCompiler();
231

    
232
        Code code = compiler.compileExpression(source.toString());
233
        link(code);
234
        String id = "????????????????????????????????";
235
        String s = code.toString();
236
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
237
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
238
    }
239

    
240
    public void testExistsSelect2() {
241
        StringBuilder source = new StringBuilder();
242
        source.append("EXISTS(");
243
        source.append(" SELECT 1 FROM countries");
244
        source.append("   WHERE countries.LASTCENSUS > 0 ");
245
        source.append(")");
246

    
247
        Compiler compiler = createCompiler();
248

    
249
        Code code = compiler.compileExpression(source.toString());
250
        link(code);
251
        String id = "????????????????????????????????";
252
        String s = code.toString();
253
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
254
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
255
    }
256

    
257
    public void testExistsSelectLimit1() {
258
        StringBuilder source = new StringBuilder();
259
        source.append("EXISTS(");
260
        source.append(" SELECT 1 FROM countries  ");
261
        source.append("   WHERE countries.LASTCENSUS > 0  ");
262
        source.append("   LIMIT 1; ");
263
        source.append(")");
264

    
265
        Compiler compiler = createCompiler();
266

    
267
        Code code = compiler.compileExpression(source.toString());
268
        link(code);
269
        String id = "????????????????????????????????";
270
        String s = code.toString();
271
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
272
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
273
    }
274

    
275
    public void testExistsSelectLimit2() {
276
        // Sobre la tabla de continentes, para obtener la lista de continentes 
277
        // que tienen paises sin censo.
278
        // Filtramos continentes por un campo del pais.
279
        StringBuilder source = new StringBuilder();
280
        source.append("EXISTS(");
281
        source.append(" SELECT 1 FROM countries");
282
        source.append("   WHERE ");
283
        source.append("     continents.NAME = countries.CONTINENT AND ");
284
        source.append("     countries.LASTCENSUS < 0 ");
285
        source.append("   LIMIT 1; ");
286
        source.append(")");
287

    
288
        Compiler compiler = createCompiler();
289

    
290
        Code code = compiler.compileExpression(source.toString());
291
        link(code);
292
        String id = "????????????????????????????????";
293
        String s = code.toString();
294
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
295
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
296
    }
297

    
298
    public void testExistsSelectLimit3() {
299
        // Sobre la tabla de continentes, para obtener la lista de continentes 
300
        // que tienen paises sin censo.
301
        // Filtramos continentes por un campo del pais.
302
        StringBuilder source = new StringBuilder();
303
        source.append("EXISTS(");
304
        source.append(" SELECT 1 FROM countries");
305
        source.append("   WHERE ");
306
        source.append("     continents.NAME = countries.CONTINENT AND ");
307
        source.append("     countries.LASTCENSUS < 0 ");
308
        source.append("   LIMIT 1 ");
309
        source.append(" ,");
310
        source.append(" 'patata'");
311
        source.append(")");
312

    
313
        Compiler compiler = createCompiler();
314

    
315
        Code code = compiler.compileExpression(source.toString());
316
        link(code);
317
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'patata')", code.toString());
318
    }
319

    
320
    public void testExistsSelectLimit4() {
321
        StringBuilder source = new StringBuilder();
322
        source.append("EXISTS(");
323
        source.append(" SELECT(");
324
        source.append("   TUPLE(1), ");
325
        source.append("   countries, ");
326
        source.append("   (countries.LASTCENSUS > 0), ");
327
        source.append("   TUPLE(), ");
328
        source.append("   TUPLE(), ");
329
        source.append("   1 ");
330
        source.append("  ) ");
331
        source.append(" , ");
332
        source.append(" 'EXISTS1234567890ABCDEFGHHIJKLMNOPQRSTU' ");
333
        source.append(") ");
334

    
335
        Compiler compiler = createCompiler();
336

    
337
        Code code = compiler.compileExpression(source.toString());
338
        link(code);
339
        String id = "????????????????????????????????";
340
        String s = code.toString();
341
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
342
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
343
    }
344

    
345
}