Statistics
| Revision:

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

History | View | Annotate | Download (22.2 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.expressionevaluator.ExpressionBuilder;
10
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
11
import org.gvsig.expressionevaluator.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 MSSQLServerHelper 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 MSSQLServerHelper(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
                false,
215
                true,
216
                false,
217
                null
218
        );
219
        builder.create_table().add_column(
220
                "id",
221
                DataTypes.INT,
222
                0,
223
                0,
224
                true,
225
                false,
226
                false,
227
                true,
228
                0
229
        );
230
        builder.create_table().add_column(
231
                "geom",
232
                DataTypes.GEOMETRY,
233
                0,
234
                0,
235
                false,
236
                false,
237
                true,
238
                false,
239
                null
240
        );
241

    
242
        System.out.println("# Test:: testCreateTable");
243
        System.out.println("# SQL:: " + builder.toString());
244
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
245
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
246

    
247
        //# Test:: testCreateTable
248
        //# 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 )
249
        //# Variables:: []
250
        //# Parametros:: []
251

    
252
        assertEquals(
253
                "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 )",
254
                builder.toString()
255
        );
256
        assertEquals(
257
                "[]",
258
                ArrayUtils.toString(getVariableNames(builder))
259
        );
260
        assertEquals(
261
                "[]",
262
                ArrayUtils.toString(getParameterNames(builder))
263
        );
264
    }
265

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

    
271
        System.out.println("# Test:: testDropTable");
272
        System.out.println("# SQL:: " + builder.toString());
273
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
274
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
275

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

    
311
        System.out.println("# Test:: testFetchFeatureProviderByReference");
312
        System.out.println("# SQL:: " + builder.toString());
313
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
314
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
315

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

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

    
354
        System.out.println("# Test:: testIsNull");
355
        System.out.println("# SQL:: " + builder.toString());
356
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
357
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
358

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

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

    
381
        builder.select().column().all();
382
        builder.select().from().table().database("master").schema("dbo").name("test1");
383
        builder.select().limit(1);
384

    
385
        System.out.println("# Test:: testFetchFeatureType");
386
        System.out.println("# SQL:: " + builder.toString());
387
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
388
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
389

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

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

    
426
        System.out.println("# Test:: testPerformDeletes");
427
        System.out.println("# SQL:: " + builder.toString());
428
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
429
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
430

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

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

    
450
    public void testPerformInserts1() throws Exception {
451
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
452

    
453
        SQLBuilder builder = createSQLBuilder();
454

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

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

    
484
    public void testPerformInserts2() throws Exception {
485
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
486

    
487
        SQLBuilder builder = createSQLBuilder();
488

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

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

    
518
    public void testPerformUpdates() throws Exception {
519
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
520

    
521
        SQLBuilder builder = createSQLBuilder();
522

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

    
535
        System.out.println("# Test:: testPerformUpdates");
536
        System.out.println("# SQL:: " + builder.toString());
537
        System.out.println("# Variables:: " + ArrayUtils.toString(getVariableNames(builder)));
538
        System.out.println("# Parametros:: " + ArrayUtils.toString(getParameterNames(builder)));
539

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

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

    
559
}