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

History | View | Annotate | Download (13.7 KB)

1
package org.gvsig.expressionevaluator;
2

    
3
import junit.framework.TestCase;
4
import org.gvsig.expressionevaluator.impl.expressionbuilder.formatters.DALFormatter;
5
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
6

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

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

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

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

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

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

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

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

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

    
67
        Compiler compiler = createCompiler();
68

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

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

    
78
        Compiler compiler = createCompiler();
79

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

    
97
        Compiler compiler = createCompiler();
98

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

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

    
116
        Compiler compiler = createCompiler();
117

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

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

    
128
        Compiler compiler = createCompiler();
129

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

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

    
140
        Compiler compiler = createCompiler();
141

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

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

    
152
        Compiler compiler = createCompiler();
153

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

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

    
164
        Compiler compiler = createCompiler();
165

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

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

    
177
        Compiler compiler = createCompiler();
178

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

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

    
191
        Compiler compiler = createCompiler();
192

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

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

    
203
        Compiler compiler = createCompiler();
204

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

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

    
214
        Compiler compiler = createCompiler();
215

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

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

    
231
        Compiler compiler = createCompiler();
232

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

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

    
248
        Compiler compiler = createCompiler();
249

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

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

    
266
        Compiler compiler = createCompiler();
267

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

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

    
289
        Compiler compiler = createCompiler();
290

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

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

    
314
        Compiler compiler = createCompiler();
315

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

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

    
336
        Compiler compiler = createCompiler();
337

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

    
346
}