Revision 44198 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/main/java/org/gvsig/fmap/dal/store/h2/H2SpatialSQLBuilder.java

View differences:

H2SpatialSQLBuilder.java
1 1
package org.gvsig.fmap.dal.store.h2;
2 2

  
3 3
import java.sql.PreparedStatement;
4
import java.sql.SQLException;
4 5
import java.text.MessageFormat;
5 6
import java.util.ArrayList;
6 7
import java.util.Date;
7 8
import java.util.List;
8 9
import org.apache.commons.lang3.tuple.Pair;
10
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
11
import org.gvsig.expressionevaluator.Formatter;
9 12
import org.gvsig.fmap.dal.DataTypes;
10 13
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
11 14
import org.gvsig.fmap.dal.feature.FeatureType;
12 15
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
16
import org.gvsig.fmap.dal.store.h2.expressionbuilderformatter.H2SpatialFormatter;
13 17
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
14 18
import org.gvsig.fmap.geom.Geometry;
19
import org.gvsig.fmap.geom.exception.CreateGeometryException;
15 20
import org.gvsig.tools.dispose.Disposable;
16 21

  
17 22
public class H2SpatialSQLBuilder extends JDBCSQLBuilderBase {
18 23

  
24
    protected Formatter formatter = null;
25
    
19 26
    public H2SpatialSQLBuilder(H2SpatialHelper helper) {
20 27
        super(helper);
21 28
        
......
30 37
        // http://www.h2database.com/html/datatypes.html
31 38
        //
32 39
        //
40

  
33 41
        
34
        config.set(SQLConfig.default_schema, "");
35
        config.set(SQLConfig.support_schemas, false);
36
        config.set(SQLConfig.allowAutomaticValues, true);
37
        config.set(SQLConfig.geometry_type_support, this.helper.getGeometrySupportType());
38
        config.set(SQLConfig.has_spatial_functions, this.helper.hasSpatialFunctions());
42
        this.defaultSchema = "";
43
        this.supportSchemas = false;
44
        this.allowAutomaticValues = true;
45
        this.geometrySupportType = this.helper.getGeometrySupportType();
46
        this.hasSpatialFunctions = this.helper.hasSpatialFunctions();
39 47

  
40
        config.remove_functionality(SQLConfig.DELETE_GEOMETRY_COLUMN_FROM_TABLE_schema_table);
41
        config.remove_functionality(SQLConfig.DELETE_GEOMETRY_COLUMN_FROM_TABLE_table);
48
        this.STMT_DELETE_GEOMETRY_COLUMN_FROM_TABLE_schema_table = null;
49
        this.STMT_DELETE_GEOMETRY_COLUMN_FROM_TABLE_table = null;
42 50
         
43
//        config.set(SQLConfig.UPDATE_TABLE_STATISTICS_table,"ANALYZE TABLE {0} SAMPLE_SIZE 0");
44
        config.set(SQLConfig.UPDATE_TABLE_STATISTICS_table,"ANALYZE SAMPLE_SIZE 0");
51
        this.STMT_UPDATE_TABLE_STATISTICS_table = "ANALYZE SAMPLE_SIZE 0";
45 52

  
46
        config.set(SQLConfig.ST_GeomFromEWKB, "GeomFromWKB({0}, {1})");
47
        config.set(SQLConfig.ST_AsEWKB, "AsWKB(({0}))");        
48
        config.set(SQLConfig.ST_Intersects, "( (({0}) && ({1})) AND ST_Intersects(({0}),({1}) ))");  
49
        config.set(SQLConfig.ST_AsBinary, "NVL2({0}, ST_AsBinary({0}), null)");
50
        
51
        config.set(SQLConfig.lcase, "LOWER({0})");
52
        config.set(SQLConfig.ucase, "UPPER({0})");
53
        config.set(SQLConfig.operator_ILIKE, "({0}) ILIKE ({1})");
54
        config.set(SQLConfig.isNull, "( ({0}) IS NULL )");
55
        config.set(SQLConfig.notIsNull, "( ({0}) IS NOT NULL )");
53
//        config.set(SQLConfig.ST_AsBinary, "NVL2({0}, ST_AsBinary({0}), null)");
56 54

  
57
        config.set(SQLConfig.type_boolean, "BOOLEAN");
58
        config.set(SQLConfig.type_byte, "TINYINT");
59
        config.set(SQLConfig.type_bytearray, "TINYINT");
60
        config.set(SQLConfig.type_geometry, "GEOMETRY");
61
        config.set(SQLConfig.type_char, "CHAR");
62
        config.set(SQLConfig.type_date, "DATE");
63
        config.set(SQLConfig.type_double, "DOUBLE"); 
64
        config.set(SQLConfig.type_numeric_p, "DECIMAL({0})");
65
        config.set(SQLConfig.type_numeric_ps, "DECIMAL({0},{1})");
66
        config.set(SQLConfig.type_bigdecimal, "DOUBLE");
67
        config.set(SQLConfig.type_float, "REAL");
68
        config.set(SQLConfig.type_int, "INTEGER");
69
        config.set(SQLConfig.type_long, "BIGINT");
70
        config.set(SQLConfig.type_string, "VARCHAR");
71
        config.set(SQLConfig.type_string_p, "VARCHAR({0})");
72
        config.set(SQLConfig.type_time, "TIME");
73
        config.set(SQLConfig.type_timestamp, "TIMESTAMP");
74
        config.set(SQLConfig.type_version, "VARCHAR");
75
        config.set(SQLConfig.type_URI, "VARCHAR");
76
        config.set(SQLConfig.type_URL, "VARCHAR");
77
        config.set(SQLConfig.type_FILE, "VARCHAR");
78
        config.set(SQLConfig.type_FOLDER, "VARCHAR");        
55
        this.type_boolean = "BOOLEAN";
56
        this.type_byte = "TINYINT";
57
        this.type_bytearray = "TINYINT";
58
        this.type_geometry = "GEOMETRY";
59
        this.type_char = "CHAR";
60
        this.type_date = "DATE";
61
        this.type_double = "DOUBLE"; 
62
        this.type_numeric_p = "DECIMAL({0})";
63
        this.type_numeric_ps = "DECIMAL({0},{1})";
64
        this.type_bigdecimal = "DOUBLE";
65
        this.type_float = "REAL";
66
        this.type_int = "INTEGER";
67
        this.type_long = "BIGINT";
68
        this.type_string = "VARCHAR";
69
        this.type_string_p = "VARCHAR({0})";
70
        this.type_time = "TIME";
71
        this.type_timestamp = "TIMESTAMP";
72
        this.type_version = "VARCHAR";
73
        this.type_URI = "VARCHAR";
74
        this.type_URL = "VARCHAR";
75
        this.type_FILE = "VARCHAR";
76
        this.type_FOLDER = "VARCHAR";        
79 77
    }
80 78

  
79
    @Override
80
    protected Formatter formatter() {
81
        if( this.formatter==null ) {
82
            this.formatter = new H2SpatialFormatter(this);
83
        }
84
        return this.formatter;
85
    }
86

  
81 87
    public class H2SpatialTableNameBuilderBase extends TableNameBuilderBase {
82 88

  
83 89
        @Override
......
95 101
    public class H2SpatialCreateIndexBuilder extends CreateIndexBuilderBase {
96 102
    
97 103
        @Override
98
        public List<String> toStrings() {
104
        public List<String> toStrings(Formatter formatter) {
99 105
            StringBuilder builder = new StringBuilder();
100 106
            builder.append("CREATE ");
101 107
            if( this.isUnique ) {
......
108 114
            if( this.ifNotExist ) {
109 115
                builder.append("IF NOT EXISTS ");
110 116
            }
111
            builder.append(identifier(this.indexName));
117
            builder.append(as_identifier(this.indexName));
112 118
            builder.append(" ON ");
113
            builder.append(this.table.toString());
119
            builder.append(this.table.toString(formatter));
114 120
            builder.append(" ( ");
115 121
            boolean is_first_column = true;
116 122
            for( String column : this.columns) {
......
119 125
                } else {
120 126
                    builder.append(", ");
121 127
                }
122
                builder.append(identifier(column));
128
                builder.append(as_identifier(column));
123 129
            }
124 130
            builder.append(" )");
125 131
            
......
132 138
        
133 139
    protected class H2SpatialAlterTableBuilderBase extends AlterTableBuilderBase {
134 140
        @Override
135
        public List<String> toStrings() {
141
        public List<String> toStrings(Formatter formatter) {
136 142
            List<String> sqls = new ArrayList<>();
137 143
            if( this.isEmpty() ) {
138 144
                return sqls;
......
140 146
            for (String column : drops) {
141 147
                StringBuilder builder = new StringBuilder();
142 148
                builder.append("ALTER TABLE ");
143
                builder.append(this.table.toString());
149
                builder.append(this.table.toString(formatter));
144 150
                builder.append(" DROP COLUMN IF EXISTS ");
145
                builder.append(identifier(column)); 
151
                builder.append(as_identifier(column)); 
146 152
                sqls.add(builder.toString());
147 153
            }
148 154
            for (ColumnDescriptor column : adds) {
149 155
                StringBuilder builder = new StringBuilder();
150 156
                builder.append("ALTER TABLE ");
151
                builder.append(this.table.toString());
157
                builder.append(this.table.toString(formatter));
152 158
                builder.append(" ADD COLUMN ");
153
                builder.append(identifier(column.getName())); 
159
                builder.append(as_identifier(column.getName())); 
154 160
                builder.append(" ");
155 161
                if( column.getType() == DataTypes.INT && column.isAutomatic() ) {
156 162
                    builder.append(" SERIAL");
......
200 206
            for (ColumnDescriptor column : alters) {
201 207
                StringBuilder builder = new StringBuilder();
202 208
                builder.append("ALTER TABLE ");
203
                builder.append(this.table.toString());
209
                builder.append(this.table.toString(formatter));
204 210
                builder.append(" ALTER COLUMN ");
205
                builder.append(identifier(column.getName())); 
211
                builder.append(as_identifier(column.getName())); 
206 212
                builder.append(" ");
207 213
                builder.append(
208 214
                    sqltype(
......
242 248
            for (Pair<String,String> pair : renames) {
243 249
                StringBuilder builder = new StringBuilder();
244 250
                builder.append("ALTER TABLE ");
245
                builder.append(this.table.toString());
251
                builder.append(this.table.toString(formatter));
246 252
                builder.append(" RENAME COLUMN ");
247
                builder.append(identifier(pair.getLeft())); 
253
                builder.append(as_identifier(pair.getLeft())); 
248 254
                builder.append(" TO ");
249
                builder.append(identifier(pair.getRight())); 
255
                builder.append(as_identifier(pair.getRight())); 
250 256
                sqls.add(builder.toString());
251 257
            }
252 258
            return sqls;
......
257 263
    protected class H2SpatialCreateTableBuilder extends CreateTableBuilderBase {
258 264

  
259 265
        @Override
260
        public List<String> toStrings() {
266
        public List<String> toStrings(Formatter formatter) {
261 267

  
262 268
            List<String> sqls = new ArrayList<>();
263 269
            StringBuilder builder = new StringBuilder();
264 270

  
265 271
            builder.append("CREATE TABLE ");
266
            builder.append(this.table.toString());
272
            builder.append(this.table.toString(formatter));
267 273
            builder.append(" (");
268 274
            boolean first = true;
269 275
            for (ColumnDescriptor column : columns) {
......
273 279
                } else {
274 280
                    builder.append(", ");
275 281
                }
276
                builder.append(identifier(column.getName()));
282
                builder.append(as_identifier(column.getName()));
277 283
                builder.append(" ");
278 284
                builder.append(
279 285
                    sqltype(
......
364 370
        }        
365 371
        
366 372
        @Override
367
        public String toString() {
373
        public String toString(Formatter formatter) {
368 374
            StringBuilder builder = new StringBuilder();
369 375
            if( !isValid(builder) ) {
370 376
                throw new IllegalStateException(builder.toString());
......
380 386
                } else {
381 387
                    builder.append(", ");
382 388
                }
383
                builder.append(column.toString());
389
                builder.append(column.toString(formatter));
384 390
            }
385 391

  
386 392
            if ( this.has_from() ) {
387 393
                builder.append(" FROM ");
388
                builder.append(this.from.toString());
394
                builder.append(this.from.toString(formatter));
389 395
            }
390 396
            if ( this.has_where() ) {
391 397
                builder.append(" WHERE ");
392
                builder.append(this.where.toString());
398
                builder.append(this.where.toString(formatter));
393 399
            }
394 400
            
395 401
            if( this.has_order_by() ) {
......
401 407
                    } else {
402 408
                        builder.append(", ");
403 409
                    }
404
                    builder.append(item.toString());                    
410
                    builder.append(item.toString(formatter));                    
405 411
                }   
406 412
            }
407 413
            
......
425 431
    }
426 432

  
427 433
    @Override
428
    public String bytearray(byte[] data) {
429
        // H2Spatial usa un formato diferencte para especificar un array de 
430
        // bytes. En lugar de 0x... usa x'...' .
431
        StringBuilder builder = new StringBuilder();
432
        builder.append("x'");
433
        for (byte abyte : data) {
434
            int v = abyte & 0xff;
435
            builder.append(String.format("%02x", v));
436
        }
437
        builder.append("'");
438
        return builder.toString();
439
    }
440

  
441
    @Override
442 434
    public Object sqlgeometrydimension(int type, int subtype) {
443 435
        //'XY' or 2: 2D points, identified by X and Y coordinates
444 436
        //'XYM': 2D points, identified by X and Y coordinates. Each point stores an M-value (measure) as well
......
502 494
        return dimensions;
503 495
    }
504 496
    
497
    @Override
505 498
    public H2SpatialHelper getHelper() {
506 499
        return (H2SpatialHelper) this.helper;
507 500
    }
......
511 504
        try {
512 505
            FeatureType featureType = feature.getType();
513 506
            List<Object> values = new ArrayList<>();
514
            for (Parameter parameter : this.getParameters()) {
507
            for (Parameter parameter : this.parameters()) {
515 508
                if (parameter.is_constant()) {
516
                    values.add(parameter.getValue());
509
                    values.add(parameter.value());
517 510
                } else {
518
                    String name = parameter.getName();
511
                    String name = parameter.name();
519 512
                    FeatureAttributeDescriptor descriptor = featureType.getAttributeDescriptor(name);
520 513
                    switch( descriptor.getType() ) {
521 514
                    case DataTypes.DATE:
......
540 533
                }
541 534
            }
542 535
            return this.setStatementParameters(st, values, this.geometry_support_type());
543
        } catch (Exception ex) {
536
        } catch (SQLException | CreateGeometryException ex) {
544 537
            String f = "unknow";
545 538
            try {
546 539
                f = feature.toString();

Also available in: Unified diff