From 6eaaa49faa14e49bc81b7b4a9520f26238185c9b Mon Sep 17 00:00:00 2001 From: Karel Maesen Date: Sun, 12 Aug 2018 17:08:06 +0200 Subject: [PATCH] HHH-12608 Support for ST_Dwithin() in DB2 --- .../dialect/db2/DB2SpatialDialect.java | 28 ++++++++++++++++++- .../dialects/db2/DB2ExpectationsFactory.java | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/db2/DB2SpatialDialect.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/db2/DB2SpatialDialect.java index 1e1afc6d50..263b946efd 100644 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/db2/DB2SpatialDialect.java +++ b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/db2/DB2SpatialDialect.java @@ -7,6 +7,7 @@ package org.hibernate.spatial.dialect.db2; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.hibernate.HibernateException; @@ -14,6 +15,7 @@ import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.engine.config.spi.ConfigurationService; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.service.ServiceRegistry; import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor; import org.hibernate.spatial.GeolatteGeometryType; @@ -25,6 +27,9 @@ import org.hibernate.spatial.SpatialFunction; import org.hibernate.spatial.SpatialRelation; import org.hibernate.type.StandardBasicTypes; +import org.hibernate.type.Type; + +import static java.lang.String.format; /** * @author David Adler, Adtech Geospatial @@ -223,6 +228,7 @@ private void registerSpatialFunctions() { ) ); // Register non-SFS functions listed in Hibernate Spatial + registerFunction( "dwithin", new DWithinFunction()); // // The srid parameter needs to be explicitly cast to INTEGER to avoid a -245 SQLCODE, // // ambiguous parameter. @@ -244,7 +250,7 @@ private void registerSpatialFunctions() { @Override public String getDWithinSQL(String columnName) { - return "db2gse.ST_Distance(" + columnName + ",?) < ?"; + return "db2gse.ST_Intersects(" + columnName + ", db2gse.ST_Buffer(?, ?, 'METER')) = 1"; } @Override @@ -317,4 +323,24 @@ public boolean supports(SpatialFunction function) { public boolean supportsFiltering() { return false; } + + + private static class DWithinFunction extends StandardSQLFunction { + + public DWithinFunction() { + super( "db2gse.ST_Dwithin" , StandardBasicTypes.NUMERIC_BOOLEAN); + } + + public String render(Type firstArgumentType, final List args, final SessionFactoryImplementor factory) { + StringBuilder sb = new StringBuilder( "db2gse.ST_Intersects( " ); + sb.append( (String)args.get(0) ) // + .append(", db2gse.ST_Buffer(") + .append((String)args.get(1) ) + .append(", ") + .append((String)args.get(2) ) + .append(", 'METER'))"); + return sb.toString(); + } + + } } diff --git a/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/db2/DB2ExpectationsFactory.java b/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/db2/DB2ExpectationsFactory.java index e90d3b03c9..c23873824e 100644 --- a/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/db2/DB2ExpectationsFactory.java +++ b/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/db2/DB2ExpectationsFactory.java @@ -88,7 +88,7 @@ protected NativeSQLStatement createNativeRelateStatement(Geometry geom, String m @Override protected NativeSQLStatement createNativeDwithinStatement(Point geom, double distance) { - String sql = "select t.id, DB2GSE.ST_dwithin(t.geom, DB2GSE.ST_GeomFromText(?, 4326), " + distance + " ) from GeomTest t where DB2GSE.ST_dwithin(t.geom, DB2GSE.ST_GeomFromText(?, 4326), " + distance + ") = 1 and db2gse.st_srid(t.geom) = 4326"; + String sql = "select t.id, DB2GSE.ST_dwithin(DB2GSE.ST_GeomFromText(?, 4326), t.geom, " + distance + " , 'METER') from GeomTest t where DB2GSE.ST_dwithin(DB2GSE.ST_GeomFromText(?, 4326), t.geom, " + distance + ", 'METER') = 1 and db2gse.st_srid(t.geom) = 4326"; return createNativeSQLStatementAllWKTParams( sql, geom.toText() ); }