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
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