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 / TestCodeFormatter.java @ 44644

History | View | Annotate | Download (15.9 KB)

1 44006 jjdelcerro
package org.gvsig.expresionevaluator.impl;
2 43128 jjdelcerro
3 44198 jjdelcerro
import java.text.MessageFormat;
4 44006 jjdelcerro
import junit.framework.TestCase;
5 44198 jjdelcerro
import org.apache.commons.lang3.StringUtils;
6
import org.gvsig.expressionevaluator.Code;
7
import org.gvsig.expressionevaluator.Code.Caller;
8
import org.gvsig.expressionevaluator.Code.Constant;
9
import org.gvsig.expressionevaluator.Codes;
10 44006 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionBuilder;
11 44198 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
13
import org.gvsig.expressionevaluator.ExpressionUtils;
14
import org.gvsig.expressionevaluator.Formatter;
15
import org.gvsig.expressionevaluator.LexicalAnalyzer;
16 44006 jjdelcerro
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
17 43128 jjdelcerro
18 44198 jjdelcerro
public class TestCodeFormatter extends TestCase {
19 44006 jjdelcerro
20 44198 jjdelcerro
    private static class MyFormatter implements Formatter<Code> {
21
22
        private class Formatter_constant_bytearray implements Formatter<Code> {
23
24
            @Override
25
            public boolean canApply(Code code) {
26
                if( code instanceof Constant ) {
27
                    return ((Constant)code).value() instanceof byte[];
28
                }
29
                return false;
30
            }
31
32
            @Override
33
            public String format(Code code) {
34
                return builder.bytearray_x((byte[]) ((Constant)code).value());
35
            }
36
        }
37
38
        private class Formatter_ST_intersects_H2Spatial implements Formatter<Code> {
39
            // Need for H2Spatial
40
            @Override
41
            public boolean canApply(Code code) {
42
                if( code instanceof Caller ) {
43
                    return StringUtils.equalsIgnoreCase("ST_intersects",((Caller)code).name());
44
                }
45
                return false;
46
            }
47
48
            @Override
49
            public String format(Code code) {
50
                Codes parameters = ((Caller)code).parameters();
51
                String p1 = parameters.get(0).toString(MyFormatter.this);
52
                String p2 = parameters.get(1).toString(MyFormatter.this);
53
                String r = MessageFormat.format(
54
                        "( (({0}) && ({1})) AND ST_Intersects(({0}),({1}) ))",
55
                        p1,
56
                        p2
57
                );
58
                return r;
59
            }
60
        }
61
62
        private class Formatter_ST_intersects_SpatiaLite implements Formatter<Code> {
63
            // Need for SpatiaLite
64
65
            private final String table;
66
            private final String geomcolumn;
67
68
            public Formatter_ST_intersects_SpatiaLite(String table, String geomcolumn) {
69
                this.table = table;
70
                this.geomcolumn = geomcolumn;
71
            }
72
73
            @Override
74
            public boolean canApply(Code code) {
75
                if( code instanceof Caller ) {
76
                    return StringUtils.equalsIgnoreCase("ST_intersects2",((Caller)code).name());
77
                }
78
                return false;
79
            }
80
81
            @Override
82
            public String format(Code code) {
83
                Codes parameters = ((Caller)code).parameters();
84
                String p1 = parameters.get(0).toString(MyFormatter.this);
85
                String p2 = parameters.get(1).toString(MyFormatter.this);
86
                String r = MessageFormat.format(
87
                    "(ST_Intersects({0},{1}) AND ROWID IN ( SELECT ROWID FROM SpatialIndex WHERE f_table_name = ''{2}'' AND f_geometry_column = ''{3}'' AND search_frame = \"{2}\".\"{3}\"))",
88
                    p1,
89
                    p2,
90
                    table,
91
                    geomcolumn
92
                );
93
                return r;
94
            }
95
        }
96
97
        private class Formatter_DECODE implements Formatter<Code> {
98
            // Need for SpatiaLite
99
            @Override
100
            public boolean canApply(Code code) {
101
                if( code instanceof Caller ) {
102
                    if( StringUtils.equalsIgnoreCase("DECODE",((Caller)code).name()) ) {
103
                        Codes parameters = ((Caller)code).parameters();
104
                        Code code_p1 = parameters.get(0);
105
                        Code code_p2 = parameters.get(1);
106
                        if( code_p1 instanceof Constant && code_p2 instanceof Constant ) {
107
                            Object p1 = ((Constant)code_p1).value();
108
                            Object p2 = ((Constant)code_p2).value();
109
                            if( p1 instanceof String && p1 instanceof String &&
110
                                StringUtils.equalsIgnoreCase((CharSequence) p2,"hex") ) {
111
                                return true;
112
                            }
113
                        }
114
                    }
115
                }
116
                return false;
117
            }
118
119
            @Override
120
            public String format(Code code) {
121
                Codes parameters = ((Caller)code).parameters();
122
                Object p1 = ((Constant)parameters.get(0)).value();
123
                return "x'"+ (String)p1 + "'";
124
            }
125
        }
126
127
        private class Formatter_IFNULL implements Formatter<Code> {
128
            // Need for H2Spatial
129
            @Override
130
            public boolean canApply(Code code) {
131
                if( code instanceof Caller ) {
132
                    return StringUtils.equalsIgnoreCase("IFNULL",((Caller)code).name());
133
                }
134
                return false;
135
            }
136
137
            @Override
138
            public String format(Code code) {
139
                Codes parameters = ((Caller)code).parameters();
140
                String p1 = parameters.get(0).toString(MyFormatter.this);
141
                String p2 = parameters.get(1).toString(MyFormatter.this);
142
                String p3 = parameters.get(2).toString(MyFormatter.this);
143
                String r = MessageFormat.format(
144
                        "NVL2({0}, {1}, {2})",
145
                        p1,
146
                        p3,
147
                        p2
148
                );
149
                return r;
150
            }
151
        }
152
153
        private class Formatter_ILIKE implements Formatter<Code> {
154
            // Need for SpatiaLite
155
            @Override
156
            public boolean canApply(Code code) {
157
                if( code instanceof Caller ) {
158
                    return StringUtils.equalsIgnoreCase("ILIKE",((Caller)code).name());
159
                }
160
                return false;
161
            }
162
163
            @Override
164
            public String format(Code code) {
165
                Codes parameters = ((Caller)code).parameters();
166
                String p1 = parameters.get(0).toString(MyFormatter.this);
167
                String p2 = parameters.get(1).toString(MyFormatter.this);
168
                String r = MessageFormat.format(
169
                        "LOWER({0}) LIKE LOWER({1})",
170
                        p1,
171
                        p2
172
                );
173
                return r;
174
            }
175
        }
176
177
        private class Formatter_NOT_IS_NULL implements Formatter<Code> {
178
            // Need for H2Spatial
179
            @Override
180
            public boolean canApply(Code code) {
181
                if( code instanceof Caller ) {
182
                    return StringUtils.equalsIgnoreCase("NOT_IS_NULL",((Caller)code).name());
183
                }
184
                return false;
185
            }
186
187
            @Override
188
            public String format(Code code) {
189
                Codes parameters = ((Caller)code).parameters();
190
                String p1 = parameters.get(0).toString(MyFormatter.this);
191
                String r = MessageFormat.format(
192
                        "( ({0}) IS NOT NULL )",
193
                        p1
194
                );
195
                return r;
196
            }
197
        }
198
199
        private final Formatter<Code>[] formatters;
200
        private final ExpressionBuilder builder;
201
202
        public MyFormatter() {
203
            this.builder = ExpressionUtils.createExpressionBuilder();
204
            this.formatters = new Formatter[] {
205
//                new Formatter_constant_bytearray(),
206
//                new Formatter_constant_geometry(),
207
                new Formatter_IFNULL(),
208
                new Formatter_NOT_IS_NULL(),
209
                new Formatter_ST_intersects_H2Spatial(),
210
                new Formatter_ST_intersects_SpatiaLite("mytable", "the_geom"),
211
                new Formatter_ILIKE(),
212
                new Formatter_DECODE(),
213
            };
214
        }
215
216
        @Override
217
        public boolean canApply(Code code) {
218
            for (Formatter<Code> formatter : formatters) {
219
                if( formatter.canApply(code) ) {
220
                    return true;
221
                }
222
            }
223
            return false;
224
        }
225
226
        @Override
227
        public String format(Code code) {
228
            for (Formatter<Code> formatter : formatters) {
229
                if( formatter.canApply(code) ) {
230
                    return formatter.format(code);
231
                }
232
            }
233
            return code.toString(this);
234
        }
235
236
    }
237
238
    public TestCodeFormatter(String testName) {
239 44006 jjdelcerro
        super(testName);
240
    }
241
242 43128 jjdelcerro
    @Override
243 44006 jjdelcerro
    protected void setUp() throws Exception {
244
        super.setUp();
245
        new DefaultLibrariesInitializer().fullInitialize();
246
    }
247 43128 jjdelcerro
248 44006 jjdelcerro
    @Override
249
    protected void tearDown() throws Exception {
250
        super.tearDown();
251 43128 jjdelcerro
    }
252 44006 jjdelcerro
253
    // TODO add test methods here. The name must begin with 'test'. For example:
254
    // public void testHello() {}
255 43128 jjdelcerro
256 44198 jjdelcerro
    protected LexicalAnalyzer createLexicalAnalyzer() {
257
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
258
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
259
        return lexer;
260 43128 jjdelcerro
    }
261 44198 jjdelcerro
262
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
263
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
264
        org.gvsig.expressionevaluator.Compiler compiler = manager.createCompiler();
265
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
266
        return compiler;
267
    }
268 43128 jjdelcerro
269 44198 jjdelcerro
    private Formatter<Code> formatter() {
270
        return new MyFormatter();
271 43128 jjdelcerro
    }
272 44198 jjdelcerro
273
    public Code compileExpression(String source) {
274
        org.gvsig.expressionevaluator.Compiler compiler = createCompiler();
275
        Code code = compiler.compileExpression(source);
276
        return code;
277
    }
278 43128 jjdelcerro
279 44198 jjdelcerro
    public void testIdentifier1() {
280
        String source = "precio";
281
282
        Code code = compileExpression(source);
283
        assertEquals("\"precio\"", code.toString(formatter()));
284
    }
285
286
    public void testIdentifier2() {
287
        org.gvsig.expressionevaluator.Compiler compiler = createCompiler();
288
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
289
290
        String source = "[precio]";
291
292
        Code code = compiler.compileExpression(source);
293
        assertEquals("\"precio\"", code.toString(formatter()));
294
    }
295
296
    public void testIdentifier3() {
297
        String source = "\"precio\"";
298
299
        Code code = compileExpression(source);
300
        assertEquals("\"precio\"", code.toString(formatter()));
301
    }
302
303
304
    public void testTrue() {
305
        String source = "true";
306
307
        Code code = compileExpression(source);
308
        assertEquals("TRUE", code.toString(formatter()));
309
    }
310
311
    public void testFalse() {
312
        String source = "false";
313
314
        Code code = compileExpression(source);
315
        assertEquals("FALSE", code.toString(formatter()));
316
    }
317
318
    public void testNull() {
319
        String source = "null";
320
321
        Code code = compileExpression(source);
322
        assertEquals("NULL", code.toString(formatter()));
323
    }
324
325
    public void testNotTrue() {
326
        String source = "not true";
327
328
        Code code = compileExpression(source);
329
        assertEquals("NOT(TRUE)", code.toString(formatter()));
330
    }
331
332
    public void testInteger() {
333
        String source = "23";
334
335
        Code code = compileExpression(source);
336
        assertEquals("23", code.toString(formatter()));
337
    }
338
339
    public void operator(String operatorName) {
340
        String source = "precio " + operatorName + " 23";
341
342
        Code code = compileExpression(source);
343
        assertEquals("(\"precio\" "+ operatorName + " 23)", code.toString(formatter()));
344
    }
345
346
    public void testOperators() {
347
348
        operator("=");
349
        operator("<>");
350
        operator(">");
351
        operator(">=");
352
        operator("<");
353
        operator("<=");
354
        operator("LIKE");
355
//        operator("ILIKE");
356
        operator("||");
357
        operator("+");
358
        operator("-");
359
        operator("*");
360
        operator("OR");
361
        operator("AND");
362
        operator("%");
363
        operator("IS");
364
365
        operator("~");
366
    }
367
368
    public void testILike() {
369
        String source = "precio ILike 23";
370
371
        Code code = compileExpression(source);
372
        assertEquals("LOWER(\"precio\") LIKE LOWER(23)", code.toString(formatter()));
373
    }
374
375
    public void testAddMul() {
376
        String source = "precio + 10 * 2 + 20 + 30";
377
378
        Code code = compileExpression(source);
379
        assertEquals("(((\"precio\" + (10 * 2)) + 20) + 30)", code.toString(formatter()));
380
    }
381
382
    public void testAddMulPar() {
383
        String source = "(precio + 10) * 2 + 20 + 30";
384
385
        Code code = compileExpression(source);
386
        assertEquals("((((\"precio\" + 10) * 2) + 20) + 30)", code.toString(formatter()));
387
    }
388
389
    public void testAbs() {
390
        String source = "precio + abs(10)";
391
392
        Code code = compileExpression(source);
393
        assertEquals("(\"precio\" + abs(10))", code.toString(formatter()));
394
    }
395
396
    public void testAbs2() {
397
        String source = "precio + abs(-10)";
398
399
        Code code = compileExpression(source);
400 44211 jjdelcerro
        assertEquals("(\"precio\" + abs(-10))", code.toString(formatter()));
401 44198 jjdelcerro
    }
402
403
    public void testPI() {
404
        String source = "precio + PI()";
405
406
        Code code = compileExpression(source);
407
        assertEquals("(\"precio\" + PI())", code.toString(formatter()));
408
    }
409
410
    public void testCeil() {
411
        String source = "precio + CEIL(PI())";
412
413
        Code code = compileExpression(source);
414
        assertEquals("(\"precio\" + CEIL(PI()))", code.toString(formatter()));
415
    }
416
417
    public void testGetitem1() {
418
        String source = "LIST('uno','dos','tres')[1]" ;
419
420
        Code code = compileExpression(source);
421
        assertEquals("GETITEM(LIST('uno', 'dos', 'tres'), 1)", code.toString(formatter()));
422
    }
423
424
    public void testConcat() {
425
        String source = "CONCAT(precio,' euros')";
426
427
        Code code = compileExpression(source);
428
        assertEquals("CONCAT(\"precio\", ' euros')", code.toString(formatter()));
429
    }
430
431
    public void test1() {
432
        String source = "NOMBRE03 = 'Torre d''En Besora (la)'";
433
434
        Code code = compileExpression(source);
435
        assertEquals("(\"NOMBRE03\" = 'Torre d''En Besora (la)')", code.toString(formatter()));
436
    }
437
438 43128 jjdelcerro
    public void test2() {
439 44198 jjdelcerro
        org.gvsig.expressionevaluator.Compiler compiler = createCompiler();
440
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
441
442
        String source = "[1990] = 0.168873933773767";
443
444
        Code code = compiler.compileExpression(source);
445
        assertEquals("(\"1990\" = 0.168873933773767)", code.toString(formatter()));
446 43128 jjdelcerro
    }
447 44198 jjdelcerro
448
    public void test2fields() {
449
        org.gvsig.expressionevaluator.Compiler compiler = createCompiler();
450
        compiler.getLexicalAnalyzer().setUseBracketsForIdentifiers(true);
451
452
        String source = "[1990] = [precio]";
453
454
        Code code = compiler.compileExpression(source);
455
        assertEquals("(\"1990\" = \"precio\")", code.toString(formatter()));
456
    }
457 43128 jjdelcerro
458 44198 jjdelcerro
459
    public void testInvokeFunction1() {
460
        String source = "ST_Area(GEOMETRY)";
461
462
        Code code = compileExpression(source);
463
        assertEquals("ST_Area(\"GEOMETRY\")", code.toString(formatter()));
464
    }
465 43128 jjdelcerro
466
}