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

History | View | Annotate | Download (11.3 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(TABLE:'countries')", code.toString());
71
    }
72

    
73
    public void testSelect2() {
74
        StringBuilder source = new StringBuilder();
75
        source.append("BEGIN ");
76
        source.append("  SET X = 0; ");
77
        source.append("  FOR row in (SELECT * FROM countries;) ");
78
        source.append("    BEGIN ");
79
        source.append("      IF row.LASTCENSUS > 0 THEN ");
80
        source.append("        SET X = X + row.LASTCENSUS ");
81
        source.append("      END IF ");
82
        source.append("    END FOR ");
83
        source.append("END");
84

    
85
        Compiler compiler = createCompiler();
86

    
87
        Code code = compiler.compileExpression(source.toString());
88
        link(code);
89
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(TABLE:'countries'), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
90
    }
91

    
92
    public void testSelectWhere() {
93
        StringBuilder source = new StringBuilder();
94
        source.append("SELECT * FROM countries  ");
95
        source.append("  WHERE LASTCENSUS > 0;  ");
96

    
97
        Compiler compiler = createCompiler();
98

    
99
        Code code = compiler.compileExpression(source.toString());
100
        link(code);
101
        assertEquals("SELECT(TABLE:'countries', WHERE:(\"LASTCENSUS\" > 0))", code.toString());
102
    }
103

    
104
    public void testSelectCountWhere() {
105
        StringBuilder source = new StringBuilder();
106
        source.append("SELECT COUNT(*) FROM countries  ");
107
        source.append("  WHERE LASTCENSUS > 0 ; ");
108

    
109
        Compiler compiler = createCompiler();
110

    
111
        Code code = compiler.compileExpression(source.toString());
112
        link(code);
113
        assertEquals("SELECT_COUNT(TABLE:'countries', WHERE:(\"LASTCENSUS\" > 0))", code.toString());
114
    }
115

    
116
    public void testSelectWhere2() {
117
        StringBuilder source = new StringBuilder();
118
        source.append("SELECT * FROM countries  ");
119
        source.append("  WHERE countries.LASTCENSUS > 0 ; ");
120

    
121
        Compiler compiler = createCompiler();
122

    
123
        Code code = compiler.compileExpression(source.toString());
124
        link(code);
125
        assertEquals("SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0))", code.toString());
126
    }
127

    
128
    public void testSelectOrder() {
129
        StringBuilder source = new StringBuilder();
130
        source.append("SELECT * FROM countries  ");
131
        source.append("  ORDER BY CONTINENT ASC, LASTCENSUS DESC; ");
132

    
133
        Compiler compiler = createCompiler();
134

    
135
        Code code = compiler.compileExpression(source.toString());
136
        link(code);
137
        assertEquals("SELECT(TABLE:'countries', ORDER1:\"CONTINENT\", ORDER2:\"LASTCENSUS\", ORDER_MODE1:TRUE, ORDER_MODE2:FALSE)", code.toString());
138
    }
139

    
140
    public void testSelectWhereOrder() {
141
        StringBuilder source = new StringBuilder();
142
        source.append("SELECT * FROM countries  ");
143
        source.append("  WHERE LASTCENSUS > 0  ");
144
        source.append("  ORDER BY ID ; ");
145

    
146
        Compiler compiler = createCompiler();
147

    
148
        Code code = compiler.compileExpression(source.toString());
149
        link(code);
150
        assertEquals("SELECT(TABLE:'countries', WHERE:(\"LASTCENSUS\" > 0), ORDER1:\"ID\", ORDER_MODE1:TRUE)", code.toString());
151
    }
152

    
153
    public void testSelectWhereOrderLimit() {
154
        StringBuilder source = new StringBuilder();
155
        source.append("SELECT * FROM countries  ");
156
        source.append("  WHERE LASTCENSUS > 0  ");
157
        source.append("  ORDER BY LASTCENSUS DESC");
158
        source.append("  LIMIT 3 ;");
159

    
160
        Compiler compiler = createCompiler();
161

    
162
        Code code = compiler.compileExpression(source.toString());
163
        link(code);
164
        assertEquals("SELECT(TABLE:'countries', WHERE:(\"LASTCENSUS\" > 0), ORDER1:\"LASTCENSUS\", ORDER_MODE1:FALSE, LIMIT:3)", code.toString());
165
    }
166

    
167
    public void testSelectLimit() {
168
        StringBuilder source = new StringBuilder();
169
        source.append("SELECT * FROM countries  ");
170
        source.append("  LIMIT 3; ");
171

    
172
        Compiler compiler = createCompiler();
173

    
174
        Code code = compiler.compileExpression(source.toString());
175
        link(code);
176
        assertEquals("SELECT(TABLE:'countries', LIMIT:3)", code.toString());
177
    }
178

    
179
    public void testExists() {
180
        StringBuilder source = new StringBuilder();
181
        source.append("EXISTS(NULL)");
182

    
183
        Compiler compiler = createCompiler();
184

    
185
        Code code = compiler.compileExpression(source.toString());
186
        link(code);
187
        String id = "????????????????????????????????";
188
        String s = code.toString();
189
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
190
        assertEquals("EXISTS(NULL, 'EXISTS????????????????????????????????')", s);
191
    }
192

    
193
    public void testExistsSelect1() {
194
        StringBuilder source = new StringBuilder();
195
        source.append("EXISTS(");
196
        source.append(" SELECT 1 FROM countries");
197
        source.append("   WHERE countries.LASTCENSUS > 0 ; ");
198
        source.append(")");
199

    
200
        Compiler compiler = createCompiler();
201

    
202
        Code code = compiler.compileExpression(source.toString());
203
        link(code);
204
        String id = "????????????????????????????????";
205
        String s = code.toString();
206
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
207
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0)), 'EXISTS????????????????????????????????')", s);
208
    }
209

    
210
    public void testExistsSelectLimit1() {
211
        StringBuilder source = new StringBuilder();
212
        source.append("EXISTS(");
213
        source.append(" SELECT 1 FROM countries  ");
214
        source.append("   WHERE countries.LASTCENSUS > 0  ");
215
        source.append("   LIMIT 1; ");
216
        source.append(")");
217

    
218
        Compiler compiler = createCompiler();
219

    
220
        Code code = compiler.compileExpression(source.toString());
221
        link(code);
222
        String id = "????????????????????????????????";
223
        String s = code.toString();
224
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
225
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0), LIMIT:1), 'EXISTS????????????????????????????????')", s);
226
    }
227

    
228
    public void testExistsSelectLimit2() {
229
        // Sobre la tabla de continentes, para obtener la lista de continentes 
230
        // que tienen paises sin censo.
231
        // Filtramos continentes por un campo del pais.
232
        StringBuilder source = new StringBuilder();
233
        source.append("EXISTS(");
234
        source.append(" SELECT 1 FROM countries");
235
        source.append("   WHERE ");
236
        source.append("     continents.NAME = countries.CONTINENT AND ");
237
        source.append("     countries.LASTCENSUS < 0 ");
238
        source.append("   LIMIT 1; ");
239
        source.append(")");
240

    
241
        Compiler compiler = createCompiler();
242

    
243
        Code code = compiler.compileExpression(source.toString());
244
        link(code);
245
        String id = "????????????????????????????????";
246
        String s = code.toString();
247
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
248
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), LIMIT:1), 'EXISTS????????????????????????????????')", s);
249
    }
250

    
251
    public void testExistsSelectLimit3() {
252
        // Sobre la tabla de continentes, para obtener la lista de continentes 
253
        // que tienen paises sin censo.
254
        // Filtramos continentes por un campo del pais.
255
        StringBuilder source = new StringBuilder();
256
        source.append("EXISTS(");
257
        source.append(" SELECT 1 FROM countries");
258
        source.append("   WHERE ");
259
        source.append("     continents.NAME = countries.CONTINENT AND ");
260
        source.append("     countries.LASTCENSUS < 0 ");
261
        source.append("   LIMIT 1; ");
262
        source.append(" ,");
263
        source.append(" 'patata'");
264
        source.append(")");
265

    
266
        Compiler compiler = createCompiler();
267

    
268
        Code code = compiler.compileExpression(source.toString());
269
        link(code);
270
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), LIMIT:1), 'patata')", code.toString());
271
    }
272

    
273
    public void testExistsSelectLimit4() {
274
        StringBuilder source = new StringBuilder();
275
        source.append("EXISTS(");
276
        source.append(" SELECT(");
277
        source.append("   TABLE:'countries', ");
278
        source.append("   WHERE:(countries.LASTCENSUS > 0), ");
279
        source.append("   LIMIT:1 ");
280
        source.append("  ) ");
281
        source.append(" , ");
282
        source.append(" 'EXISTS1234567890ABCDEFGHHIJKLMNOPQRSTU' ");
283
        source.append(") ");
284

    
285
        Compiler compiler = createCompiler();
286

    
287
        Code code = compiler.compileExpression(source.toString());
288
        link(code);
289
        String id = "????????????????????????????????";
290
        String s = code.toString();
291
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
292
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0), LIMIT:1), 'EXISTS????????????????????????????????')", s);
293
    }
294

    
295
}