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