Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.geometry / org.gvsig.expressionevaluator.geometry.lib / org.gvsig.expressionevaluator.geometry.lib.impl / src / test / java / org / gvsig / expresionevaluator / impl / TestExpressionBuilderFormatter.java @ 44644

History | View | Annotate | Download (17.7 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 static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
15
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
16
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
17
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
18
import org.gvsig.expressionevaluator.ExpressionBuilder.Variable;
19
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
20
import org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper.GeometrySupportType;
21
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
22
import org.gvsig.fmap.crs.CRSFactory;
23
import org.gvsig.fmap.geom.Geometry;
24
import org.gvsig.fmap.geom.GeometryLocator;
25
import org.gvsig.fmap.geom.GeometryManager;
26
import org.gvsig.fmap.geom.GeometryUtils;
27
import org.gvsig.fmap.geom.exception.CreateGeometryException;
28
import org.gvsig.fmap.geom.primitive.Point;
29
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
30

    
31
public class TestExpressionBuilderFormatter extends TestCase {
32

    
33
    private static class MyFormatter implements Formatter<Value> {
34
    
35
        private class Formatter_constant_bytearray implements Formatter<Value> {
36

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

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

    
51
        private class Formatter_constant_geometry implements Formatter<Value> {
52

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

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

    
88
        private class Formatter_ST_intersects implements Formatter<Value> {
89

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

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

    
112
        private class Formatter_ST_GeomFromEWKB implements Formatter<Value> {
113

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

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

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

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

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

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

    
186
            @Override
187
            public boolean canApply(Value value) {
188
                if( value instanceof Function ) {
189
                    return StringUtils.equalsIgnoreCase("NOT_IS_NULL",((Function)value).name());
190
                }
191
                return false;
192
            }
193

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

    
206
        private final Formatter<Value>[] formatters;
207
        private final GeometryExpressionBuilder builder;
208

    
209
        public MyFormatter(GeometryExpressionBuilder builder) {
210
            this.builder = builder;
211
            this.formatters = new Formatter[] {
212
                new Formatter_IFNULL(),
213
                new Formatter_NOT_IS_NULL(),
214
                new Formatter_ST_AsEWKB(),
215
                new Formatter_ST_GeomFromEWKB(),
216
                new Formatter_constant_bytearray(),
217
                new Formatter_constant_geometry(),
218
                new Formatter_ST_intersects()
219
            };
220
        }
221

    
222
        @Override
223
        public boolean canApply(Value value) {
224
            for (Formatter<Value> formatter : formatters) {
225
                if( formatter.canApply(value) ) {
226
                    return true;
227
                }
228
            }
229
            return false;
230
        }
231

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

    
251
    @Override
252
    protected void setUp() throws Exception {
253
        super.setUp();
254
        new DefaultLibrariesInitializer().fullInitialize();
255
    }
256

    
257
    @Override
258
    protected void tearDown() throws Exception {
259
        super.tearDown();
260
    }
261

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

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