Statistics
| Revision:

gvsig-mssqlserver / trunk / org.gvsig.mssqlserver / org.gvsig.mssqlserver.provider / src / test / java / org / gvsig / mssqlserver / dal / MSSQLServerSQLBuilderTest.java @ 5

History | View | Annotate | Download (22.1 KB)

1
package org.gvsig.mssqlserver.dal;
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.DALLocator;
9
import org.gvsig.fmap.dal.ExpressionBuilder;
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.spi.DataManagerProviderServices;
14
import org.gvsig.fmap.dal.store.db.DBHelper;
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 static org.gvsig.mssqlserver.dal.MSSQLServerLibrary.NAME;
21
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
22

    
23
public class MSSQLServerSQLBuilderTest extends AbstractLibraryAutoInitTestCase {
24

    
25
    private MSSQLServerSQLHelper helper;
26
    
27
    @Override
28
    protected void doSetUp() throws Exception {
29
        DataManagerProviderServices dataman = 
30
                (DataManagerProviderServices) DALLocator.getDataManager();
31

    
32
        DBHelper.registerParametersDefinition(
33
                NAME + "StoreParameters",
34
                MSSQLServerStoreParameters.class,
35
                dataman.getResourceAsStream(this, NAME + "Parameters.xml")
36
        );
37
        
38
        MSSQLServerStoreParameters params = new MSSQLServerStoreParameters();
39
        params.setHost("127.0.0.1");
40
        params.setDynValue("InstanceName", "SQLEXPRESS");
41
        params.setDBName("master");
42
        params.setSchema("dbo");
43
        params.setTable("test1");
44
        params.setPort(1433);
45
        params.setUser("sa");
46
        params.setPassword("123");
47
        helper = new MSSQLServerSQLHelper(params);
48
    }
49
    
50
    List<String> getVariableNames(ExpressionBuilder builder) {
51
        List<String> vars = new ArrayList<>();
52
        for (Variable var : builder.getVariables()) {
53
            vars.add(var.getName());
54
        }
55
        return vars;
56
    }
57
    
58
    List<String> getParameterNames(ExpressionBuilder builder) {
59
        List<String> params = new ArrayList<>();
60
        for (Parameter param : builder.getParameters()) {
61
            String s;
62
            switch(param.getType()) {
63
                case Constant:
64
                    Object value = param.getValue();
65
                    if( value==null ) {
66
                        s = "null";
67
                    } else if( value instanceof String ) {
68
                        s = "'" + (String)value + "'";
69
                    } else {
70
                        s = value.toString();
71
                    }    
72
                    break;
73
                case Geometry:
74
                case Variable:
75
                default:
76
                    s = "\"" + param.getName() + "\"";
77
            }
78
            params.add(s);
79
        }
80
        return params;
81
    }
82
    
83
    public SQLBuilder createSQLBuilder() {
84
        return new MSSQLServerSQLBuilder(helper);
85
    }
86
 
87
    public void testCalulateEnvelope() throws Exception {
88
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
89
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
90
        
91
        Polygon limit = geometryManager.createPolygon(Geometry.SUBTYPES.GEOM2D);
92
        limit.addVertex(0, 0);
93
        limit.addVertex(0, 100);
94
        limit.addVertex(100, 100);
95
        limit.addVertex(100, 0);
96
        limit.addVertex(0, 0);
97
        
98
        SQLBuilder builder = createSQLBuilder();
99
        
100
        builder.select().column().value(
101
            builder.getAsGeometry(
102
              builder.ST_ExtentAggregate(
103
                builder.column("the_geom")
104
              )
105
            )
106
        ).as("envelope");
107
        builder.select().from().table().database("master").schema("dbo").name("test1");
108
        builder.select().where().set(
109
            builder.ST_Intersects(
110
                builder.ST_Envelope(
111
                    builder.column("the_geom")
112
                ),
113
                builder.geometry(limit, proj)
114
            )
115
        );
116
        builder.select().where().and(
117
                builder.custom("x = 27").add( builder.variable("x") )
118
        );
119
        
120
        System.out.println("# Test:: testCalulateEnvelope");
121
        System.out.println("# SQL:: " + builder.toString());
122
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
123
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
124
    
125
        //# Test:: testCalulateEnvelope
126
        //# SQL:: SELECT (geometry::EnvelopeAggregate([the_geom])).STAsBinary() AS [envelope] FROM [master].[dbo].[test1] WHERE (([the_geom]).STEnvelope()).STIntersects(geometry::STGeomFromWKB(0x000000000300000001000000050000000000000000000000000000000000000000000000004059000000000000405900000000000040590000000000004059000000000000000000000000000000000000000000000000000000000000, 4326)) AND x = 27
127
        //# Variables:: [the_geom, x]
128
        //# Parametros:: []    
129
        assertEquals(
130
                "SELECT (geometry::EnvelopeAggregate([the_geom])).STAsBinary() AS [envelope] FROM [master].[dbo].[test1] WHERE (([the_geom]).STEnvelope()).STIntersects(geometry::STGeomFromWKB(0x000000000300000001000000050000000000000000000000000000000000000000000000004059000000000000405900000000000040590000000000004059000000000000000000000000000000000000000000000000000000000000, 4326)) AND x = 27",
131
                builder.toString()
132
        );
133
        assertEquals(
134
                "[the_geom, x]",
135
                ArrayUtils.toString(getVariableNames(builder))
136
        );
137
        assertEquals(
138
                "[]",
139
                ArrayUtils.toString(getParameterNames(builder))
140
        );
141
    }
142

    
143
    public void testCount() throws Exception {
144
        SQLBuilder builder = createSQLBuilder();
145
        
146
        builder.select().column().value(builder.count().all());
147
        builder.select().from().table().database("master").schema("dbo").name("test1");
148
        builder.select().from().subquery(null);
149
        builder.select().where().set( builder.custom("pp = 200").add(builder.variable("pp")));
150

    
151
        System.out.println("# Test:: testCount");
152
        System.out.println("# SQL:: " + builder.toString());
153
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
154
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
155

    
156
        //# Test:: testCount
157
        //# SQL:: SELECT COUNT(*) FROM [master].[dbo].[test1] WHERE pp = 200
158
        //# Variables:: []
159
        //# Parametros:: []
160
    
161
        assertEquals(
162
                "SELECT COUNT(*) FROM [master].[dbo].[test1] WHERE pp = 200",
163
                builder.toString()
164
        );
165
        assertEquals(
166
                "[pp]",
167
                ArrayUtils.toString(getVariableNames(builder))
168
        );
169
        assertEquals(
170
                "[]",
171
                ArrayUtils.toString(getParameterNames(builder))
172
        );
173
    }
174
    
175
    public void testUpdateStatistics() throws Exception {
176
        SQLBuilder builder = createSQLBuilder();
177
        
178
        builder.update_table_statistics().table().database("master").schema("dbo").name("test1");
179

    
180
        System.out.println("# Test:: testUpdateStatistics");
181
        System.out.println("# SQL:: " + builder.toString());
182
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
183
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
184

    
185
        //# Test:: testUpdateStatistics
186
        //# SQL:: UPDATE STATISTICS [master].[dbo].[test1]
187
        //# Variables:: []
188
        //# Parametros:: []
189
    
190
        assertEquals(
191
                "UPDATE STATISTICS [master].[dbo].[test1]",
192
                builder.toString()
193
        );
194
        assertEquals(
195
                "[]",
196
                ArrayUtils.toString(getVariableNames(builder))
197
        );
198
        assertEquals(
199
                "[]",
200
                ArrayUtils.toString(getParameterNames(builder))
201
        );
202
    }
203
    
204
    public void testCreateTable() throws Exception {
205
        SQLBuilder builder = createSQLBuilder();
206

    
207
        builder.create_table().table().database("master").schema("dbo").name("test1");
208
        builder.create_table().add_column(
209
                "name",
210
                DataTypes.STRING,
211
                45,
212
                0,
213
                false,
214
                true,
215
                false,
216
                null
217
        );
218
        builder.create_table().add_column(
219
                "id",
220
                DataTypes.INT,
221
                0,
222
                0,
223
                true,
224
                false,
225
                true,
226
                0
227
        );
228
        builder.create_table().add_column(
229
                "geom",
230
                DataTypes.GEOMETRY,
231
                0,
232
                0,
233
                false,
234
                true,
235
                false,
236
                null
237
        );
238

    
239
        System.out.println("# Test:: testCreateTable");
240
        System.out.println("# SQL:: " + builder.toString());
241
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
242
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
243

    
244
        //# Test:: testCreateTable
245
        //# SQL:: CREATE TABLE [master].[dbo].[test1] ([name] VARCHAR(45) DEFAULT NULL NULL, [id] INT IDENTITY(1,1) DEFAULT '0' NOT NULL PRIMARY KEY, [geom] GEOMETRY DEFAULT NULL NULL )
246
        //# Variables:: []
247
        //# Parametros:: []
248

    
249
        assertEquals(
250
                "CREATE TABLE [master].[dbo].[test1] ([name] VARCHAR(45) DEFAULT NULL NULL, [id] INT IDENTITY(1,1) DEFAULT '0' NOT NULL PRIMARY KEY, [geom] GEOMETRY DEFAULT NULL NULL )",
251
                builder.toString()
252
        );
253
        assertEquals(
254
                "[]",
255
                ArrayUtils.toString(getVariableNames(builder))
256
        );
257
        assertEquals(
258
                "[]",
259
                ArrayUtils.toString(getParameterNames(builder))
260
        );
261
    }
262

    
263
    public void testDropTable() throws Exception {
264
        SQLBuilder builder = createSQLBuilder();
265
        
266
        builder.drop_table().table().database("master").schema("dbo").name("test1");
267

    
268
        System.out.println("# Test:: testDropTable");
269
        System.out.println("# SQL:: " + builder.toString());
270
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
271
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
272

    
273
        //# Test:: testDropTable
274
        //# SQL:: DROP TABLE [master].[dbo].[test1]
275
        //# Variables:: []
276
        //# Parametros:: []
277
        
278
        assertEquals(
279
                "DROP TABLE [master].[dbo].[test1]",
280
                builder.toString()
281
        );
282
        assertEquals(
283
                "[]",
284
                ArrayUtils.toString(getVariableNames(builder))
285
        );
286
        assertEquals(
287
                "[]",
288
                ArrayUtils.toString(getParameterNames(builder))
289
        );
290
    }
291
    
292
    public void testFetchFeatureProviderByReference() throws Exception {
293
        SQLBuilder builder = createSQLBuilder();
294
        
295
        String value = "yoyo";
296
        builder.select().column().name("name");
297
        builder.select().column().name("id");
298
        builder.select().column().name("geom").as_geometry();
299
        builder.select().from().table().database("master").schema("dbo").name("test1");
300
        builder.select().where().set(
301
            builder.eq(
302
                builder.column("name"),
303
                builder.parameter(value).as_constant()
304
            )
305
        );
306
        builder.select().limit(1);
307

    
308
        System.out.println("# Test:: testFetchFeatureProviderByReference");
309
        System.out.println("# SQL:: " + builder.toString());
310
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
311
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
312

    
313
        //# Test:: testFetchFeatureProviderByReference
314
        //# SQL:: SELECT TOP 1 [name], [id], ([geom]).STAsBinary() FROM [master].[dbo].[test1] WHERE ( ([name]) = (?) )
315
        //# Variables:: [geom, id, name]
316
        //# Parametros:: ['yoyo']
317

    
318
        assertEquals(
319
                "SELECT TOP 1 [name], [id], ([geom]).STAsBinary() FROM [master].[dbo].[test1] WHERE ( ([name]) = (?) )",
320
                builder.toString()
321
        );
322
        assertEquals(
323
                "[geom, id, name]",
324
                ArrayUtils.toString(getVariableNames(builder))
325
        );
326
        assertEquals(
327
                "['yoyo']",
328
                ArrayUtils.toString(getParameterNames(builder))
329
        );
330
    }
331
    
332
    public void testIsNull() throws Exception {
333
        SQLBuilder builder = createSQLBuilder();
334
        
335
        builder.select().column().name("name");
336
        builder.select().column().name("id");
337
        builder.select().column().name("geom").as_geometry();
338
        builder.select().from().table().database("master").schema("dbo").name("test1");
339
        builder.select().where().set(
340
            builder.and(
341
                builder.isNull(
342
                    builder.column("name")
343
                ),
344
                builder.notIsNull(
345
                        builder.column("id")
346
                )
347
            )
348
        );
349
        builder.select().limit(2);
350

    
351
        System.out.println("# Test:: testIsNull");
352
        System.out.println("# SQL:: " + builder.toString());
353
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
354
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
355

    
356
        //# Test:: testIsNull
357
        //# SQL:: SELECT TOP 2 [name], [id], ([geom]).STAsBinary() FROM [master].[dbo].[test1] WHERE ( ([name]) IS NULL ) AND ( ([id]) NOT IS NULL )
358
        //# Variables:: [geom, id, name]
359
        //# Parametros:: []
360

    
361
        assertEquals(
362
                "SELECT TOP 2 [name], [id], ([geom]).STAsBinary() FROM [master].[dbo].[test1] WHERE ( ([name]) IS NULL ) AND ( ([id]) NOT IS NULL )",
363
                builder.toString()
364
        );
365
        assertEquals(
366
                "[geom, id, name]",
367
                ArrayUtils.toString(getVariableNames(builder))
368
        );
369
        assertEquals(
370
                "[]",
371
                ArrayUtils.toString(getParameterNames(builder))
372
        );
373
    }
374
    
375
    public void testFetchFeatureType() throws Exception {
376
        SQLBuilder builder = createSQLBuilder();
377

    
378
        builder.select().column().all();
379
        builder.select().from().table().database("master").schema("dbo").name("test1");
380
        builder.select().limit(1);
381

    
382
        System.out.println("# Test:: testFetchFeatureType");
383
        System.out.println("# SQL:: " + builder.toString());
384
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
385
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
386

    
387
        //# Test:: testFetchFeatureType
388
        //# SQL:: SELECT TOP 1 * FROM [master].[dbo].[test1]
389
        //# Variables:: []
390
        //# Parametros:: []
391
    
392
        assertEquals(
393
                "SELECT TOP 1 * FROM [master].[dbo].[test1]",
394
                builder.toString()
395
        );
396
        assertEquals(
397
                "[]",
398
                ArrayUtils.toString(getVariableNames(builder))
399
        );
400
        assertEquals(
401
                "[]",
402
                ArrayUtils.toString(getParameterNames(builder))
403
        );
404
    }
405
        
406
    public void testPerformDeletes() throws Exception {
407
        SQLBuilder builder = createSQLBuilder();
408

    
409
        builder.delete().table().database("master").schema("dbo").name("test1");
410
        builder.delete().where().and(
411
            builder.eq( 
412
                builder.column("id1"),
413
                builder.parameter("id1").as_variable()
414
            )
415
        );
416
        builder.delete().where().and(
417
            builder.eq( 
418
                builder.column("id2"),
419
                builder.parameter("id2").as_variable()
420
            )
421
        );
422

    
423
        System.out.println("# Test:: testPerformDeletes");
424
        System.out.println("# SQL:: " + builder.toString());
425
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
426
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
427

    
428
        //# Test:: testPerformDeletes
429
        //# SQL:: DELETE FROM [master].[dbo].[test1] WHERE ( ([id1]) = (?) ) AND ( ([id2]) = (?) )
430
        //# Variables:: [id1, id2]
431
        //# Parametros:: ["id1", "id2"]
432

    
433
        assertEquals(
434
                "DELETE FROM [master].[dbo].[test1] WHERE ( ([id1]) = (?) ) AND ( ([id2]) = (?) )",
435
                builder.toString()
436
        );
437
        assertEquals(
438
                "[id1, id2]",
439
                ArrayUtils.toString(getVariableNames(builder))
440
        );
441
        assertEquals(
442
                "[\"id1\", \"id2\"]",
443
                ArrayUtils.toString(getParameterNames(builder))
444
        );
445
    }
446

    
447
    public void testPerformInserts1() throws Exception {
448
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
449

    
450
        SQLBuilder builder = createSQLBuilder();
451

    
452
        builder.insert().table().database("master").schema("dbo").name("test1");
453
        builder.insert().column().name("id").with_value(builder.parameter("id"));
454
        builder.insert().column().name("name").with_value(builder.parameter("name"));
455
        builder.insert().column().name("geom").with_value(builder.parameter("geom").as_geometry().srs(proj));
456
        
457
        System.out.println("# Test:: testPerformInserts1");
458
        System.out.println("# SQL:: " + builder.toString());
459
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
460
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
461

    
462
        //# Test:: testPerformInserts1
463
        //# SQL:: INSERT INTO [master].[dbo].[test1] ( [id], [name], [geom] ) VALUES ( ?, ?, geometry::STGeomFromWKB(?, 4326) )
464
        //# Variables:: [geom, id, name]
465
        //# Parametros:: ["id", "name", "geom"]
466
        
467
        assertEquals(
468
                "INSERT INTO [master].[dbo].[test1] ( [id], [name], [geom] ) VALUES ( ?, ?, geometry::STGeomFromWKB(?, 4326) )",
469
                builder.toString()
470
        );
471
        assertEquals(
472
                "[geom, id, name]",
473
                ArrayUtils.toString(getVariableNames(builder))
474
        );
475
        assertEquals(
476
                "[\"id\", \"name\", \"geom\"]",
477
                ArrayUtils.toString(getParameterNames(builder))
478
        );
479
    }
480

    
481
    public void testPerformInserts2() throws Exception {
482
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
483

    
484
        SQLBuilder builder = createSQLBuilder();
485

    
486
        builder.insert().table().database("master").schema("dbo").name("test1");
487
        builder.insert().column().name("id").with_value(builder.parameter("id"));
488
        builder.insert().column().name("name").with_value(builder.parameter("name"));
489
        builder.insert().column().name("geom").with_value(builder.parameter("geom").as_geometry().srs(builder.parameter(proj)));
490
        
491
        System.out.println("# Test:: testPerformInserts2");
492
        System.out.println("# SQL:: " + builder.toString());
493
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
494
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
495
    
496
        //# Test:: testPerformInserts2
497
        //# SQL:: INSERT INTO [master].[dbo].[test1] ( [id], [name], [geom] ) VALUES ( ?, ?, geometry::STGeomFromWKB(?, ?) )
498
        //# Variables:: [geom, id, name]
499
        //# Parametros:: ["id", "name", "geom", 4326]
500

    
501
        assertEquals(
502
                "INSERT INTO [master].[dbo].[test1] ( [id], [name], [geom] ) VALUES ( ?, ?, geometry::STGeomFromWKB(?, ?) )",
503
                builder.toString()
504
        );
505
        assertEquals(
506
                "[geom, id, name]",
507
                ArrayUtils.toString(getVariableNames(builder))
508
        );
509
        assertEquals(
510
                "[\"id\", \"name\", \"geom\", 4326]",
511
                ArrayUtils.toString(getParameterNames(builder))
512
        );
513
    }
514

    
515
    public void testPerformUpdates() throws Exception {
516
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
517

    
518
        SQLBuilder builder = createSQLBuilder();
519

    
520
        builder.update().table().database("master").schema("dbo").name("test1");
521
        builder.update().where().and(
522
            builder.eq(
523
                builder.column("id"), 
524
                builder.parameter("id").as_variable()
525
            )
526
        );
527
        builder.update().column().name("name").with_value(builder.parameter("name"));
528
        builder.update().column().name("geom").with_value(
529
                builder.parameter("geom").as_geometry().srs( builder.parameter(proj)) 
530
        );
531

    
532
        System.out.println("# Test:: testPerformUpdates");
533
        System.out.println("# SQL:: " + builder.toString());
534
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
535
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
536

    
537
        //# Test:: testPerformUpdates
538
        //# SQL:: UPDATE [master].[dbo].[test1] SET [name] = ?, [geom] = geometry::STGeomFromWKB(?, ?) WHERE ( ([id]) = (?) )
539
        //# Variables:: [geom, id, name]
540
        //# Parametros:: ["name", "geom", 4326, "id"]
541

    
542
        assertEquals(
543
                "UPDATE [master].[dbo].[test1] SET [name] = ?, [geom] = geometry::STGeomFromWKB(?, ?) WHERE ( ([id]) = (?) )",
544
                builder.toString()
545
        );
546
        assertEquals(
547
                "[geom, id, name]",
548
                ArrayUtils.toString(getVariableNames(builder))
549
        );
550
        assertEquals(
551
                "[\"name\", \"geom\", 4326, \"id\"]",
552
                ArrayUtils.toString(getParameterNames(builder))
553
        );
554
    }
555

    
556
}