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

History | View | Annotate | Download (17.9 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.apache.commons.lang3.tuple.Pair;
10
import org.cresques.cts.IProjection;
11
import org.gvsig.expressionevaluator.Formatter;
12
import org.gvsig.expressionevaluator.ExpressionBuilder;
13
import org.gvsig.expressionevaluator.ExpressionBuilder.Constant;
14
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
15
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
16
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
17
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
18
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
19
import org.gvsig.expressionevaluator.ExpressionBuilder.Variable;
20
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
21
import org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper.GeometrySupportType;
22
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
23
import org.gvsig.fmap.crs.CRSFactory;
24
import org.gvsig.fmap.geom.Geometry;
25
import org.gvsig.fmap.geom.GeometryLocator;
26
import org.gvsig.fmap.geom.GeometryManager;
27
import org.gvsig.fmap.geom.GeometryUtils;
28
import org.gvsig.fmap.geom.exception.CreateGeometryException;
29
import org.gvsig.fmap.geom.primitive.Point;
30
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
31

    
32
public class TestExpressionBuilderFormatter extends TestCase {
33

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

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

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

    
52
        private class Formatter_constant_geometry implements Formatter<Value> {
53

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

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

    
89
        private class Formatter_ST_intersects implements Formatter<Value> {
90

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

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

    
113
        private class Formatter_ST_GeomFromEWKB implements Formatter<Value> {
114

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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