From: <svn...@os...> - 2012-03-27 14:53:13
|
Author: mcr Date: 2012-03-27 07:53:07 -0700 (Tue, 27 Mar 2012) New Revision: 38651 Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2FilterToSQL.java trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGDataStoreFactory.java trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGJNDIDataStoreFactory.java trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java trunk/modules/plugin/jdbc/jdbc-db2/src/test/java/org/geotools/data/db2/DB2SpatialFiltersTest.java Log: Fixing GEOT-4089 on trunk Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2FilterToSQL.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2FilterToSQL.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2FilterToSQL.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -314,7 +314,6 @@ out.write("db2gse.ST_Equals"); } else if (filter instanceof Disjoint) { out.write("db2gse.ST_Disjoint"); - // TODO } else if (filter instanceof Intersects || filter instanceof BBOX) { out.write("db2gse.ST_Intersects"); } else if (filter instanceof Crosses) { @@ -629,4 +628,30 @@ throw new RuntimeException(e); } } + + public Object visit(BBOX filter, Object extraData) throws RuntimeException { + if (isLooseBBOXEnabled()==false) + return super.visit(filter,extraData); + + + + double minx = filter.getMinX(); + double maxx = filter.getMaxX(); + double miny = filter.getMinY(); + double maxy = filter.getMaxY(); + String propertyName = filter.getPropertyName(); + Integer srid =getSRID(propertyName); + + try { + out.write("db2gse.EnvelopesIntersect("); + out.write(escapeName(propertyName)); + out.write(","+minx + ", " + miny + ", " + + maxx + ", " + maxy + ", " + srid); + out.write(") =1 "); + } catch (IOException e) { + throw new RuntimeException(e); + } + return extraData; + } + } Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGDataStoreFactory.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGDataStoreFactory.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGDataStoreFactory.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -55,7 +55,11 @@ /** parameter for database type */ public static final Param DBTYPE = new Param("dbtype", String.class, "Type", true, "db2"); - public final static String DriverClassName = "com.ibm.db2.jcc.DB2Driver"; + /** enables using EnvelopesIntersect in bbox queries */ + public static final Param LOOSEBBOX = new Param("Loose bbox", Boolean.class, "Perform only primary filter on bbox", false, Boolean.TRUE); + + + public final static String DriverClassName = "com.ibm.db2.jcc.DB2Driver"; protected SQLDialect createSQLDialect(JDBCDataStore dataStore) { return new DB2SQLDialectPrepared(dataStore, new DB2DialectInfo()); @@ -128,7 +132,10 @@ protected void setupParameters(Map parameters) { super.setupParameters(parameters); parameters.put(DBTYPE.key, DBTYPE); + parameters.put(LOOSEBBOX.key, LOOSEBBOX); + } + @Override protected JDBCDataStore createDataStoreInternal(JDBCDataStore dataStore, Map params) @@ -136,7 +143,12 @@ Connection con = null; try { con = dataStore.getDataSource().getConnection(); - DB2DialectInfo di = ((DB2SQLDialectPrepared) dataStore.getSQLDialect()).getDb2DialectInfo(); + DB2DialectInfo di = ((DB2SQLDialectPrepared) dataStore.getSQLDialect()).getDb2DialectInfo(); + + DB2SQLDialectPrepared dialect = (DB2SQLDialectPrepared) dataStore.getSQLDialect(); + Boolean loose = (Boolean) LOOSEBBOX.lookUp(params); + dialect.setLooseBBOXEnabled(loose == null || Boolean.TRUE.equals(loose)); + DatabaseMetaData md = con.getMetaData(); di.setMajorVersion(md.getDatabaseMajorVersion()); di.setMinorVersion(md.getDatabaseMinorVersion()); Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGJNDIDataStoreFactory.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGJNDIDataStoreFactory.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2NGJNDIDataStoreFactory.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -16,6 +16,8 @@ */ package org.geotools.data.db2; +import java.util.Map; + import org.geotools.jdbc.JDBCJNDIDataStoreFactory; /** @@ -33,4 +35,11 @@ public DB2NGJNDIDataStoreFactory() { super(new DB2NGDataStoreFactory()); } + + protected void setupParameters(Map parameters) { + super.setupParameters(parameters); + parameters.put(DBTYPE.key, DBTYPE); + parameters.put(DB2NGDataStoreFactory.LOOSEBBOX.key, DB2NGDataStoreFactory.LOOSEBBOX); + } + } Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialect.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -80,8 +80,10 @@ private static String DEFAULT_SRS_NAME = "DEFAULT_SRS"; private static Integer DEFAULT_SRS_ID=0; - + + private boolean looseBBOXEnabled; + private static String SELECT_SRSID_WITH_SCHEMA = "select SRS_ID from DB2GSE.ST_GEOMETRY_COLUMNS where TABLE_SCHEMA = ? and "+ "TABLE_NAME = ? and COLUMN_NAME = ?"; @@ -656,4 +658,12 @@ this.functionEncodingEnabled = functionEncodingEnabled; } + public boolean isLooseBBOXEnabled() { + return looseBBOXEnabled; + } + + public void setLooseBBOXEnabled(boolean looseBBOXEnabled) { + this.looseBBOXEnabled = looseBBOXEnabled; + } + } Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectBasic.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -65,10 +65,20 @@ public FilterToSQL createFilterToSQL() { DB2FilterToSQL filter = new DB2FilterToSQL((Writer) null); filter.setFunctionEncodingEnabled(isFunctionEncodingEnabled()); + filter.setLooseBBOXEnabled(delegate.isLooseBBOXEnabled()); return filter; } + public boolean isLooseBBOXEnabled() { + return delegate.isLooseBBOXEnabled(); + } + + public void setLooseBBOXEnabled(boolean looseBBOXEnabled) { + delegate.setLooseBBOXEnabled(looseBBOXEnabled); + } + + @Override public void encodePrimaryKey(String column, StringBuffer sql) { delegate.encodePrimaryKey(column, sql); Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/main/java/org/geotools/data/db2/DB2SQLDialectPrepared.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; +import org.geotools.data.jdbc.FilterToSQL; import org.geotools.factory.Hints.Key; import org.geotools.jdbc.JDBCDataStore; import org.geotools.jdbc.PreparedFilterToSQL; @@ -65,12 +66,24 @@ @Override - public PreparedFilterToSQL createPreparedFilterToSQL() { + public PreparedFilterToSQL createPreparedFilterToSQL() { DB2FilterToSQL filter = new DB2FilterToSQL(this); filter.setFunctionEncodingEnabled(isFunctionEncodingEnabled()); + filter.setLooseBBOXEnabled(delegate.isLooseBBOXEnabled()); return filter; - } + } + + + public boolean isLooseBBOXEnabled() { + return delegate.isLooseBBOXEnabled(); + } + + public void setLooseBBOXEnabled(boolean looseBBOXEnabled) { + delegate.setLooseBBOXEnabled(looseBBOXEnabled); + } + + @Override public void encodePrimaryKey(String column, StringBuffer sql) { delegate.encodePrimaryKey(column, sql); Modified: trunk/modules/plugin/jdbc/jdbc-db2/src/test/java/org/geotools/data/db2/DB2SpatialFiltersTest.java =================================================================== --- trunk/modules/plugin/jdbc/jdbc-db2/src/test/java/org/geotools/data/db2/DB2SpatialFiltersTest.java 2012-03-27 14:51:52 UTC (rev 38650) +++ trunk/modules/plugin/jdbc/jdbc-db2/src/test/java/org/geotools/data/db2/DB2SpatialFiltersTest.java 2012-03-27 14:53:07 UTC (rev 38651) @@ -19,15 +19,17 @@ import org.geotools.data.Query; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.factory.CommonFactoryFinder; +import org.geotools.feature.FeatureCollection; import org.geotools.jdbc.JDBCDataStoreAPITestSetup; import org.geotools.jdbc.JDBCSpatialFiltersTest; +import org.opengis.filter.FilterFactory; import org.opengis.filter.FilterFactory2; import org.opengis.filter.expression.Literal; import org.opengis.filter.expression.PropertyName; +import org.opengis.filter.spatial.BBOX; import org.opengis.filter.spatial.DWithin; import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiLineString; @@ -79,5 +81,21 @@ assertEquals(0, features.size()); } + public void testBboxFilter() throws Exception { + FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); + // should match "r2" and "r3" + BBOX bbox = ff.bbox(aname("geom"), 2, 3, 4, 5, "EPSG:4326"); + FeatureCollection features = dataStore.getFeatureSource(tname("road")).getFeatures(bbox); + assertEquals(2, features.size()); + } + + public void testBboxFilterDefault() throws Exception { + FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); + // should match "r2" and "r3" + BBOX bbox = ff.bbox("", 2, 3, 4, 5, "EPSG:4326"); + FeatureCollection features = dataStore.getFeatureSource(tname("road")).getFeatures(bbox); + assertEquals(2, features.size()); + } + } |