Author: jdeolive Date: 2012-05-15 18:35:03 -0700 (Tue, 15 May 2012) New Revision: 38734 Added: branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTest.java branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTestSetup.java Modified: branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/JDBCDataStore.java branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/SQLDialect.java branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialect.java branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectBasic.java branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectPrepared.java branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISDialect.java branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISPSDialect.java branches/2.7.x/modules/plugin/jdbc/jdbc-spatialite/src/main/java/org/geotools/data/spatialite/SpatiaLiteDialect.java branches/2.7.x/modules/plugin/jdbc/jdbc-sqlserver/src/main/java/org/geotools/data/sqlserver/SQLServerDialect.java Log: GEOT-4129, updated dialect api to handle hints when encoding geometry, and updated postgis to respect Feature2D hint Modified: branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/JDBCDataStore.java =================================================================== --- branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/JDBCDataStore.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/JDBCDataStore.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -4193,7 +4193,6 @@ * @param hints , may be null */ protected void encodeGeometryColumn(GeometryDescriptor gatt, StringBuffer sql,Hints hints) { - int srid = getDescriptorSRID(gatt); if (isGeneralizationRequired(hints, gatt)==true) { Double distance = (Double) hints.get(Hints.GEOMETRY_GENERALIZATION); @@ -4206,8 +4205,9 @@ dialect.encodeGeometryColumnSimplified(gatt,srid, sql,distance); return; } - - dialect.encodeGeometryColumn(gatt,srid, sql); + + dialect.encodeGeometryColumn(gatt,srid,hints,sql); + } /** Modified: branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/SQLDialect.java =================================================================== --- branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/SQLDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/library/jdbc/src/main/java/org/geotools/jdbc/SQLDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -649,12 +649,50 @@ * This default implementation simply uses the column name without any * wrapping function, subclasses must override. * </p> + * @deprecated use {@link #encodeGeometryColumn(GeometryDescriptor, String, int, Hints, StringBuffer)} */ public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { encodeColumnName(gatt.getLocalName(), sql); } - + /** + * Encodes the name of a geometry column in a SELECT statement. + * <p> + * This method should wrap the column name in any functions that are used to + * retrieve its value. For instance, often it is necessary to use the function + * <code>asText</code>, or <code>asWKB</code> when fetching a geometry. + * </p> + * <p> + * This method must also be sure to properly encode the name of the column with + * the {@link #encodeColumnName(String, String, StringBuffer)} function. + * </p> + * <p> + * Example: + * </p> + * + * <pre> + * <code> + * sql.append( "asText(" ); + * column( gatt.getLocalName(), sql ); + * sql.append( ")" ); + * </code> + * </pre> + * + * </p> + * <p> + * This default implementation calls the deprecated + * {@link #encodeGeometryColumn(GeometryDescriptor, int, StringBuffer)} version of + * this method for backward compatibility reasons. + * </p> + * + */ + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + + //call previously deprecated + encodeGeometryColumn(gatt, srid, sql); + } + + /** * Encodes a generalized geometry using a DB provided SQL function if available * If not supported, subclasses should not implement * Only called if {@link Hints#GEOMETRY_GENERALIZATION is supported} Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -231,12 +231,14 @@ return srid; } - public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { encodeGeometryColumn(gatt, sql); } - + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + encodeGeometryColumn(gatt, sql); + } + public void encodeGeometryColumn(GeometryDescriptor gatt, StringBuffer sql) { sql.append("db2gse.ST_AsBinary("); encodeColumnName(gatt.getLocalName(), sql); Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -103,6 +103,10 @@ delegate.encodeGeometryColumn(gatt, srid, sql); } + @Override + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + delegate.encodeGeometryColumn(gatt, srid, hints, sql); + } @Override public void encodeGeometryEnvelope(String tableName,String geometryColumn, StringBuffer sql) { Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Set; +import org.geotools.data.jdbc.FilterToSQL; +import org.geotools.factory.Hints; import org.geotools.factory.Hints.Key; import org.geotools.jdbc.JDBCDataStore; import org.geotools.jdbc.PreparedFilterToSQL; @@ -99,6 +101,10 @@ delegate.encodeGeometryColumn(gatt, srid, sql); } + @Override + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + delegate.encodeGeometryColumn(gatt, srid, hints, sql); + } @Override public void encodeGeometryEnvelope(String tableName,String geometryColumn, StringBuffer sql) { Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialect.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -26,6 +26,7 @@ import java.util.Map; import java.util.logging.Level; +import org.geotools.factory.Hints; import org.geotools.geometry.jts.Geometries; import org.geotools.jdbc.JDBCDataStore; import org.geotools.jdbc.SQLDialect; @@ -212,6 +213,7 @@ } public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { + sql.append("asWKB("); encodeColumnName(gatt.getLocalName(), sql); sql.append(")"); Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectBasic.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectBasic.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectBasic.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -23,6 +23,7 @@ import java.util.Map; import org.geotools.data.jdbc.FilterToSQL; +import org.geotools.factory.Hints; import org.geotools.jdbc.BasicSQLDialect; import org.geotools.jdbc.JDBCDataStore; import org.opengis.feature.simple.SimpleFeatureType; @@ -84,8 +85,13 @@ public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { delegate.encodeGeometryColumn(gatt, srid, sql); } - + @Override + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + delegate.encodeGeometryColumn(gatt, srid, hints, sql); + } + + @Override public void encodeColumnType(String sqlTypeName, StringBuffer sql) { delegate.encodeColumnType(sqlTypeName, sql); } Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectPrepared.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectPrepared.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-mysql/src/main/java/org/geotools/data/mysql/MySQLDialectPrepared.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -24,6 +24,7 @@ import java.sql.Types; import java.util.Map; +import org.geotools.factory.Hints; import org.geotools.jdbc.JDBCDataStore; import org.geotools.jdbc.PreparedStatementSQLDialect; import org.opengis.feature.simple.SimpleFeatureType; @@ -90,6 +91,12 @@ } @Override + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + delegate.encodeGeometryColumn(gatt, srid, hints, sql); + } + + + @Override public void registerClassToSqlMappings(Map<Class<?>, Integer> mappings) { delegate.registerClassToSqlMappings(mappings); } Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISDialect.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -33,6 +33,7 @@ import java.util.logging.Level; import org.geotools.data.jdbc.FilterToSQL; +import org.geotools.factory.Hints; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.jdbc.BasicSQLDialect; import org.geotools.jdbc.ColumnMetadata; @@ -173,20 +174,35 @@ @Override public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { - - boolean geography = "geography".equals(gatt.getUserData().get(JDBCDataStore.JDBC_NATIVE_TYPENAME)); - - sql.append("encode("); - sql.append("ST_AsBinary("); - if (!geography) { - sql.append("ST_Force_2D("); + encodeGeometryColumn(gatt,srid, null, sql); + } + + @Override + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, + StringBuffer sql) { + + boolean geography = "geography".equals(gatt.getUserData().get( + JDBCDataStore.JDBC_NATIVE_TYPENAME)); + + if (geography) { + sql.append("encode(ST_AsBinary("); + encodeColumnName(gatt.getLocalName(), sql); + sql.append("),'base64')"); } - - encodeColumnName(gatt.getLocalName(), sql); - if (!geography) { - sql.append(")"); + else { + boolean force2D = hints != null && hints.containsKey(Hints.FEATURE_2D) && + Boolean.TRUE.equals(hints.get(Hints.FEATURE_2D)); + + if (force2D) { + sql.append("encode(ST_AsBinary(ST_Force_2D("); + encodeColumnName(gatt.getLocalName(), sql); + sql.append(")),'base64')"); + } else { + sql.append("encode(ST_AsEWKB("); + encodeColumnName(gatt.getLocalName(), sql); + sql.append("),'base64')"); + } } - sql.append("),'base64')"); } @Override Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISPSDialect.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISPSDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostGISPSDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -24,6 +24,7 @@ import java.sql.Types; import java.util.Map; +import org.geotools.factory.Hints; import org.geotools.jdbc.ColumnMetadata; import org.geotools.jdbc.JDBCDataStore; import org.geotools.jdbc.PreparedFilterToSQL; @@ -79,6 +80,10 @@ delegate.encodeGeometryColumn(gatt, srid, sql); } + @Override + public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, Hints hints, StringBuffer sql) { + delegate.encodeGeometryColumn(gatt, srid, hints, sql); + } public void encodeGeometryEnvelope(String tableName, String geometryColumn, StringBuffer sql) { Added: branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTest.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTest.java (rev 0) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTest.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -0,0 +1,34 @@ +/* + * GeoTools - The Open Source Java GIS Toolkit + * http://geotools.org + * + * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package org.geotools.data.postgis; + +import org.geotools.jdbc.JDBC3DTest; +import org.geotools.jdbc.JDBC3DTestSetup; + +/** + * + * + * @source $URL$ + */ +public class PostGIS3DTest extends JDBC3DTest { + + @Override + protected JDBC3DTestSetup createTestSetup() { + return new PostGIS3DTestSetup(); + } + +} Added: branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTestSetup.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTestSetup.java (rev 0) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-postgis/src/test/java/org/geotools/data/postgis/PostGIS3DTestSetup.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -0,0 +1,83 @@ +/* + * GeoTools - The Open Source Java GIS Toolkit + * http://geotools.org + * + * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package org.geotools.data.postgis; + +import org.geotools.jdbc.JDBC3DTestSetup; + +/** + * + * + * @source $URL$ + */ +public class PostGIS3DTestSetup extends JDBC3DTestSetup { + + protected PostGIS3DTestSetup() { + super(new PostGISTestSetup()); + + } + + @Override + protected void createLine3DTable() throws Exception { + // setup table + run("CREATE TABLE \"line3d\"(\"fid\" serial PRIMARY KEY, \"id\" int, " + + "\"geom\" geometry, \"name\" varchar )"); + run("INSERT INTO GEOMETRY_COLUMNS VALUES('', 'public', 'line3d', 'geom', 3, '4326', 'LINESTRING')"); + run("CREATE INDEX line3d_GEOM_IDX ON \"line3d\" USING GIST (\"geom\") "); + + // insert data + run("INSERT INTO \"line3d\" (\"id\",\"geom\",\"name\") VALUES (0," + + "GeomFromText('LINESTRING(1 1 0, 2 2 0, 4 2 1, 5 1 1)', 4326)," + + "'l1')"); + run("INSERT INTO \"line3d\" (\"id\",\"geom\",\"name\") VALUES (1," + + "GeomFromText('LINESTRING(3 0 1, 3 2 2, 3 3 3, 3 4 5)', 4326)," + + "'l2')"); + } + + @Override + protected void createPoint3DTable() throws Exception { + // setup table + run("CREATE TABLE \"point3d\"(\"fid\" serial PRIMARY KEY, \"id\" int, " + + "\"geom\" geometry, \"name\" varchar )"); + run("INSERT INTO GEOMETRY_COLUMNS VALUES('', 'public', 'point3d', 'geom', 3, '4326', 'POINT')"); + run("CREATE INDEX POINT3D_GEOM_IDX ON \"point3d\" USING GIST (\"geom\") "); + + // insert data + run("INSERT INTO \"point3d\" (\"id\",\"geom\",\"name\") VALUES (0," + + "GeomFromText('POINT(1 1 1)', 4326)," + "'p1')"); + run("INSERT INTO \"point3d\" (\"id\",\"geom\",\"name\") VALUES (1," + + "GeomFromText('POINT(3 0 1)', 4326)," + "'p2')"); + } + + @Override + protected void dropLine3DTable() throws Exception { + run("DELETE FROM GEOMETRY_COLUMNS WHERE F_TABLE_NAME = 'line3d'"); + run("DROP TABLE \"line3d\""); + } + + @Override + protected void dropPoly3DTable() throws Exception { + run("DELETE FROM GEOMETRY_COLUMNS WHERE F_TABLE_NAME = 'poly3d'"); + run("DROP TABLE \"poly3d\""); + } + + @Override + protected void dropPoint3DTable() throws Exception { + run("DELETE FROM GEOMETRY_COLUMNS WHERE F_TABLE_NAME = 'point3d'"); + run("DROP TABLE \"point3d\""); + } + +} Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-spatialite/src/main/java/org/geotools/data/spatialite/SpatiaLiteDialect.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-spatialite/src/main/java/org/geotools/data/spatialite/SpatiaLiteDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-spatialite/src/main/java/org/geotools/data/spatialite/SpatiaLiteDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -33,6 +33,7 @@ import java.util.Map; import org.geotools.data.jdbc.FilterToSQL; +import org.geotools.factory.Hints; import org.geotools.geometry.jts.Geometries; import org.geotools.jdbc.BasicSQLDialect; import org.geotools.jdbc.JDBCDataStore; @@ -196,14 +197,14 @@ return super.getGeometrySRID(schemaName, tableName, columnName, cx); } - + @Override public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { sql.append( "AsText("); encodeColumnName( gatt.getLocalName(), sql); sql.append( ")||';").append(srid).append("'"); } - + @Override public Geometry decodeGeometryValue(GeometryDescriptor descriptor, ResultSet rs, int column, GeometryFactory factory, Connection cx) throws IOException, SQLException { Modified: branches/2.7.x/modules/plugin/jdbc/jdbc-sqlserver/src/main/java/org/geotools/data/sqlserver/SQLServerDialect.java =================================================================== --- branches/2.7.x/modules/plugin/jdbc/jdbc-sqlserver/src/main/java/org/geotools/data/sqlserver/SQLServerDialect.java 2012-05-15 21:21:56 UTC (rev 38733) +++ branches/2.7.x/modules/plugin/jdbc/jdbc-sqlserver/src/main/java/org/geotools/data/sqlserver/SQLServerDialect.java 2012-05-16 01:35:03 UTC (rev 38734) @@ -28,6 +28,7 @@ import java.util.UUID; import org.geotools.data.jdbc.FilterToSQL; +import org.geotools.factory.Hints; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.jdbc.BasicSQLDialect; import org.geotools.jdbc.JDBCDataStore; @@ -183,13 +184,13 @@ dataStore.closeSafe( st ); } } - + @Override public void encodeGeometryColumn(GeometryDescriptor gatt, int srid, StringBuffer sql) { encodeColumnName( gatt.getLocalName(), sql ); sql.append( ".STAsBinary()"); } - + @Override public void encodeGeometryValue(Geometry value, int srid, StringBuffer sql) throws IOException { |