Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.jdbc / src / test / java / org / gvsig / fmap / dal / store / jdbc2 / SQLBuilderTest.java @ 43355

History | View | Annotate | Download (19.3 KB)

1
package org.gvsig.fmap.dal.store.jdbc2;
2

    
3
import java.util.ArrayList;
4
import java.util.List;
5
import org.apache.commons.lang3.ArrayUtils;
6
import org.cresques.cts.IProjection;
7
import org.gvsig.fmap.crs.CRSFactory;
8
import org.gvsig.fmap.dal.ExpressionBuilder;
9
import org.gvsig.fmap.dal.ExpressionBuilder.Constant;
10
import org.gvsig.fmap.dal.ExpressionBuilder.Parameter;
11
import org.gvsig.fmap.dal.ExpressionBuilder.Variable;
12
import org.gvsig.fmap.dal.SQLBuilder;
13
import org.gvsig.fmap.dal.SQLBuilder.Privilege;
14
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
15
import org.gvsig.fmap.geom.DataTypes;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.GeometryLocator;
18
import org.gvsig.fmap.geom.GeometryManager;
19
import org.gvsig.fmap.geom.primitive.Polygon;
20
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
21

    
22
public class SQLBuilderTest extends AbstractLibraryAutoInitTestCase {
23
    
24
    @Override
25
    protected void doSetUp() throws Exception {
26

    
27
    }
28
    
29
    List<String> getVariableNames(ExpressionBuilder builder) {
30
        List<String> vars = new ArrayList<>();
31
        for (Variable var : builder.getVariables()) {
32
            vars.add(var.getName());
33
        }
34
        return vars;
35
    }
36
    
37
    List<String> getParameterNames(ExpressionBuilder builder) {
38
        List<String> params = new ArrayList<>();
39
        for (Parameter param : builder.getParameters()) {
40
            String s;
41
            switch(param.getType()) {
42
                case Constant:
43
                    Object value = param.getValue();
44
                    if( value==null ) {
45
                        s = "null";
46
                    } else if( value instanceof String ) {
47
                        s = "'" + (String)value + "'";
48
                    } else {
49
                        s = value.toString();
50
                    }    
51
                    break;
52
                case Geometry:
53
                case Variable:
54
                default:
55
                    s = "\"" + param.getName() + "\"";
56
            }
57
            params.add(s);
58
        }
59
        return params;
60
    }
61
    
62
 
63
    public void testCalulateEnvelope() throws Exception {
64
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
65
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
66
        
67
        Polygon limit = geometryManager.createPolygon(Geometry.SUBTYPES.GEOM2D);
68
        limit.addVertex(0, 0);
69
        limit.addVertex(0, 100);
70
        limit.addVertex(100, 100);
71
        limit.addVertex(100, 0);
72
        limit.addVertex(0, 0);
73
        
74
        SQLBuilder builder = new SQLBuilderBase();
75
        
76
        builder.select().column().value(
77
            builder.getAsGeometry(
78
              builder.ST_ExtentAggregate(
79
                builder.column("the_geom")
80
              )
81
            )
82
        ).as("envelope");
83
        builder.select().from().table().database("master").schema("dbo").name("test1");
84
        builder.select().where().set(
85
            builder.ST_Intersects(
86
                builder.ST_Envelope(
87
                    builder.column("the_geom")
88
                ),
89
                builder.geometry(limit, proj)
90
            )
91
        );
92
        builder.select().where().and(
93
                builder.custom("x = 27")
94
        );
95
        
96
        // SELECT ST_AsBinary(ST_Extent("the_geom")) AS "envelope" FROM "master"."dbo"."test1" WHERE ST_Intersects((ST_Envelope("the_geom")), (ST_GeomFromText('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))', (4326)))) AND x = 27
97
        
98
        System.out.println("# Test:: testCalulateEnvelope");
99
        System.out.println("# SQL:: " + builder.toString());
100
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
101
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
102
        assertEquals(
103
                "SELECT ST_AsBinary(ST_Extent(\"the_geom\")) AS \"envelope\" FROM \"master\".\"dbo\".\"test1\" WHERE ST_Intersects((ST_Envelope(\"the_geom\")), (ST_GeomFromText('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))', (4326)))) AND x = 27",
104
                builder.toString()
105
        );
106
        assertEquals(
107
                "[the_geom]",
108
                ArrayUtils.toString(getVariableNames(builder))
109
        );
110
        assertEquals(
111
                "[]",
112
                ArrayUtils.toString(getParameterNames(builder))
113
        );
114
    }
115

    
116
    public void testCount() throws Exception {
117
        SQLBuilder builder = new SQLBuilderBase();
118
        
119
        builder.select().column().value(builder.count().all());
120
        builder.select().from().table().database("master").schema("dbo").name("test1");
121
        builder.select().from().subquery(null);
122
        builder.select().where().set( builder.custom("pp = 200"));
123

    
124
        System.out.println("# Test:: testCount");
125
        System.out.println("# SQL:: " + builder.toString());
126
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
127
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
128

    
129
        //# Test:: testCount
130
        //# SQL:: SELECT COUNT(*) FROM "master"."dbo"."test1" WHERE pp = 200
131
        //# Variables:: []
132
        //# Parametros:: []
133

    
134
        assertEquals(
135
                "SELECT COUNT(*) FROM \"master\".\"dbo\".\"test1\" WHERE pp = 200",
136
                builder.toString()
137
        );
138
        assertEquals(
139
                "[]",
140
                ArrayUtils.toString(getVariableNames(builder))
141
        );
142
        assertEquals(
143
                "[]",
144
                ArrayUtils.toString(getParameterNames(builder))
145
        );
146
    }
147
    
148
    public void testCreateTable() throws Exception {
149
        SQLBuilder builder = new SQLBuilderBase();
150

    
151
        builder.create_table().table().database("master").schema("dbo").name("test1");
152
        builder.create_table().add_column(
153
                "name",
154
                DataTypes.STRING,
155
                45,
156
                0,
157
                false,
158
                false,
159
                true,
160
                false,
161
                null
162
        );
163
        builder.create_table().add_column(
164
                "id",
165
                DataTypes.INT,
166
                0,
167
                0,
168
                true,
169
                false,
170
                false,
171
                true,
172
                0
173
        );
174
        builder.create_table().add_column(
175
                "geom",
176
                DataTypes.GEOMETRY,
177
                0,
178
                0,
179
                false,
180
                false,
181
                true,
182
                false,
183
                null
184
        );
185

    
186
        
187
        // CREATE TABLE "master"."dbo"."test1" ("name" VARCHAR(45) DEFAULT NULL NULL, "id" SERIAL DEFAULT '0' NOT NULL PRIMARY KEY, "geom" TEXT DEFAULT NULL NULL )
188
        System.out.println("# Test:: testCreateTable");
189
        System.out.println("# SQL:: " + builder.toString());
190
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
191
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
192
        assertEquals(
193
                "CREATE TABLE \"master\".\"dbo\".\"test1\" (\"name\" VARCHAR(45) DEFAULT NULL NULL, \"id\" SERIAL DEFAULT '0' NOT NULL PRIMARY KEY, \"geom\" TEXT DEFAULT NULL NULL )",
194
                builder.toString()
195
        );
196
        assertEquals(
197
                "[]",
198
                ArrayUtils.toString(getVariableNames(builder))
199
        );
200
        assertEquals(
201
                "[]",
202
                ArrayUtils.toString(getParameterNames(builder))
203
        );
204
    }
205

    
206
    public void testDropTable() throws Exception {
207
        SQLBuilder builder = new SQLBuilderBase();
208
        
209
        builder.drop_table().table().database("master").schema("dbo").name("test1");
210

    
211
        // DROP TABLE "master"."dbo"."test1"; DELETE FROM GEOMETRY_COLUMNS WHERE f_table_schema = 'dbo' AND f_table_name = 'test1'
212
        
213
        System.out.println("# Test:: testDropTable");
214
        System.out.println("# SQL:: " + builder.toString());
215
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
216
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
217
        assertEquals(
218
                "DROP TABLE \"master\".\"dbo\".\"test1\"; DELETE FROM GEOMETRY_COLUMNS WHERE f_table_schema = 'dbo' AND f_table_name = 'test1'",
219
                builder.toString()
220
        );
221
        assertEquals(
222
                "[]",
223
                ArrayUtils.toString(getVariableNames(builder))
224
        );
225
        assertEquals(
226
                "[]",
227
                ArrayUtils.toString(getParameterNames(builder))
228
        );
229
    }
230
    
231
    public void testFetchFeatureProviderByReference() throws Exception {
232
        SQLBuilder builder = new SQLBuilderBase();
233
        
234
        String value = "yoyo";
235
        builder.select().column().name("name");
236
        builder.select().column().name("id");
237
        builder.select().column().name("geom").as_geometry();
238
        builder.select().from().table().database("master").schema("dbo").name("test1");
239
        builder.select().where().set(
240
            builder.eq(
241
                builder.column("name"),
242
                builder.parameter(value).as_constant()
243
            )
244
        );
245
        builder.select().limit(1);
246

    
247
        // SELECT "name", "id", ST_AsBinary("geom") FROM "master"."dbo"."test1" WHERE ( ("name") = (?) ) LIMIT 1
248

    
249
        System.out.println("# Test:: testFetchFeatureProviderByReference");
250
        System.out.println("# SQL:: " + builder.toString());
251
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
252
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
253
        assertEquals(
254
                "SELECT \"name\", \"id\", ST_AsBinary(\"geom\") FROM \"master\".\"dbo\".\"test1\" WHERE ( (\"name\") = (?) ) LIMIT 1",
255
                builder.toString()
256
        );
257
        assertEquals(
258
                "[geom, id, name]",
259
                ArrayUtils.toString(getVariableNames(builder))
260
        );
261
        assertEquals(
262
                "['yoyo']",
263
                ArrayUtils.toString(getParameterNames(builder))
264
        );
265
    }
266
    
267
    public void testFetchFeatureType() throws Exception {
268
        SQLBuilder builder = new SQLBuilderBase();
269

    
270
        builder.select().column().all();
271
        builder.select().from().table().database("master").schema("dbo").name("test1");
272
        builder.select().limit(1);
273

    
274
        System.out.println("# Test:: testFetchFeatureType");
275
        System.out.println("# SQL:: " + builder.toString());
276
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
277
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
278
        
279
        //# Test:: testFetchFeatureType
280
        //# SQL:: SELECT * FROM [master].[dbo].[test1] LIMMIT 1
281
        //# Variables:: []
282
        //# Parametros:: []        
283
        
284
        assertEquals(
285
                "SELECT * FROM \"master\".\"dbo\".\"test1\" LIMIT 1",
286
                builder.toString()
287
        );
288
        assertEquals(
289
                "[]",
290
                ArrayUtils.toString(getVariableNames(builder))
291
        );
292
        assertEquals(
293
                "[]",
294
                ArrayUtils.toString(getParameterNames(builder))
295
        );
296
    }
297
        
298
    public void testPerformDeletes() throws Exception {
299
        SQLBuilder builder = new SQLBuilderBase();
300

    
301
        builder.delete().table().database("master").schema("dbo").name("test1");
302
        builder.delete().where().and(
303
            builder.eq( 
304
                builder.column("id1"),
305
                builder.parameter("id1").as_variable()
306
            )
307
        );
308
        builder.delete().where().and(
309
            builder.eq( 
310
                builder.column("id2"),
311
                builder.parameter("id2").as_variable()
312
            )
313
        );
314

    
315
        // DELETE FROM "master"."dbo"."test1" WHERE ( ("id1") = (?) ) AND ( ("id2") = (?) )
316

    
317
        System.out.println("# Test:: testPerformDeletes");
318
        System.out.println("# SQL:: " + builder.toString());
319
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
320
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
321
        assertEquals(
322
                "DELETE FROM \"master\".\"dbo\".\"test1\" WHERE ( (\"id1\") = (?) ) AND ( (\"id2\") = (?) )",
323
                builder.toString()
324
        );
325
        assertEquals(
326
                "[id1, id2]",
327
                ArrayUtils.toString(getVariableNames(builder))
328
        );
329
        assertEquals(
330
                "[\"id1\", \"id2\"]",
331
                ArrayUtils.toString(getParameterNames(builder))
332
        );
333
    }
334

    
335
    public void testPerformInserts1() throws Exception {
336
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
337

    
338
        SQLBuilder builder = new SQLBuilderBase();
339

    
340
        builder.insert().table().database("master").schema("dbo").name("test1");
341
        builder.insert().column().name("id").with_value(builder.parameter("id"));
342
        builder.insert().column().name("name").with_value(builder.parameter("name"));
343
        builder.insert().column().name("geom").with_value(builder.parameter("geom").as_geometry_variable().srs(proj));
344
        
345
        // INSERT INTO "master"."dbo"."test1" ( "id", "name", "geom" ) VALUES ( ?, ?, ST_GeomFromText(?, (4326)) )
346
        
347
        System.out.println("# Test:: testPerformInserts1");
348
        System.out.println("# SQL:: " + builder.toString());
349
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
350
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
351
        assertEquals(
352
                "INSERT INTO \"master\".\"dbo\".\"test1\" ( \"id\", \"name\", \"geom\" ) VALUES ( ?, ?, ST_GeomFromText(?, (4326)) )",
353
                builder.toString()
354
        );
355
        assertEquals(
356
                "[geom, id, name]",
357
                ArrayUtils.toString(getVariableNames(builder))
358
        );
359
        assertEquals(
360
                "[\"id\", \"name\", \"geom\"]",
361
                ArrayUtils.toString(getParameterNames(builder))
362
        );
363
    }
364

    
365
    public void testPerformInserts2() throws Exception {
366
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
367

    
368
        SQLBuilder builder = new SQLBuilderBase();
369

    
370
        builder.insert().table().database("master").schema("dbo").name("test1");
371
        builder.insert().column().name("id").with_value(builder.parameter("id"));
372
        builder.insert().column().name("name").with_value(builder.parameter("name"));
373
        builder.insert().column().name("geom").with_value(builder.parameter("geom").as_geometry_variable().srs(proj));
374
        
375
        // INSERT INTO "master"."dbo"."test1" ( "id", "name", "geom" ) VALUES ( ?, ?, ST_GeomFromText(?, (?)) )
376
        
377
        System.out.println("# Test:: testPerformInserts2");
378
        System.out.println("# SQL:: " + builder.toString());
379
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
380
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
381
        assertEquals(
382
                "INSERT INTO \"master\".\"dbo\".\"test1\" ( \"id\", \"name\", \"geom\" ) VALUES ( ?, ?, ST_GeomFromText(?, (?)) )",
383
                builder.toString()
384
        );
385
        assertEquals(
386
                "[geom, id, name]",
387
                ArrayUtils.toString(getVariableNames(builder))
388
        );
389
        assertEquals(
390
                "[\"id\", \"name\", \"geom\", 4326]",
391
                ArrayUtils.toString(getParameterNames(builder))
392
        );
393
    }
394

    
395
    public void testPerformUpdates() throws Exception {
396
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
397

    
398
        SQLBuilder builder = new SQLBuilderBase();
399

    
400
        builder.update().table().database("master").schema("dbo").name("test1");
401
        builder.update().where().and(
402
            builder.eq(
403
                builder.column("id"), 
404
                builder.parameter("id").as_variable()
405
            )
406
        );
407
        builder.update().column().name("name").with_value(builder.parameter("name"));
408
        builder.update().column().name("geom").with_value(
409
                builder.parameter("geom").as_geometry_variable().srs(proj) 
410
        );
411

    
412
        // UPDATE "master"."dbo"."test1" SET "name" = ?, "geom" = ST_GeomFromText(?, (?)) WHERE ( ("id") = (?) )
413

    
414
        System.out.println("# Test:: testPerformUpdates");
415
        System.out.println("# SQL:: " + builder.toString());
416
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
417
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
418
        assertEquals(
419
                "UPDATE \"master\".\"dbo\".\"test1\" SET \"name\" = ?, \"geom\" = ST_GeomFromText(?, (?)) WHERE ( (\"id\") = (?) )",
420
                builder.toString()
421
        );
422
        assertEquals(
423
                "[geom, id, name]",
424
                ArrayUtils.toString(getVariableNames(builder))
425
        );
426
        assertEquals(
427
                "[\"name\", \"geom\", 4326, \"id\"]",
428
                ArrayUtils.toString(getParameterNames(builder))
429
        );
430
    }
431

    
432
    public void testGrant1() throws Exception {
433

    
434
        SQLBuilder builder = new SQLBuilderBase();
435

    
436
        builder.grant().table().database("master").schema("dbo").name("test1");
437
        builder.grant().role("prueba").select().insert().update();
438
        builder.grant().role("gis").all();
439
                
440
        
441
        System.out.println("# Test:: testGrant1");
442
        System.out.println("# SQL:: " + builder.toString());
443
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
444
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
445
        assertEquals(
446
                "",
447
                builder.toString()
448
        );
449
        assertEquals(
450
                "[]",
451
                ArrayUtils.toString(getVariableNames(builder))
452
        );
453
        assertEquals(
454
                "[]",
455
                ArrayUtils.toString(getParameterNames(builder))
456
        );
457
    }
458

    
459
    public void testGrant2() throws Exception {
460

    
461
        SQLBuilder builder = new SQLBuilderBase();
462

    
463
        builder.grant().table().database("master").schema("dbo").name("test1");
464
        builder.grant().role("prueba").privilege(Privilege.SELECT)
465
                .privilege(Privilege.INSERT)
466
                .privilege(Privilege.UPDATE);
467
        builder.grant().role("gis").privilege(Privilege.ALL);
468
                
469
        
470
        System.out.println("# Test:: testGrant2");
471
        System.out.println("# SQL:: " + builder.toString());
472
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
473
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
474
        assertEquals(
475
                "",
476
                builder.toString()
477
        );
478
        assertEquals(
479
                "[]",
480
                ArrayUtils.toString(getVariableNames(builder))
481
        );
482
        assertEquals(
483
                "[]",
484
                ArrayUtils.toString(getParameterNames(builder))
485
        );
486
    }
487

    
488

    
489
}