Statistics
| Revision:

gvsig-mssqlserver / trunk / org.gvsig.mssqlserver / org.gvsig.mssqlserver.provider / src / test / java / org / gvsig / fmap / dal / store / jdbc2 / SQLBuilderTest.java @ 192

History | View | Annotate | Download (19.4 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.expressionevaluator.ExpressionBuilder;
9
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
10
import org.gvsig.expressionevaluator.ExpressionBuilder.Variable;
11
import org.gvsig.fmap.dal.SQLBuilder;
12
import org.gvsig.fmap.dal.SQLBuilder.Privilege;
13
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
14
import org.gvsig.fmap.geom.DataTypes;
15
import org.gvsig.fmap.geom.Geometry;
16
import org.gvsig.fmap.geom.GeometryLocator;
17
import org.gvsig.fmap.geom.GeometryManager;
18
import org.gvsig.fmap.geom.primitive.Polygon;
19
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
337
        SQLBuilder builder = new SQLBuilderBase();
338

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

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

    
367
        SQLBuilder builder = new SQLBuilderBase();
368

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

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

    
397
        SQLBuilder builder = new SQLBuilderBase();
398

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

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

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

    
431
    public void testGrant1() throws Exception {
432

    
433
        SQLBuilder builder = new SQLBuilderBase();
434

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

    
458
    public void testGrant2() throws Exception {
459

    
460
        SQLBuilder builder = new SQLBuilderBase();
461

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

    
487

    
488
}