Revision 43650 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
5 5
import java.util.ArrayList;
6 6
import java.util.Date;
7 7
import java.util.List;
8
import org.apache.commons.lang3.tuple.Pair;
8 9
import org.gvsig.fmap.dal.DataTypes;
9 10
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
10 11
import org.gvsig.fmap.dal.feature.FeatureType;
......
45 46
         
46 47
//        config.set(SQLConfig.UPDATE_TABLE_STATISTICS_table,"ANALYZE TABLE {0} SAMPLE_SIZE 0");
47 48
        config.set(SQLConfig.UPDATE_TABLE_STATISTICS_table,"ANALYZE SAMPLE_SIZE 0");
48
        config.set(SQLConfig.CREATE_INDEX_name_ON_table_column, "CREATE INDEX {0} ON {1} (\"{2}\")");
49
        config.set(SQLConfig.CREATE_INDEX_name_ON_table_USING_GIST_column, "CREATE INDEX {0} ON {1} (\"{2}\")");
49
        config.set(SQLConfig.CREATE_INDEX_name_ON_table_column, "CREATE INDEX IF NOT EXISTS {0} ON {1} (\"{2}\")");
50
        config.set(SQLConfig.CREATE_INDEX_name_ON_table_USING_GIST_column, "CREATE SPATIAL INDEX IF NOT EXISTS {0} ON {1} (\"{2}\")");
50 51

  
51 52
        config.set(SQLConfig.ST_GeomFromEWKB, "GeomFromWKB({0}, {1})");
52 53
        config.set(SQLConfig.ST_AsEWKB, "AsWKB(({0}))");        
......
97 98
        
98 99
    }
99 100
    
101
    protected class H2SpatialAlterTableBuilderBase extends AlterTableBuilderBase {
102
        @Override
103
        public List<String> toStrings() {
104
            List<String> sqls = new ArrayList<>();
105
            for (String column : drops) {
106
                StringBuilder builder = new StringBuilder();
107
                builder.append("ALTER TABLE ");
108
                builder.append(this.table.toString());
109
                builder.append(" DROP COLUMN IF EXISTS ");
110
                builder.append(identifier(column)); 
111
                sqls.add(builder.toString());
112
            }
113
            for (ColumnDescriptorBuilderBase column : adds) {
114
                StringBuilder builder = new StringBuilder();
115
                builder.append("ALTER TABLE ");
116
                builder.append(this.table.toString());
117
                builder.append(" ADD COLUMN ");
118
                builder.append(identifier(column.getName())); 
119
                builder.append(" ");
120
                if( column.getType() == DataTypes.INT && column.isAutomatic() ) {
121
                    builder.append(" SERIAL");
122
                } else {
123
                    builder.append(
124
                        sqltype(
125
                            column.getType(), 
126
                            column.getPrecision(), 
127
                            column.getSize(),
128
                            column.getGeometryType(), 
129
                            column.getGeometrySubtype()
130
                        )
131
                    );
132
                }
133
                if (column.getDefaultValue() == null) {
134
                    if (column.allowNulls()) {
135
                        builder.append(" DEFAULT NULL");
136
                    }
137
                } else {
138
                    builder.append(" DEFAULT '");
139
                    builder.append(column.getDefaultValue().toString());
140
                    builder.append("'");
141
                }
142
                if (column.allowNulls()) {
143
                    builder.append(" NULL");
144
                } else {
145
                    builder.append(" NOT NULL");
146
                }
147
                if (column.isPrimaryKey()) {
148
                    builder.append(" PRIMARY KEY");
149
                }
150
                sqls.add(builder.toString());
151
                if( column.isIndexed() ) {
152
                    String sql;
153
                    String name = "idx_" + this.table().getName() + "_" + column.getName();
154
                    if( column.isGeometry() ) {
155
                        sql = MessageFormat.format(
156
                            config.getString(SQLConfig.CREATE_INDEX_name_ON_table_USING_GIST_column),
157
                            name,
158
                            this.table().toString(),
159
                            column.getName()
160
                        );
161
                    } else {
162
                        sql = MessageFormat.format(
163
                            config.getString(SQLConfig.CREATE_INDEX_name_ON_table_column),
164
                            name,
165
                            this.table().toString(),
166
                            column.getName()
167
                        );
168
                    }
169
                    sqls.add(sql);
170
                }
171
            }
172
            for (ColumnDescriptorBuilderBase column : alters) {
173
                StringBuilder builder = new StringBuilder();
174
                builder.append("ALTER TABLE ");
175
                builder.append(this.table.toString());
176
                builder.append(" ALTER COLUMN ");
177
                builder.append(identifier(column.getName())); 
178
                builder.append(" ");
179
                builder.append(
180
                    sqltype(
181
                        column.getType(), 
182
                        column.getPrecision(), 
183
                        column.getSize(),
184
                        column.getGeometryType(), 
185
                        column.getGeometrySubtype()
186
                    )
187
                );
188
                if (column.getDefaultValue() == null) {
189
                    if (column.allowNulls()) {
190
                        builder.append(" DEFAULT NULL");
191
                    }
192
                } else {
193
                    builder.append(" DEFAULT '");
194
                    builder.append(column.getDefaultValue().toString());
195
                    builder.append("'");
196
                }
197
                if( column.isAutomatic() ) {
198
                    builder.append(" AUTO_INCREMENT");
199
                }
200
                sqls.add(builder.toString());
201
                if( column.isIndexed() ) {
202
                    String sql;
203
                    String name = "idx_" + this.table().getName() + "_" + column.getName();
204
                    if( column.isGeometry() ) {
205
                        sql = MessageFormat.format(
206
                            config.getString(SQLConfig.CREATE_INDEX_name_ON_table_USING_GIST_column),
207
                            name,
208
                            this.table().toString(),
209
                            column.getName()
210
                        );
211
                    } else {
212
                        sql = MessageFormat.format(
213
                            config.getString(SQLConfig.CREATE_INDEX_name_ON_table_column),
214
                            name,
215
                            this.table().toString(),
216
                            column.getName()
217
                        );
218
                    }
219
                    sqls.add(sql);
220
                }
221
            }
222
            for (Pair<String,String> pair : renames) {
223
                StringBuilder builder = new StringBuilder();
224
                builder.append("ALTER TABLE ");
225
                builder.append(this.table.toString());
226
                builder.append(" RENAME COLUMN ");
227
                builder.append(identifier(pair.getLeft())); 
228
                builder.append(" TO ");
229
                builder.append(identifier(pair.getRight())); 
230
                sqls.add(builder.toString());
231
            }
232
            return sqls;
233
        }
234

  
235
    }
236
    
100 237
    protected class H2SpatialCreateTableBuilder extends CreateTableBuilderBase {
101 238

  
102 239
        @Override
......
118 255
                }
119 256
                builder.append(identifier(column.getName()));
120 257
                builder.append(" ");
121
                if( column.isGeometry() ) {
122
                    String h2geomtype = getH2SpatialGeometryTypeFromGeometryType(
258
                builder.append(
259
                    sqltype(
260
                        column.getType(), 
261
                        column.getPrecision(), 
262
                        column.getSize(),
123 263
                        column.getGeometryType(), 
124 264
                        column.getGeometrySubtype()
125
                    );
126
                    builder.append(h2geomtype);
127
                } else {
128
                    builder.append(sqltype(column.getType(), column.getPrecision(), column.getSize()));
265
                    )
266
                );
267
                if( !column.isGeometry() ) {
129 268
                    if (column.isPrimaryKey()) {
130 269
                        builder.append(" PRIMARY KEY");
131 270
                    }
......
147 286
                            builder.append(column.getDefaultValue().toString());
148 287
                            builder.append("'");
149 288
                        }
289
                    }
150 290
                }
151
                }
152 291
                if (!column.allowNulls()) {
153 292
                    builder.append(" NOT NULL");
154 293
                }
......
180 319
            
181 320
            return sqls;
182 321
        }
183
        
184
        public String getH2SpatialGeometryTypeFromGeometryType(int geomtype, int geomsubtype) {
185
            //
186
            // https://github.com/orbisgis/h2gis/wiki/1.-Spatial-data#geometry-columns-view
187
            //
188
            
189
            switch(geomtype) {
190
            case Geometry.TYPES.POINT:
191
                return "POINT";
192
            case Geometry.TYPES.MULTIPOINT:
193
                return "MULTIPOINT";
194
            case Geometry.TYPES.LINE:
195
                return "LINESTRING";
196
            case Geometry.TYPES.MULTILINE:
197
                return "MULTILINESTRING";
198
            case Geometry.TYPES.POLYGON:
199
                return "POLYGON";
200
            case Geometry.TYPES.MULTIPOLYGON:
201
                return "MULTIPOLYGON";
202
            default:
203
                return "GEOMETRY";
204
            }
205
        }
206 322
    }
207 323

  
208 324
    public class H2SpatialSelectBuilderBase extends SelectBuilderBase {
......
317 433
        }
318 434
    }
319 435

  
436
    @Override
437
    public String sqltype(int type, int p, int s, int geomtype, int geomSubtype) {
438
        if( type!=DataTypes.GEOMETRY ) {
439
            return super.sqltype(type, p, s, geomtype, geomSubtype);
440
        }
441
        //
442
        // https://github.com/orbisgis/h2gis/wiki/1.-Spatial-data#geometry-columns-view
443
        //
444
        switch(geomtype) {
445
        case Geometry.TYPES.POINT:
446
            return "POINT";
447
        case Geometry.TYPES.MULTIPOINT:
448
            return "MULTIPOINT";
449
        case Geometry.TYPES.LINE:
450
            return "LINESTRING";
451
        case Geometry.TYPES.MULTILINE:
452
            return "MULTILINESTRING";
453
        case Geometry.TYPES.POLYGON:
454
            return "POLYGON";
455
        case Geometry.TYPES.MULTIPOLYGON:
456
            return "MULTIPOLYGON";
457
        default:
458
            return "GEOMETRY";
459
        }
460
    }
461
    
320 462
    public H2SpatialHelper getHelper() {
321 463
        return this.helper;
322 464
    }
......
365 507
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
366 508
        }
367 509
    }
510

  
511
    @Override
512
    protected AlterTableBuilder createAlterTableBuilder() {
513
        return new H2SpatialAlterTableBuilderBase();
514
    }
368 515
            
369 516
    @Override
370 517
    protected TableNameBuilder createTableNameBuilder() {

Also available in: Unified diff