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

History | View | Annotate | Download (9.34 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, '????????????????????????????????')", 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)), '????????????????????????????????')", 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), '????????????????????????????????')", 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), '????????????????????????????????')", s);
249
    }
250

    
251
}