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 / TestExpressionBuilderFormatter.java @ 44198

History | View | Annotate | Download (17.3 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import java.text.MessageFormat;
4
import java.util.ArrayList;
5
import java.util.List;
6
import junit.framework.TestCase;
7
import org.apache.commons.lang3.ArrayUtils;
8
import org.apache.commons.lang3.StringUtils;
9
import org.cresques.cts.IProjection;
10
import org.gvsig.expressionevaluator.Formatter;
11
import org.gvsig.expressionevaluator.ExpressionBuilder;
12
import org.gvsig.expressionevaluator.ExpressionBuilder.Constant;
13
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
14
import org.gvsig.expressionevaluator.ExpressionBuilder.GeometrySupportType;
15
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
16
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
17
import org.gvsig.expressionevaluator.ExpressionBuilder.Variable;
18
import org.gvsig.expressionevaluator.impl.DefaultExpressionBuilder;
19
import org.gvsig.fmap.crs.CRSFactory;
20
import org.gvsig.fmap.geom.Geometry;
21
import org.gvsig.fmap.geom.GeometryLocator;
22
import org.gvsig.fmap.geom.GeometryManager;
23
import org.gvsig.fmap.geom.GeometryUtils;
24
import org.gvsig.fmap.geom.exception.CreateGeometryException;
25
import org.gvsig.fmap.geom.primitive.Point;
26
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
27

    
28
public class TestExpressionBuilderFormatter extends TestCase {
29

    
30
    private static class MyFormatter implements Formatter<Value> {
31
    
32
        private class Formatter_constant_bytearray implements Formatter<Value> {
33

    
34
            @Override
35
            public boolean canApply(Value value) {
36
                if( value instanceof Constant ) {
37
                    return ((Constant)value).value() instanceof byte[];
38
                }
39
                return false;
40
            }
41

    
42
            @Override
43
            public String format(Value constant) {
44
                return builder.bytearray_x((byte[]) ((Constant)constant).value());
45
            }
46
        }
47

    
48
        private class Formatter_constant_geometry implements Formatter<Value> {
49

    
50
            @Override
51
            public boolean canApply(Value value) {
52
                if( value instanceof Constant ) {
53
                    return ((Constant)value).value() instanceof Geometry;
54
                }
55
                return false;
56
            }
57

    
58
            @Override
59
            public String format(Value constant) {
60
                Geometry geometry = (Geometry) ((Constant)constant).value();
61
                switch (builder.geometry_support_type()) {
62
                    case EWKB:
63
                        return MessageFormat.format(
64
                                "ST_GeomFromEWKB(({0}), ({1}))",
65
                                builder.bytearray_x(GeometryUtils.toEWKB(geometry)),
66
                                String.valueOf(builder.srs_id(geometry.getProjection()))
67
                        );
68
                    case WKB:
69
                        return MessageFormat.format(
70
                                "ST_GeomFromWKB(({0}), ({1}))",
71
                                builder.bytearray_x(GeometryUtils.toWKB(geometry)),
72
                                String.valueOf(builder.srs_id(geometry.getProjection()))
73
                        );
74
                    case WKT:
75
                    default:
76
                        return MessageFormat.format(
77
                                "ST_GeomFromText({0}, ({1}))",
78
                                builder.string(GeometryUtils.toWKT(geometry)),
79
                                String.valueOf(builder.srs_id(geometry.getProjection()))
80
                        );
81
                }
82
            }
83
        }
84

    
85
        private class Formatter_ST_intersects implements Formatter<Value> {
86

    
87
            @Override
88
            public boolean canApply(Value value) {
89
                if( value instanceof Function ) {
90
                    return StringUtils.equalsIgnoreCase("ST_intersects",((Function)value).name());
91
                }
92
                return false;
93
            }
94

    
95
            @Override
96
            public String format(Value function) {
97
                List<Value> parameters = ((Function)function).parameters();
98
                String p1 = parameters.get(0).toString(formatter());
99
                String p2 = parameters.get(1).toString(formatter());
100
                String r = MessageFormat.format(
101
                        "( (({0}) && ({1})) AND ST_Intersects(({0}),({1}) ))", 
102
                        p1,
103
                        p2
104
                );
105
                return r;
106
            }
107
        }
108

    
109
        private class Formatter_ST_GeomFromEWKB implements Formatter<Value> {
110

    
111
            @Override
112
            public boolean canApply(Value value) {
113
                if( value instanceof Function ) {
114
                    return StringUtils.equalsIgnoreCase("ST_GeomFromEWKB",((Function)value).name());
115
                }
116
                return false;
117
            }
118

    
119
            @Override
120
            public String format(Value function) {
121
                List<Value> parameters = ((Function)function).parameters();
122
                String p1 = parameters.get(0).toString(formatter());
123
                String p2 = parameters.get(1).toString(formatter());
124
                String r = MessageFormat.format(
125
                        "GeomFromWKB({0}, {1})", 
126
                        p1,
127
                        p2
128
                );
129
                return r;
130
            }
131
        }
132
    
133
        private class Formatter_IFNULL implements Formatter<Value> {
134

    
135
            @Override
136
            public boolean canApply(Value value) {
137
                if( value instanceof Function ) {
138
                    return StringUtils.equalsIgnoreCase("IFNULL",((Function)value).name());
139
                }
140
                return false;
141
            }
142

    
143
            @Override
144
            public String format(Value function) {
145
                List<Value> parameters = ((Function)function).parameters();
146
                String p1 = parameters.get(0).toString(formatter());
147
                String p2 = parameters.get(1).toString(formatter());
148
                String p3 = parameters.get(2).toString(formatter());
149
                String r = MessageFormat.format(
150
                        "NVL2({0}, {1}, {2})", 
151
                        p1,
152
                        p3,
153
                        p2
154
                );
155
                return r;
156
            }
157
        }
158
    
159
        private class Formatter_ST_AsEWKB implements Formatter<Value> {
160

    
161
            @Override
162
            public boolean canApply(Value value) {
163
                if( value instanceof Function ) {
164
                    return StringUtils.equalsIgnoreCase("ST_AsEWKB",((Function)value).name());
165
                }
166
                return false;
167
            }
168

    
169
            public String format(Value function) {
170
                List<Value> parameters = ((Function)function).parameters();
171
                String p1 = parameters.get(0).toString(formatter());
172
                String r = MessageFormat.format(
173
                        "AsWKB(({0}))", 
174
                        p1
175
                );
176
                return r;
177
            }
178
        }
179
        
180
        private class Formatter_NOT_IS_NULL implements Formatter<Value> {
181

    
182
            @Override
183
            public boolean canApply(Value value) {
184
                if( value instanceof Function ) {
185
                    return StringUtils.equalsIgnoreCase("NOT_IS_NULL",((Function)value).name());
186
                }
187
                return false;
188
            }
189

    
190
            @Override
191
            public String format(Value function) {
192
                List<Value> parameters = ((Function)function).parameters();
193
                String p1 = parameters.get(0).toString(MyFormatter.this);
194
                String r = MessageFormat.format(
195
                        "( ({0}) IS NOT NULL )", 
196
                        p1
197
                );
198
                return r;
199
            }
200
        }
201

    
202
        private final Formatter<Value>[] formatters;
203
        private final ExpressionBuilder builder;
204

    
205
        public MyFormatter(ExpressionBuilder builder) {
206
            this.builder = builder;
207
            this.formatters = new Formatter[] {
208
                new Formatter_IFNULL(),
209
                new Formatter_NOT_IS_NULL(),
210
                new Formatter_ST_AsEWKB(),
211
                new Formatter_ST_GeomFromEWKB(),
212
                new Formatter_constant_bytearray(),
213
                new Formatter_constant_geometry(),
214
                new Formatter_ST_intersects()
215
            };
216
        }
217

    
218
        @Override
219
        public boolean canApply(Value value) {
220
            for (Formatter<Value> formatter : formatters) {
221
                if( formatter.canApply(value) ) {
222
                    return true;
223
                }
224
            }
225
            return false;
226
        }
227

    
228
        @Override
229
        public String format(Value value) {
230
            for (Formatter<Value> formatter : formatters) {
231
                if( formatter.canApply(value) ) {
232
                    return formatter.format(value);
233
                }
234
            }
235
            return value.toString(this);
236
        }
237
        
238
        private Formatter formatter() {
239
            return this;
240
        }
241
    }
242
    
243
    public TestExpressionBuilderFormatter(String testName) {
244
        super(testName);
245
    }
246

    
247
    @Override
248
    protected void setUp() throws Exception {
249
        super.setUp();
250
        new DefaultLibrariesInitializer().fullInitialize();
251
    }
252

    
253
    @Override
254
    protected void tearDown() throws Exception {
255
        super.tearDown();
256
    }
257

    
258
    // TODO add test methods here. The name must begin with 'test'. For example:
259
    // public void testHello() {}
260
    
261
    List<String> getVariableNames(ExpressionBuilder builder) {
262
        List<String> vars = new ArrayList<>();
263
        for (Variable var : builder.variables()) {
264
            vars.add(var.name());
265
        }
266
        return vars;
267
    }
268
    
269
    List<String> getParameterNames(ExpressionBuilder builder) {
270
        List<String> params = new ArrayList<>();
271
        for (Parameter param : builder.parameters()) {
272
            String s;
273
            switch(param.type()) {
274
                case Constant:
275
                    Object value = param.value();
276
                    if( value==null ) {
277
                        s = "null";
278
                    } else if( value instanceof String ) {
279
                        s = "'" + (String)value + "'";
280
                    } else {
281
                        s = value.toString();
282
                    }    
283
                    break;
284
                case Geometry:
285
                case Variable:
286
                default:
287
                    s = "\"" + param.name() + "\"";
288
            }
289
            params.add(s);
290
        }
291
        return params;
292
    }
293
    
294
    public void test2() {
295
        ExpressionBuilder builder = new DefaultExpressionBuilder();
296
        
297
        builder.and(
298
          builder.eq(
299
            builder.lower(builder.variable("colum_name_c")),
300
            builder.parameter("colum_name_p")
301
          )
302
        );
303
        builder.and(
304
            builder.group(
305
                builder.or(
306
                    builder.like(
307
                        builder.lower( builder.variable("uno")),
308
                        builder.constant("%10")
309
                    ),
310
                    builder.lt(
311
                        builder.variable("dos"),
312
                        builder.constant(-3.5)
313
                    )
314
                )
315
            )
316
        );
317
        builder.and(
318
                builder.ST_Intersects(
319
                    builder.variable("geom1"), 
320
                    builder.ST_Envelope(
321
                        builder.ST_GeomFromWKB(
322
                                builder.parameter("geom2"), 
323
                                builder.parameter().value(4326).as_constant()
324
                        )
325
                    )
326
                )
327
        );
328
        builder.and(
329
            builder.gt(
330
                builder.variable("tres"),
331
                builder.constant(123456789)
332
            )
333
        );
334
        assertEquals(
335
                "( (LOWER(\"colum_name_c\")) = (?) ) AND ( ( (LOWER(\"uno\")) LIKE ('%10') ) OR ( (\"dos\") < (-3.5) ) ) AND ST_Intersects((\"geom1\"), (ST_Envelope(ST_GeomFromWKB((?), (?))))) AND ( (\"tres\") > (123456789) )",
336
                builder.toString()
337
        );
338
        assertEquals(
339
                "( (LOWER(\"colum_name_c\")) = (?) ) AND ( ( (LOWER(\"uno\")) LIKE ('%10') ) OR ( (\"dos\") < (-3.5) ) ) AND ( ((\"geom1\") && (ST_Envelope(ST_GeomFromWKB((?), (?))))) AND ST_Intersects((\"geom1\"),(ST_Envelope(ST_GeomFromWKB((?), (?)))) )) AND ( (\"tres\") > (123456789) )",
340
                builder.toString(new MyFormatter(builder))
341
        );
342
        
343
        assertEquals(
344
                "[colum_name_c, dos, geom1, tres, uno]",
345
                ArrayUtils.toString(getVariableNames(builder))
346
        );
347
        assertEquals(
348
                "[\"colum_name_p\", \"geom2\", 4326]",
349
                ArrayUtils.toString(getParameterNames(builder))
350
        );
351
    }
352
    
353
    public void test3() throws CreateGeometryException {
354
        ExpressionBuilder builder = new DefaultExpressionBuilder();
355
                
356
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
357
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
358
        
359
        Point point = geometryManager.createPoint(10, 20, Geometry.SUBTYPES.GEOM2D);
360
        builder.set(        
361
            builder.ST_Intersects(
362
              builder.geometry(point,proj),
363
              builder.variable("the_geom")
364
            )
365
        );
366
        builder.geometry_support_type(GeometrySupportType.WKT);
367
        System.out.println(builder.toString());
368
        assertEquals(
369
                "ST_Intersects((ST_GeomFromText(('POINT (10 20)'), (4326))), (\"the_geom\"))",
370
                builder.toString()
371
        );
372
        assertEquals(
373
                "( ((ST_GeomFromText('POINT (10 20)', (4326))) && (\"the_geom\")) AND ST_Intersects((ST_GeomFromText('POINT (10 20)', (4326))),(\"the_geom\") ))",
374
                builder.toString(new MyFormatter(builder))
375
        );
376

    
377
        builder.geometry_support_type(GeometrySupportType.WKB);
378
        System.out.println(builder.toString());
379
        assertEquals(
380
                "ST_Intersects((ST_GeomFromWKB((DECODE('000000000140240000000000004034000000000000','hex')), (4326))), (\"the_geom\"))",
381
                builder.toString()
382
        );
383
        assertEquals(
384
                "( ((ST_GeomFromWKB((x'000000000140240000000000004034000000000000'), (4326))) && (\"the_geom\")) AND ST_Intersects((ST_GeomFromWKB((x'000000000140240000000000004034000000000000'), (4326))),(\"the_geom\") ))",
385
                builder.toString(new MyFormatter(builder))
386
        );
387
        assertEquals(
388
                "[the_geom]",
389
                ArrayUtils.toString(getVariableNames(builder))
390
        );
391
        assertEquals(
392
                "[]",
393
                ArrayUtils.toString(getParameterNames(builder))
394
        );
395
    }
396
    
397
    public void test4() throws CreateGeometryException {
398
        ExpressionBuilder builder = new DefaultExpressionBuilder();
399
                
400
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
401
        
402
        builder.and(
403
                builder.ST_Intersects(
404
                    builder.variable("geom1"), 
405
                    builder.ST_Envelope(
406
                        builder.ST_GeomFromWKB(
407
                                builder.parameter("geom2"), 
408
                                builder.parameter().value(proj).as_constant()
409
                        )
410
                    )
411
                )
412
        );
413
        
414
        System.out.println(builder.toString());
415
        assertEquals(
416
                "ST_Intersects((\"geom1\"), (ST_Envelope(ST_GeomFromWKB((?), (?)))))",
417
                builder.toString()
418
        );
419
        assertEquals(
420
                "( ((\"geom1\") && (ST_Envelope(ST_GeomFromWKB((?), (?))))) AND ST_Intersects((\"geom1\"),(ST_Envelope(ST_GeomFromWKB((?), (?)))) ))",
421
                builder.toString(new MyFormatter(builder))
422
        );
423
        assertEquals(
424
                "[geom1]",
425
                ArrayUtils.toString(getVariableNames(builder))
426
        );
427
        assertEquals(
428
                "[\"geom2\", 4326]",
429
                ArrayUtils.toString(getParameterNames(builder))
430
        );
431
    }
432
        
433
    public void test5() throws CreateGeometryException {
434
        ExpressionBuilder builder = new DefaultExpressionBuilder();
435
                
436
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
437
        
438
        builder.and(
439
                builder.eq(
440
                        builder.ST_SRID( builder.variable("geom") ),
441
                        builder.srs(proj)
442
                )
443
        );
444
        
445
        System.out.println(builder.toString());
446
        assertEquals(
447
                "( (ST_SRID(\"geom\")) = (4326) )",
448
                builder.toString()
449
        );
450
        assertEquals(
451
                "( (ST_SRID(\"geom\")) = (4326) )",
452
                builder.toString(new MyFormatter(builder))
453
        );
454
        assertEquals(
455
                "[geom]",
456
                ArrayUtils.toString(getVariableNames(builder))
457
        );
458
        assertEquals(
459
                "[]",
460
                ArrayUtils.toString(getParameterNames(builder))
461
        );
462
    }
463
}