HHH-14800 Prepare refactoring hibernate-spatial
In preparation for the design as discussed in #4111: - Fixex compile errors - Deprecates the SpatialDialects - Removes the matrix test configuration (obsolete) - Removes support for Criteria
This commit is contained in:
parent
61d1891f55
commit
dcf2a85d20
|
@ -1,12 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
mavenLocal( )
|
|
||||||
}
|
|
||||||
|
|
||||||
jdbcDependency "com.ibm.db2:db2jcc:11.1"
|
|
|
@ -1,27 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.test.new_metadata_mappings = true
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.db2.DB2SpatialDialect
|
|
||||||
hibernate.connection.driver_class com.ibm.db2.jcc.DB2Driver
|
|
||||||
hibernate.connection.url jdbc:db2://localhost:50000/hibern8
|
|
||||||
hibernate.connection.username db2inst1
|
|
||||||
hibernate.connection.password oPucroAsMAgL
|
|
||||||
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
||||||
|
|
||||||
## Ensures that all geometries that are retrieved are in WGS84
|
|
||||||
hibernate.spatial.db2.srid 4326
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "org.opengeo:geodb:0.7"
|
|
|
@ -1,24 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
|
|
||||||
hibernate.connection.driver_class org.h2.Driver
|
|
||||||
hibernate.connection.url jdbc:h2:mem:testhbs;DB_CLOSE_DELAY=-1;MVCC=true
|
|
||||||
hibernate.connection.username sa
|
|
||||||
hibernate.connection.password sa
|
|
||||||
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "com.sap.cloud.db.jdbc:ngdbc:2.2.16"
|
|
|
@ -1,26 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.test.new_metadata_mappings = true
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.hana.HANASpatialDialect
|
|
||||||
hibernate.connection.driver_class com.sap.db.jdbc.Driver
|
|
||||||
hibernate.connection.url jdbc:sap://localhost:30015
|
|
||||||
hibernate.connection.username hibernate
|
|
||||||
hibernate.connection.password hibernate
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "mysql:mysql-connector-java:8.0.17"
|
|
|
@ -1,25 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
|
|
||||||
hibernate.connection.driver_class com.mysql.jdbc.Driver
|
|
||||||
hibernate.connection.url jdbc:mysql://localhost:3306/hibern8
|
|
||||||
hibernate.connection.username hibernateormtest
|
|
||||||
hibernate.connection.password hibernateormtest
|
|
||||||
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "mysql:mysql-connector-java:8.0.17"
|
|
|
@ -1,25 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect
|
|
||||||
hibernate.connection.driver_class com.mysql.jdbc.Driver
|
|
||||||
hibernate.connection.url jdbc:mysql://localhost:3306/hibern8
|
|
||||||
hibernate.connection.username hibernateormtest
|
|
||||||
hibernate.connection.password hibernateormtest
|
|
||||||
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "com.oracle:ojdbc7:12.1.0.2.0"
|
|
|
@ -1,25 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect
|
|
||||||
hibernate.connection.driver_class oracle.jdbc.OracleDriver
|
|
||||||
hibernate.connection.url jdbc:oracle:thin:@localhost:1521:ORCL
|
|
||||||
hibernate.connection.username C##hibernate
|
|
||||||
hibernate.connection.password hibernate
|
|
||||||
|
|
||||||
## uncommenting this will fail a unit test!!
|
|
||||||
hibernate.spatial.connection_finder org.hibernate.spatial.dialect.oracle.TestConnectionFinder
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "com.oracle:ojdbc7:12.1.0.2.0"
|
|
|
@ -1,25 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect
|
|
||||||
hibernate.connection.driver_class oracle.jdbc.OracleDriver
|
|
||||||
hibernate.connection.url jdbc:oracle:thin:@localhost:1521:ORCL
|
|
||||||
hibernate.connection.username C##hibernate
|
|
||||||
hibernate.connection.password hibernate
|
|
||||||
|
|
||||||
## uncommenting this will fail a unit test!!
|
|
||||||
#hibernate.spatial.ogc_strict false
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
|
@ -1,8 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency "com.oracle:ojdbc7:12.1.0.2.0"
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.oracle.OracleSpatialSDO10gDialect
|
|
||||||
hibernate.connection.driver_class oracle.jdbc.OracleDriver
|
|
||||||
hibernate.connection.url jdbc:oracle:thin:@localhost:1521:ORCL
|
|
||||||
hibernate.connection.username C##hibernate
|
|
||||||
hibernate.connection.password hibernate
|
|
||||||
|
|
||||||
## uncommenting this will fail a unit test!!
|
|
||||||
#hibernate.spatial.ogc_strict false
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
jdbcDependency 'org.postgresql:postgresql:42.2.16'
|
|
|
@ -1,21 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect
|
|
||||||
hibernate.connection.driver_class org.postgresql.Driver
|
|
||||||
hibernate.connection.url jdbc:postgresql://localhost/hibernate_orm_test
|
|
||||||
hibernate.connection.username hibernate_orm_test
|
|
||||||
hibernate.connection.password hibernate_orm_test
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
|
@ -1,11 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
repositories {
|
|
||||||
mavenLocal( )
|
|
||||||
}
|
|
||||||
|
|
||||||
jdbcDependency 'com.microsoft.sqlserver:mssql-jdbc:6.4.0.jre8'
|
|
|
@ -1,23 +0,0 @@
|
||||||
#
|
|
||||||
# Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
#
|
|
||||||
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
#
|
|
||||||
|
|
||||||
hibernate.dialect org.hibernate.spatial.dialect.sqlserver.SqlServer2012SpatialDialect
|
|
||||||
hibernate.connection.driver_class com.microsoft.sqlserver.jdbc.SQLServerDriver
|
|
||||||
hibernate.connection.url jdbc:sqlserver://localhost:1433;databaseName=TestDb
|
|
||||||
hibernate.connection.username hibern8
|
|
||||||
hibernate.connection.password langpaswoord123A%1
|
|
||||||
|
|
||||||
|
|
||||||
hibernate.connection.pool_size 5
|
|
||||||
|
|
||||||
hibernate.show_sql true
|
|
||||||
hibernate.format_sql true
|
|
||||||
|
|
||||||
hibernate.max_fetch_depth 5
|
|
||||||
|
|
||||||
hibernate.cache.region_prefix hibernate.test
|
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
|
|
@ -21,8 +21,7 @@ dependencies {
|
||||||
|
|
||||||
testCompile(libraries.junit)
|
testCompile(libraries.junit)
|
||||||
testCompile(project(':hibernate-testing'))
|
testCompile(project(':hibernate-testing'))
|
||||||
testCompile( project( path: ':hibernate-core', configuration: 'tests' ) )
|
testCompile( project( path: ':hibernate-core', configuration: 'tests' ) )
|
||||||
testCompile([group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.8.0'])
|
|
||||||
testCompile(libraries.validation)
|
testCompile(libraries.validation)
|
||||||
testCompile(libraries.jandex)
|
testCompile(libraries.jandex)
|
||||||
testCompile(libraries.classmate)
|
testCompile(libraries.classmate)
|
||||||
|
@ -44,6 +43,10 @@ sourceSets.test.resources {
|
||||||
setSrcDirs(['src/test/java', 'src/test/resources'])
|
setSrcDirs(['src/test/java', 'src/test/resources'])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tasks.test {
|
tasks.test {
|
||||||
enabled = project.db == 'pgsql'
|
enabled = project.db == 'pgsql'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//tasks.test.include '**/*'
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,8 @@
|
||||||
|
|
||||||
package org.hibernate.spatial;
|
package org.hibernate.spatial;
|
||||||
|
|
||||||
import java.sql.Types;
|
|
||||||
|
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
|
import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptorIndicators;
|
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.codec.Wkt;
|
import org.geolatte.geom.codec.Wkt;
|
||||||
|
@ -38,10 +34,10 @@ public class GeolatteGeometryJavaTypeDescriptor extends AbstractTypeDescriptor<G
|
||||||
super( Geometry.class );
|
super( Geometry.class );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public SqlTypeDescriptor getJdbcRecommendedSqlType(SqlTypeDescriptorIndicators context) {
|
// public JdbcTypeDescriptor getJdbcRecommendedSqlType(JdbcTypeDescriptorIndicators context) {
|
||||||
return context.getTypeConfiguration().getSqlTypeDescriptorRegistry().getDescriptor( Types.ARRAY );
|
// return context.getTypeConfiguration().getJdbcTypeDescriptorRegistry().getDescriptor( Types.ARRAY );
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(Geometry value) {
|
public String toString(Geometry value) {
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
package org.hibernate.spatial;
|
package org.hibernate.spatial;
|
||||||
|
|
||||||
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
|
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.GeometryCollection;
|
import org.geolatte.geom.GeometryCollection;
|
||||||
|
@ -44,7 +44,7 @@ public class GeolatteGeometryType extends AbstractSingleColumnStandardBasicType<
|
||||||
*
|
*
|
||||||
* @param sqlTypeDescriptor The Descriptor for the type used by the database for geometries.
|
* @param sqlTypeDescriptor The Descriptor for the type used by the database for geometries.
|
||||||
*/
|
*/
|
||||||
public GeolatteGeometryType(SqlTypeDescriptor sqlTypeDescriptor) {
|
public GeolatteGeometryType(JdbcTypeDescriptor sqlTypeDescriptor) {
|
||||||
super( sqlTypeDescriptor, GeolatteGeometryJavaTypeDescriptor.INSTANCE );
|
super( sqlTypeDescriptor, GeolatteGeometryJavaTypeDescriptor.INSTANCE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ public class HibernateSpatialConfigurationSettings implements Serializable {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public static final String CONNECTION_FINDER = "hibernate.spatial.connection_finder";
|
public static final String CONNECTION_FINDER = "hibernate.spatial.connection_finder";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SRID to use for the DB2 Spatial Dialects.
|
* SRID to use for the DB2 Spatial Dialects.
|
||||||
*/
|
*/
|
||||||
|
@ -31,5 +32,4 @@ public class HibernateSpatialConfigurationSettings implements Serializable {
|
||||||
//prevent this object from being instantiated
|
//prevent this object from being instantiated
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
package org.hibernate.spatial;
|
package org.hibernate.spatial;
|
||||||
|
|
||||||
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
|
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Geometry;
|
import org.locationtech.jts.geom.Geometry;
|
||||||
|
|
||||||
|
@ -21,10 +21,10 @@ public class JTSGeometryType extends AbstractSingleColumnStandardBasicType<Geome
|
||||||
/**
|
/**
|
||||||
* Constructs an instance with the specified {@code SqlTypeDescriptor}
|
* Constructs an instance with the specified {@code SqlTypeDescriptor}
|
||||||
*
|
*
|
||||||
* @param sqlTypeDescriptor The descriptor for the type used by the database for geometries.
|
* @param jdbcTypeDescriptor The descriptor for the type used by the database for geometries.
|
||||||
*/
|
*/
|
||||||
public JTSGeometryType(SqlTypeDescriptor sqlTypeDescriptor) {
|
public JTSGeometryType(JdbcTypeDescriptor jdbcTypeDescriptor) {
|
||||||
super( sqlTypeDescriptor, JTSGeometryJavaTypeDescriptor.INSTANCE );
|
super( jdbcTypeDescriptor, JTSGeometryJavaTypeDescriptor.INSTANCE );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,88 +15,88 @@ import java.io.Serializable;
|
||||||
*/
|
*/
|
||||||
public interface SpatialDialect extends Serializable {
|
public interface SpatialDialect extends Serializable {
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Returns the SQL fragment for the SQL WHERE-clause when parsing
|
// * Returns the SQL fragment for the SQL WHERE-clause when parsing
|
||||||
* <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
// * <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
||||||
* into prepared statements.
|
// * into prepared statements.
|
||||||
* <p/>
|
// * <p/>
|
||||||
*
|
// *
|
||||||
* @param columnName The name of the geometry-typed column to which the relation is
|
// * @param columnName The name of the geometry-typed column to which the relation is
|
||||||
* applied
|
// * applied
|
||||||
* @param spatialRelation The type of spatial relation (as defined in
|
// * @param spatialRelation The type of spatial relation (as defined in
|
||||||
* <code>SpatialRelation</code>).
|
// * <code>SpatialRelation</code>).
|
||||||
*
|
// *
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
// * @return SQL fragment {@code SpatialRelateExpression}
|
||||||
*/
|
// */
|
||||||
String getSpatialRelateSQL(String columnName, int spatialRelation);
|
// String getSpatialRelateSQL(String columnName, int spatialRelation);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Returns the SQL fragment for the SQL WHERE-expression when parsing
|
// * Returns the SQL fragment for the SQL WHERE-expression when parsing
|
||||||
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
// * <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
||||||
* into prepared statements.
|
// * into prepared statements.
|
||||||
*
|
// *
|
||||||
* @param columnName The name of the geometry-typed column to which the filter is
|
// * @param columnName The name of the geometry-typed column to which the filter is
|
||||||
* be applied
|
// * be applied
|
||||||
*
|
// *
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
// * @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
||||||
*/
|
// */
|
||||||
String getSpatialFilterExpression(String columnName);
|
// String getSpatialFilterExpression(String columnName);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Returns the SQL fragment for the specfied Spatial aggregate expression.
|
// * Returns the SQL fragment for the specfied Spatial aggregate expression.
|
||||||
*
|
// *
|
||||||
* @param columnName The name of the Geometry property
|
// * @param columnName The name of the Geometry property
|
||||||
* @param aggregation The type of <code>SpatialAggregate</code>
|
// * @param aggregation The type of <code>SpatialAggregate</code>
|
||||||
*
|
// *
|
||||||
* @return The SQL fragment for the projection
|
// * @return The SQL fragment for the projection
|
||||||
*/
|
// */
|
||||||
String getSpatialAggregateSQL(String columnName, int aggregation);
|
// String getSpatialAggregateSQL(String columnName, int aggregation);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
// * Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
||||||
*
|
// *
|
||||||
* @param columnName The geometry column to test against
|
// * @param columnName The geometry column to test against
|
||||||
*
|
// *
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
// * @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
||||||
*/
|
// */
|
||||||
String getDWithinSQL(String columnName);
|
// String getDWithinSQL(String columnName);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
// * Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
||||||
*
|
// *
|
||||||
* @param columnName The geometry column to test against
|
// * @param columnName The geometry column to test against
|
||||||
*
|
// *
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
// * @return The SQL fragment for a <code>HavingSridExpression</code>.
|
||||||
*/
|
// */
|
||||||
String getHavingSridSQL(String columnName);
|
// String getHavingSridSQL(String columnName);
|
||||||
|
//
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
// * Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
||||||
* <code>IsNotEmpty</code> expression.
|
// * <code>IsNotEmpty</code> expression.
|
||||||
*
|
// *
|
||||||
* @param columnName The geometry column
|
// * @param columnName The geometry column
|
||||||
* @param isEmpty Whether the geometry is tested for empty or non-empty
|
// * @param isEmpty Whether the geometry is tested for empty or non-empty
|
||||||
*
|
// *
|
||||||
* @return The SQL fragment for the isempty function
|
// * @return The SQL fragment for the isempty function
|
||||||
*/
|
// */
|
||||||
String getIsEmptySQL(String columnName, boolean isEmpty);
|
// String getIsEmptySQL(String columnName, boolean isEmpty);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
// * Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
||||||
* <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
// * <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
||||||
*
|
// *
|
||||||
* @return True if filtering is supported
|
// * @return True if filtering is supported
|
||||||
*/
|
// */
|
||||||
boolean supportsFiltering();
|
// boolean supportsFiltering();
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Does this dialect supports the specified <code>SpatialFunction</code>.
|
// * Does this dialect supports the specified <code>SpatialFunction</code>.
|
||||||
*
|
// *
|
||||||
* @param function <code>SpatialFunction</code>
|
// * @param function <code>SpatialFunction</code>
|
||||||
*
|
// *
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
// * @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
||||||
*/
|
// */
|
||||||
boolean supports(SpatialFunction function);
|
// boolean supports(SpatialFunction function);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.engine.spi.TypedValue;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect;
|
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Geometry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@code Criterion} constraining a geometry property to be within a specified distance of a search geometry.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen, Geovise BVBA
|
|
||||||
* creation-date: 2/1/11
|
|
||||||
*/
|
|
||||||
public class DWithinExpression implements Criterion {
|
|
||||||
|
|
||||||
|
|
||||||
private final String propertyName;
|
|
||||||
private final Geometry geometry;
|
|
||||||
private final double distance;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property being constrained
|
|
||||||
* @param geometry The search geometry
|
|
||||||
* @param distance The search distance (in units of the spatial reference system of the search geometry)
|
|
||||||
*/
|
|
||||||
public DWithinExpression(String propertyName, Geometry geometry, double distance) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.geometry = geometry;
|
|
||||||
this.distance = distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String column = ExpressionUtil.findColumn( propertyName, criteria, criteriaQuery );
|
|
||||||
final SpatialDialect spatialDialect = ExpressionUtil.getSpatialDialect(
|
|
||||||
criteriaQuery,
|
|
||||||
SpatialFunction.dwithin
|
|
||||||
);
|
|
||||||
return spatialDialect.getDWithinSQL( column );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final SpatialDialect spatialDialect = ExpressionUtil.getSpatialDialect(
|
|
||||||
criteriaQuery,
|
|
||||||
SpatialFunction.dwithin
|
|
||||||
);
|
|
||||||
TypedValue typedDistanceValue = new TypedValue( StandardBasicTypes.DOUBLE, distance );
|
|
||||||
if ( spatialDialect instanceof OracleSpatial10gDialect ) {
|
|
||||||
typedDistanceValue = new TypedValue( StandardBasicTypes.STRING, "distance=" + distance );
|
|
||||||
}
|
|
||||||
return new TypedValue[] {
|
|
||||||
criteriaQuery.getTypedValue( criteria, propertyName, geometry ),
|
|
||||||
typedDistanceValue
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class assists in the formation of a SQL-fragment in the various spatial query expressions.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen, Geovise BVBA
|
|
||||||
* creation-date: 2/15/11
|
|
||||||
*/
|
|
||||||
public class ExpressionUtil {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* private constructor prevents instantiation of this utility class
|
|
||||||
*/
|
|
||||||
private ExpressionUtil() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines the {@code SpatialDialect} for the specified {@code CriteriaQuery}, and checks if the
|
|
||||||
* specified function is supported.
|
|
||||||
*
|
|
||||||
* @param criteriaQuery The {@code CriteriaQuery} for which the dialect is sought
|
|
||||||
* @param function The function for which to check support
|
|
||||||
*
|
|
||||||
* @return The {@code SpatialDialect} associated with the specified {@code CriteriaQuery}
|
|
||||||
*
|
|
||||||
* @throws HibernateException If the dialect for the specified {@code CriteriaQuery} is not a {@code SpatialDialect}.
|
|
||||||
* or the specified {@code SpatialFunction} is not supported by the dialect.
|
|
||||||
*/
|
|
||||||
public static SpatialDialect getSpatialDialect(CriteriaQuery criteriaQuery, SpatialFunction function) {
|
|
||||||
final Dialect dialect = criteriaQuery.getFactory().getDialect();
|
|
||||||
if ( !( dialect instanceof SpatialDialect ) ) {
|
|
||||||
throw new HibernateException( "A spatial expression requires a spatial dialect." );
|
|
||||||
}
|
|
||||||
final SpatialDialect spatialDialect = (SpatialDialect) dialect;
|
|
||||||
if ( !spatialDialect.supports( function ) ) {
|
|
||||||
throw new HibernateException( function + " function not supported by this dialect" );
|
|
||||||
}
|
|
||||||
return spatialDialect;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines the column name corresponding to the specified property path.
|
|
||||||
*
|
|
||||||
* @param propertyName The property path
|
|
||||||
* @param criteria The criteria
|
|
||||||
* @param criteriaQuery The criteria query
|
|
||||||
*
|
|
||||||
* @return The column name
|
|
||||||
*
|
|
||||||
* @throws HibernateException If the property could not be resolved, or more than one column is mapped by the property path.
|
|
||||||
*/
|
|
||||||
public static String findColumn(String propertyName, Criteria criteria, CriteriaQuery criteriaQuery) {
|
|
||||||
final String[] columns = criteriaQuery.findColumns( propertyName, criteria );
|
|
||||||
if ( columns.length != 1 ) {
|
|
||||||
throw new HibernateException( "Spatial Expression may only be used with single-column properties" );
|
|
||||||
}
|
|
||||||
return columns[0];
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.engine.spi.TypedValue;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@code Criterion} constraining a geometry property to have a specified SRID.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen, Geovise BVBA
|
|
||||||
*/
|
|
||||||
public class HavingSridExpression implements Criterion {
|
|
||||||
|
|
||||||
private final String propertyName;
|
|
||||||
private final int srid;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance for the specified property and srid
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property being constrained
|
|
||||||
* @param srid The srid
|
|
||||||
*/
|
|
||||||
public HavingSridExpression(String propertyName, int srid) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.srid = srid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String column = ExpressionUtil.findColumn( propertyName, criteria, criteriaQuery );
|
|
||||||
final SpatialDialect spatialDialect = ExpressionUtil.getSpatialDialect( criteriaQuery, SpatialFunction.srid );
|
|
||||||
return spatialDialect.getHavingSridSQL( column );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
return new TypedValue[] {
|
|
||||||
new TypedValue( StandardBasicTypes.INTEGER, srid )
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.engine.spi.TypedValue;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@code Criterion} constraining a geometry property to be (non-)empty.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen, Geovise BVBA
|
|
||||||
*/
|
|
||||||
public class IsEmptyExpression implements Criterion {
|
|
||||||
|
|
||||||
private static final TypedValue[] NO_VALUES = new TypedValue[0];
|
|
||||||
|
|
||||||
private final String propertyName;
|
|
||||||
private final boolean isEmpty;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance for the specified property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property being constrained
|
|
||||||
* @param isEmpty Whether to constrain the property to be empty or non-empty
|
|
||||||
*/
|
|
||||||
public IsEmptyExpression(String propertyName, boolean isEmpty) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.isEmpty = isEmpty;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String column = ExpressionUtil.findColumn( propertyName, criteria, criteriaQuery );
|
|
||||||
final SpatialDialect spatialDialect = ExpressionUtil.getSpatialDialect(
|
|
||||||
criteriaQuery,
|
|
||||||
SpatialFunction.isempty
|
|
||||||
);
|
|
||||||
return spatialDialect.getIsEmptySQL( column, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
return NO_VALUES;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
|
||||||
import org.hibernate.engine.spi.TypedValue;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.jts.EnvelopeAdapter;
|
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Envelope;
|
|
||||||
import org.locationtech.jts.geom.Geometry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A <code>Criterion</code> constraining a geometry property to have a bounding box that overlaps with
|
|
||||||
* a specified bounding box.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen
|
|
||||||
*/
|
|
||||||
public class SpatialFilter implements Criterion {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
private String propertyName;
|
|
||||||
private Geometry filter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance with the specified property and the bounding box of the specified geometry.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the propety being constrained
|
|
||||||
* @param filter The geometry whose bounding box is used as search geometry
|
|
||||||
*/
|
|
||||||
public SpatialFilter(String propertyName, Geometry filter) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.filter = filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance with the specified property and the bounding box of the specified geometry.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the propety being constrained
|
|
||||||
* @param envelope The bounding box is used as search geometry
|
|
||||||
* @param srid The SRID of the specified bounding box
|
|
||||||
*/
|
|
||||||
public SpatialFilter(String propertyName, Envelope envelope, int srid) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.filter = EnvelopeAdapter.toPolygon( envelope, srid );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
return new TypedValue[] {
|
|
||||||
criteriaQuery.getTypedValue( criteria, propertyName, filter )
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final SessionFactoryImplementor factory = criteriaQuery.getFactory();
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName );
|
|
||||||
final Dialect dialect = factory.getDialect();
|
|
||||||
if ( dialect instanceof SpatialDialect ) {
|
|
||||||
final SpatialDialect seDialect = (SpatialDialect) dialect;
|
|
||||||
return seDialect.getSpatialFilterExpression( columns[0] );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new IllegalStateException( "Dialect must be spatially enabled dialect" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Projection;
|
|
||||||
import org.hibernate.criterion.SimpleProjection;
|
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
|
||||||
import org.hibernate.spatial.SpatialAggregate;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.type.Type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A factory for spatial projections.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen
|
|
||||||
*/
|
|
||||||
public class SpatialProjections {
|
|
||||||
|
|
||||||
private SpatialProjections() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies an extent projection to the specified geometry function
|
|
||||||
* <p>
|
|
||||||
* <p>The extent of a set of {@code Geometry}s is the union of their bounding boxes.</p>
|
|
||||||
*
|
|
||||||
* @param propertyName The property to use for calculating the extent
|
|
||||||
*
|
|
||||||
* @return an extent-projection for the specified property.
|
|
||||||
*/
|
|
||||||
public static Projection extent(final String propertyName) {
|
|
||||||
return new SimpleProjection() {
|
|
||||||
|
|
||||||
public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
return new Type[] {
|
|
||||||
criteriaQuery.getType( criteria, propertyName )
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery)
|
|
||||||
throws HibernateException {
|
|
||||||
final StringBuilder stbuf = new StringBuilder();
|
|
||||||
|
|
||||||
final SessionFactoryImplementor factory = criteriaQuery.getFactory();
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, propertyName );
|
|
||||||
final Dialect dialect = factory.getDialect();
|
|
||||||
if ( dialect instanceof SpatialDialect ) {
|
|
||||||
final SpatialDialect seDialect = (SpatialDialect) dialect;
|
|
||||||
stbuf.append(
|
|
||||||
seDialect.getSpatialAggregateSQL( columns[0], SpatialAggregate.EXTENT )
|
|
||||||
);
|
|
||||||
stbuf.append( " as y" ).append( position ).append( '_' );
|
|
||||||
return stbuf.toString();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
|
||||||
import org.hibernate.engine.spi.TypedValue;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Geometry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@code Criterion} constraining a {@code Geometry} property to have specific spatial relation
|
|
||||||
* to a search {@code Geometry}.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen
|
|
||||||
*/
|
|
||||||
public class SpatialRelateExpression implements Criterion {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
/**
|
|
||||||
* The geometry property
|
|
||||||
*/
|
|
||||||
private String propertyName;
|
|
||||||
/**
|
|
||||||
* The test geometry
|
|
||||||
*/
|
|
||||||
private Geometry value;
|
|
||||||
/**
|
|
||||||
* The spatial relation that is queried for.
|
|
||||||
*/
|
|
||||||
private int spatialRelation = -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property being constrained
|
|
||||||
* @param value The search {@code Geometry}
|
|
||||||
* @param spatialRelation The type of {@code SpatialRelation} to use in the comparison
|
|
||||||
*/
|
|
||||||
public SpatialRelateExpression(String propertyName, Geometry value, int spatialRelation) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.spatialRelation = spatialRelation;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
return new TypedValue[] { criteriaQuery.getTypedValue( criteria, propertyName, value ) };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final SessionFactoryImplementor factory = criteriaQuery.getFactory();
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName );
|
|
||||||
final Dialect dialect = factory.getDialect();
|
|
||||||
if ( dialect instanceof SpatialDialect ) {
|
|
||||||
final SpatialDialect seDialect = (SpatialDialect) dialect;
|
|
||||||
return seDialect.getSpatialRelateSQL( columns[0], spatialRelation );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new IllegalStateException( "Dialect must be spatially enabled dialect" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,288 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Envelope;
|
|
||||||
import org.locationtech.jts.geom.Geometry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A factory for spatial criteria.
|
|
||||||
* <p>
|
|
||||||
* The criterion types created by this class implement the spatial query
|
|
||||||
* expressions of the OpenGIS Simple Features Specification for SQL, Revision
|
|
||||||
* 1.1. In addition, it provides for a simple spatial <code>filter</code> that
|
|
||||||
* works mostly using the spatial index. This corresponds to the Oracle
|
|
||||||
* Spatial's "SDO_FILTER" function, or the "&&" operator of PostGIS.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen
|
|
||||||
*/
|
|
||||||
public class SpatialRestrictions {
|
|
||||||
|
|
||||||
private SpatialRestrictions() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially equal" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression eq(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.EQUALS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially within" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression within(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.WITHIN
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially contains" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression contains(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.CONTAINS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially crosses" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression crosses(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.CROSSES
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially disjoint" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression disjoint(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.DISJOINT
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially intersects" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression intersects(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.INTERSECTS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially overlaps" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression overlaps(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.OVERLAPS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "spatially touches" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in comparison
|
|
||||||
*
|
|
||||||
* @return SpatialRelateExpression
|
|
||||||
*
|
|
||||||
* @see SpatialRelateExpression
|
|
||||||
*/
|
|
||||||
public static SpatialRelateExpression touches(String propertyName, Geometry value) {
|
|
||||||
return new SpatialRelateExpression(
|
|
||||||
propertyName, value,
|
|
||||||
SpatialRelation.TOUCHES
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a bounding box overlap constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value whose bounding box to use in the comparison
|
|
||||||
*
|
|
||||||
* @return SpatialFilter
|
|
||||||
*
|
|
||||||
* @see SpatialFilter
|
|
||||||
*/
|
|
||||||
public static SpatialFilter filter(String propertyName, Geometry value) {
|
|
||||||
return new SpatialFilter( propertyName, value );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a bounding box overlap constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param envelope The envelope or bounding box to use in the comparison
|
|
||||||
* @param srid the SRID of the bounding box
|
|
||||||
*
|
|
||||||
* @return SpatialFilter
|
|
||||||
*
|
|
||||||
* @see SpatialFilter
|
|
||||||
*/
|
|
||||||
public static SpatialFilter filter(String propertyName, Envelope envelope, int srid) {
|
|
||||||
return new SpatialFilter( propertyName, envelope, srid );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "distance within" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geometry The geometry value to use in the comparison
|
|
||||||
* @param distance The distance
|
|
||||||
*
|
|
||||||
* @return DWithinExpression
|
|
||||||
*
|
|
||||||
* @see DWithinExpression
|
|
||||||
*/
|
|
||||||
public static Criterion distanceWithin(String propertyName, Geometry geometry, double distance) {
|
|
||||||
return new DWithinExpression( propertyName, geometry, distance );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply a "having srid" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param srid The SRID value to use in the comparison
|
|
||||||
*
|
|
||||||
* @return A HavingSridExpression
|
|
||||||
*
|
|
||||||
* @see HavingSridExpression
|
|
||||||
*/
|
|
||||||
public static Criterion havingSRID(String propertyName, int srid) {
|
|
||||||
return new HavingSridExpression( propertyName, srid );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply an "is empty" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
*
|
|
||||||
* @return A IsEmptyExpression
|
|
||||||
*
|
|
||||||
* @see IsEmptyExpression
|
|
||||||
*/
|
|
||||||
public static Criterion isEmpty(String propertyName) {
|
|
||||||
return new IsEmptyExpression( propertyName, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply an "is not empty" constraint to the named property
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
*
|
|
||||||
* @return A IsEmptyExpression
|
|
||||||
*
|
|
||||||
* @see IsEmptyExpression
|
|
||||||
*/
|
|
||||||
public static Criterion isNotEmpty(String propertyName) {
|
|
||||||
return new IsEmptyExpression( propertyName, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the specified spatial relation constraint to the named property.
|
|
||||||
*
|
|
||||||
* @param relation The spatial relation to apply
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param value The geometry value to use in the comparison
|
|
||||||
*
|
|
||||||
* @return SpatialFilter
|
|
||||||
*
|
|
||||||
* @see SpatialFilter
|
|
||||||
*/
|
|
||||||
public static Criterion spatialRestriction(int relation, String propertyName, Geometry value) {
|
|
||||||
switch ( relation ) {
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return contains( propertyName, value );
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return crosses( propertyName, value );
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return disjoint( propertyName, value );
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return intersects( propertyName, value );
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return eq( propertyName, value );
|
|
||||||
case SpatialRelation.FILTER:
|
|
||||||
return filter( propertyName, value );
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return overlaps( propertyName, value );
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return touches( propertyName, value );
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return within( propertyName, value );
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Non-existant spatial relation passed."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<!--
|
|
||||||
~ Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
~
|
|
||||||
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head></head>
|
|
||||||
<body>
|
|
||||||
<p>
|
|
||||||
This extends the criterion API with spatial query expressions.
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -11,26 +11,26 @@ import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers all available spatial functions for a <code>Dialect</code>
|
* Registers all available spatial functions for a <code>Dialect</code>
|
||||||
* <p>
|
* <p>
|
||||||
* Created by Karel Maesen, Geovise BVBA on 29/10/16.
|
* Created by Karel Maesen, Geovise BVBA on 29/10/16.
|
||||||
*/
|
*/
|
||||||
public abstract class SpatialFunctionsRegistry implements Iterable<Map.Entry<String, SQLFunction>>, Serializable {
|
public abstract class SpatialFunctionsRegistry implements Iterable<Map.Entry<String, SqmFunctionDescriptor>>, Serializable {
|
||||||
protected final Map<String, SQLFunction> functionMap = new HashMap<String, SQLFunction>();
|
protected final Map<String, SqmFunctionDescriptor> functionMap = new HashMap<String, SqmFunctionDescriptor>();
|
||||||
|
|
||||||
public void put(String name, SQLFunction function) {
|
public void put(String name, SqmFunctionDescriptor function) {
|
||||||
this.functionMap.put( name, function );
|
this.functionMap.put( name, function );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<Map.Entry<String, SQLFunction>> iterator() {
|
public Iterator<Map.Entry<String, SqmFunctionDescriptor>> iterator() {
|
||||||
return functionMap.entrySet().iterator();
|
return functionMap.entrySet().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SQLFunction get(String functionName) {
|
public SqmFunctionDescriptor get(String functionName) {
|
||||||
return functionMap.get( functionName );
|
return functionMap.get( functionName );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,44 +7,13 @@
|
||||||
|
|
||||||
package org.hibernate.spatial.dialect.cockroachdb;
|
package org.hibernate.spatial.dialect.cockroachdb;
|
||||||
|
|
||||||
import java.util.Map;
|
import org.hibernate.dialect.CockroachDialect;
|
||||||
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.CockroachDB201Dialect;
|
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.dialect.postgis.PGGeometryTypeDescriptor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An @{code SpatialDialect} for CockroachDB 20.2 and later. CockroachDB's spatial features where introduced in
|
* An @{code SpatialDialect} for CockroachDB 20.2 and later. CockroachDB's spatial features where introduced in
|
||||||
* that version.
|
* that version.
|
||||||
*/
|
*/
|
||||||
public class CockroachDB202SpatialDialect extends CockroachDB201Dialect implements CockroachSpatialDialectTrait {
|
@Deprecated
|
||||||
|
public class CockroachDB202SpatialDialect extends CockroachDialect implements SpatialDialect {
|
||||||
|
|
||||||
public CockroachDB202SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_2.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
delegateContributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( isSpatial( typeCode1 ) && isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,32 +44,32 @@ public interface CockroachSpatialDialectTrait extends SpatialDialect {
|
||||||
return DELEGATE.getSpatialFilterExpression( columnName );
|
return DELEGATE.getSpatialFilterExpression( columnName );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getSpatialAggregateSQL(String columnName, int aggregation) {
|
default String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||||
return DELEGATE.getSpatialAggregateSQL( columnName, aggregation );
|
return DELEGATE.getSpatialAggregateSQL( columnName, aggregation );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getDWithinSQL(String columnName) {
|
default String getDWithinSQL(String columnName) {
|
||||||
return DELEGATE.getDWithinSQL( columnName );
|
return DELEGATE.getDWithinSQL( columnName );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getHavingSridSQL(String columnName) {
|
default String getHavingSridSQL(String columnName) {
|
||||||
return DELEGATE.getHavingSridSQL( columnName );
|
return DELEGATE.getHavingSridSQL( columnName );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getIsEmptySQL(String columnName, boolean isEmpty) {
|
default String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||||
return DELEGATE.getIsEmptySQL( columnName, isEmpty );
|
return DELEGATE.getIsEmptySQL( columnName, isEmpty );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default boolean supportsFiltering() {
|
default boolean supportsFiltering() {
|
||||||
return DELEGATE.supportsFiltering();
|
return DELEGATE.supportsFiltering();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default boolean supports(SpatialFunction function) {
|
default boolean supports(SpatialFunction function) {
|
||||||
return DELEGATE.supports( function );
|
return DELEGATE.supports( function );
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.codec.db.db2.Db2ClobDecoder;
|
import org.geolatte.geom.codec.db.db2.Db2ClobDecoder;
|
||||||
|
@ -30,7 +30,7 @@ import org.geolatte.geom.codec.db.db2.Db2ClobEncoder;
|
||||||
* <p>
|
* <p>
|
||||||
* Created by Karel Maesen, Geovise BVBA, and David Adler, Adtech Geospatial
|
* Created by Karel Maesen, Geovise BVBA, and David Adler, Adtech Geospatial
|
||||||
*/
|
*/
|
||||||
public class DB2GeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class DB2GeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
|
|
||||||
private final Integer srid;
|
private final Integer srid;
|
||||||
|
@ -40,7 +40,7 @@ public class DB2GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.CLOB;
|
return Types.CLOB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ public class DB2GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String toText(X value, WrapperOptions options) {
|
private String toText(X value, WrapperOptions options) {
|
||||||
final Geometry<?> geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry<?> geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final Db2ClobEncoder encoder = new Db2ClobEncoder();
|
final Db2ClobEncoder encoder = new Db2ClobEncoder();
|
||||||
String encoded = encoder.encode( geometry );
|
String encoded = encoder.encode( geometry );
|
||||||
return encoded;
|
return encoded;
|
||||||
|
@ -81,18 +81,18 @@ public class DB2GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( rs.getObject( paramIndex ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( rs.getObject( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getObject( index ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getObject( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getObject( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,298 +35,4 @@ import org.hibernate.type.Type;
|
||||||
*/
|
*/
|
||||||
public class DB2SpatialDialect extends DB2Dialect implements SpatialDialect {
|
public class DB2SpatialDialect extends DB2Dialect implements SpatialDialect {
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
private final Map<Integer, String> spatialRelationNames = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct a DB2Spatial dialect. Register the geometry type and spatial
|
|
||||||
* functions supported.
|
|
||||||
*/
|
|
||||||
public DB2SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerSpatialType();
|
|
||||||
registerSpatialFunctions();
|
|
||||||
initializeRelationNames();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
final DB2GeometryTypeDescriptor typeDescriptor = mkDescriptor( serviceRegistry );
|
|
||||||
typeContributions.contributeType( new GeolatteGeometryType( typeDescriptor ) );
|
|
||||||
typeContributions.contributeType( new JTSGeometryType( typeDescriptor ) );
|
|
||||||
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( GeolatteGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( JTSGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
}
|
|
||||||
|
|
||||||
private DB2GeometryTypeDescriptor mkDescriptor(ServiceRegistry serviceRegistry) {
|
|
||||||
ConfigurationService configurationService = serviceRegistry.getService( ConfigurationService.class );
|
|
||||||
Integer srid = retrieveSridFromConfiguration( configurationService );
|
|
||||||
return new DB2GeometryTypeDescriptor( srid );
|
|
||||||
}
|
|
||||||
|
|
||||||
private Integer retrieveSridFromConfiguration(ConfigurationService configurationService) {
|
|
||||||
Integer srid = 0;
|
|
||||||
try {
|
|
||||||
srid = Integer.parseInt( configurationService.getSetting(
|
|
||||||
HibernateSpatialConfigurationSettings.DB2_DEFAULT_SRID,
|
|
||||||
String.class,
|
|
||||||
"0"
|
|
||||||
) );
|
|
||||||
}
|
|
||||||
catch (NumberFormatException e) {
|
|
||||||
throw new HibernateException(
|
|
||||||
"Invalid format for configuration parameter (Integer expected): " + HibernateSpatialConfigurationSettings.DB2_DEFAULT_SRID,
|
|
||||||
e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return srid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the map relating Hibernate Spatial relation constants to DB2 function names.
|
|
||||||
*/
|
|
||||||
private void initializeRelationNames() {
|
|
||||||
|
|
||||||
spatialRelationNames.put( SpatialRelation.EQUALS, "ST_EQUALS" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.DISJOINT, "ST_DISJOINT" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.TOUCHES, "ST_TOUCHES" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.CROSSES, "ST_CROSSES" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.WITHIN, "ST_WITHIN" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.OVERLAPS, "ST_OVERLAPS" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.CONTAINS, "ST_CONTAINS" );
|
|
||||||
spatialRelationNames.put( SpatialRelation.INTERSECTS, "ST_INTERSECTS" );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the spatial type.
|
|
||||||
* The type, CLOB or BLOB is defined in DB2GeometryTypeDescriptor and must match
|
|
||||||
* the type specified in the DB2_PROGRAM transform function.
|
|
||||||
*/
|
|
||||||
private void registerSpatialType() {
|
|
||||||
|
|
||||||
// Register Geometry column type
|
|
||||||
registerColumnType( java.sql.Types.CLOB, " db2gse.ST_Geometry" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the spatial functions supported.
|
|
||||||
*/
|
|
||||||
private void registerSpatialFunctions() {
|
|
||||||
|
|
||||||
// Register functions used as spatial predicates
|
|
||||||
// The first parameter of registerFunction is the name that Hibernate looks for in the HQL.
|
|
||||||
// The first parameter of StandardSQLFunction is the DB2 spatial function name that will replace it.
|
|
||||||
// The second parameter of StandardSQLFunction is the return type of the function, always integer for functions used as predicates.
|
|
||||||
// This is used by Hibernate independent of Hibernate Spatial.
|
|
||||||
//
|
|
||||||
// Note that this somewhat duplicates the information in spatialRelationNames used by getSpatialRelateSQL which
|
|
||||||
// is invoked by Hibernate Spatial to handle SpatialRelateExpression when this is used in a Criteria.
|
|
||||||
|
|
||||||
registerFunction( "equals", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Equals",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "disjoint", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Disjoint",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "touches", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Touches",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "crosses", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Crosses",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
|
|
||||||
registerFunction( "within", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Within",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "overlaps", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Overlaps",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "contains", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Contains",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "intersects", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Intersects",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "relate", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Relate",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
|
|
||||||
// Register functions on Geometry
|
|
||||||
registerFunction( "dimension", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Dimension",
|
|
||||||
StandardBasicTypes.INTEGER
|
|
||||||
) );
|
|
||||||
registerFunction( "geometrytype", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_GeometryType",
|
|
||||||
StandardBasicTypes.STRING
|
|
||||||
) );
|
|
||||||
registerFunction( "srid", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Srsid",
|
|
||||||
StandardBasicTypes.INTEGER
|
|
||||||
) );
|
|
||||||
registerFunction( "envelope", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Envelope"
|
|
||||||
) );
|
|
||||||
registerFunction( "astext", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_AsText",
|
|
||||||
StandardBasicTypes.STRING
|
|
||||||
) );
|
|
||||||
registerFunction( "asbinary", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_AsBinary",
|
|
||||||
StandardBasicTypes.BINARY
|
|
||||||
) );
|
|
||||||
registerFunction( "isempty", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_IsEmpty",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "issimple", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_IsSimple",
|
|
||||||
StandardBasicTypes.NUMERIC_BOOLEAN
|
|
||||||
) );
|
|
||||||
registerFunction( "boundary", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Boundary"
|
|
||||||
) );
|
|
||||||
|
|
||||||
// Register functions that support spatial analysis
|
|
||||||
registerFunction( "distance", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Distance",
|
|
||||||
StandardBasicTypes.DOUBLE
|
|
||||||
) );
|
|
||||||
registerFunction( "buffer", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Buffer"
|
|
||||||
) );
|
|
||||||
registerFunction( "convexhull", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_ConvexHull"
|
|
||||||
) );
|
|
||||||
registerFunction( "intersection", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Intersection"
|
|
||||||
) );
|
|
||||||
registerFunction( "geomunion", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Union"
|
|
||||||
) );
|
|
||||||
registerFunction( "difference", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_Difference"
|
|
||||||
) );
|
|
||||||
registerFunction( "symdifference", new StandardSQLFunction(
|
|
||||||
"db2gse.ST_SymDifference"
|
|
||||||
) );
|
|
||||||
|
|
||||||
// Register non-SFS functions listed in Hibernate Spatial
|
|
||||||
registerFunction( "dwithin", new DWithinFunction() );
|
|
||||||
|
|
||||||
registerFunction( "geomFromText", new StandardSQLFunction(
|
|
||||||
"DB2GSE.ST_GeomFromText"
|
|
||||||
) );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return "db2gse.ST_Intersects(" + columnName + ", db2gse.ST_Buffer(?, ?, 'METER')) = 1";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return "( db2gse.ST_srsid(" + columnName + ") = ?)";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
if ( isEmpty ) {
|
|
||||||
return "( db2gse.ST_IsEmpty(" + columnName + ") = 1)";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return "( db2gse.ST_IsEmpty(" + columnName + ") = 0)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int type) {
|
|
||||||
switch ( type ) {
|
|
||||||
case SpatialAggregate.EXTENT:
|
|
||||||
return "db2gse.ST_GetAggrResult(MAX(db2gse.st_BuildMBRAggr(" + columnName + ")))";
|
|
||||||
case SpatialAggregate.UNION:
|
|
||||||
return "db2gse.ST_GetAggrResult(MAX(db2gse.st_BuildUnionAggr(" + columnName + ")))";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Aggregation of type "
|
|
||||||
+ type + " are not supported by this dialect"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String arg0) {
|
|
||||||
throw new UnsupportedOperationException( "DB2 Dialect doesn't support spatial filtering" );
|
|
||||||
}
|
|
||||||
|
|
||||||
//Temporary Fix for HHH-6074
|
|
||||||
@Override
|
|
||||||
public String getTypeName(int code, long length, int precision, int scale) throws HibernateException {
|
|
||||||
if ( code == 3000 ) {
|
|
||||||
return "DB2GSE.ST_GEOMETRY";
|
|
||||||
}
|
|
||||||
return super.getTypeName( code, length, precision, scale );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
String relationName = spatialRelationNames.get( spatialRelation );
|
|
||||||
if ( relationName != null ) {
|
|
||||||
if ( spatialRelation != SpatialRelation.DISJOINT ) {
|
|
||||||
return " db2gse." + relationName + "(" + columnName + ", ?) = 1 SELECTIVITY .0001";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// SELECTIVITY not supported for ST_Disjoint UDF
|
|
||||||
return " db2gse." + relationName + "(" + columnName + ", ?) = 1";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Spatial relation " + spatialRelation + " not implemented" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return ( getFunctions().get( function.toString() ) != null );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,158 +35,4 @@ import org.hibernate.type.Type;
|
||||||
*/
|
*/
|
||||||
public class GeoDBDialect extends H2Dialect implements SpatialDialect {
|
public class GeoDBDialect extends H2Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor. Registers OGC simple feature functions (see
|
|
||||||
* http://portal.opengeospatial.org/files/?artifact_id=829 for details).
|
|
||||||
* <p/>
|
|
||||||
* Note for the registerfunction method: it registers non-standard database
|
|
||||||
* functions: first argument is the internal (OGC standard) function name,
|
|
||||||
* second the name as it occurs in the spatial dialect
|
|
||||||
*/
|
|
||||||
public GeoDBDialect() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
// Register Geometry column type
|
|
||||||
registerColumnType( GeoDBGeometryTypeDescriptor.INSTANCE.getSqlType(), "GEOMETRY" );
|
|
||||||
|
|
||||||
// Register functions that operate on spatial types
|
|
||||||
registerFunction( "dimension", new StandardSQLFunction( "ST_Dimension", StandardBasicTypes.INTEGER ) );
|
|
||||||
registerFunction( "geometrytype", new StandardSQLFunction( "GeometryType", StandardBasicTypes.STRING ) );
|
|
||||||
registerFunction( "srid", new StandardSQLFunction( "ST_SRID", StandardBasicTypes.INTEGER ) );
|
|
||||||
registerFunction( "envelope", new StandardSQLFunction( "ST_Envelope" ) );
|
|
||||||
registerFunction( "astext", new StandardSQLFunction( "ST_AsText", StandardBasicTypes.STRING ) );
|
|
||||||
registerFunction( "asbinary", new StandardSQLFunction( "ST_AsEWKB", StandardBasicTypes.BINARY ) );
|
|
||||||
registerFunction( "isempty", new StandardSQLFunction( "ST_IsEmpty", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "issimple", new StandardSQLFunction( "ST_IsSimple", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "boundary", new StandardSQLFunction( "ST_Boundary" ) );
|
|
||||||
|
|
||||||
// Register functions for spatial relation constructs
|
|
||||||
registerFunction( "overlaps", new StandardSQLFunction( "ST_Overlaps", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "intersects", new StandardSQLFunction( "ST_Intersects", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "equals", new StandardSQLFunction( "ST_Equals", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "contains", new StandardSQLFunction( "ST_Contains", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "crosses", new StandardSQLFunction( "ST_Crosses", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "disjoint", new StandardSQLFunction( "ST_Disjoint", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "touches", new StandardSQLFunction( "ST_Touches", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "within", new StandardSQLFunction( "ST_Within", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
registerFunction( "relate", new StandardSQLFunction( "ST_Relate", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
// register the spatial analysis functions
|
|
||||||
registerFunction( "distance", new StandardSQLFunction( "ST_Distance", StandardBasicTypes.DOUBLE ) );
|
|
||||||
registerFunction( "buffer", new StandardSQLFunction( "ST_Buffer" ) );
|
|
||||||
registerFunction( "convexhull", new StandardSQLFunction( "ST_ConvexHull" ) );
|
|
||||||
registerFunction( "difference", new StandardSQLFunction( "ST_Difference" ) );
|
|
||||||
registerFunction( "intersection", new StandardSQLFunction( "ST_Intersection" ) );
|
|
||||||
registerFunction( "symdifference", new StandardSQLFunction( "ST_SymDifference" ) );
|
|
||||||
registerFunction( "geomunion", new StandardSQLFunction( "ST_Union" ) );
|
|
||||||
|
|
||||||
registerFunction( "dwithin", new StandardSQLFunction( "ST_DWithin", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
|
|
||||||
// Register Spatial Filter function
|
|
||||||
registerFunction( SpatialFunction.filter.name(), new FilterFunction() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
typeContributions.contributeType( new GeolatteGeometryType( GeoDBGeometryTypeDescriptor.INSTANCE ) );
|
|
||||||
typeContributions.contributeType( new JTSGeometryType( GeoDBGeometryTypeDescriptor.INSTANCE ) );
|
|
||||||
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( GeolatteGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( JTSGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
switch ( aggregation ) {
|
|
||||||
// NOT YET AVAILABLE IN GEODB
|
|
||||||
// case SpatialAggregate.EXTENT:
|
|
||||||
// StringBuilder stbuf = new StringBuilder();
|
|
||||||
// stbuf.append("extent(").append(columnName).append(")");
|
|
||||||
// return stbuf.toString();
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Aggregations of type " + aggregation + " are not supported by " +
|
|
||||||
"this dialect"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return "ST_DWithin(" + columnName + ",?,?)";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return "( ST_srid(" + columnName + ") = ?)";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
final String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
|
||||||
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return "(" + columnName + " && ? ) ";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
switch ( spatialRelation ) {
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return " ST_Within(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return " ST_Contains(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return " ST_Crosses(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return " ST_Overlaps(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return " ST_Disjoint(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return " ST_Intersects(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return " ST_Touches(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return " ST_Equals(" + columnName + ", ?)";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException( "Spatial relation is not known by this dialect" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return function != SpatialFunction.difference && ( getFunctions().get( function.toString() ) != null );
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class FilterFunction extends StandardSQLFunction {
|
|
||||||
|
|
||||||
public FilterFunction() {
|
|
||||||
super( "&&" );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String render(
|
|
||||||
Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
|
||||||
int argumentCount = arguments.size();
|
|
||||||
if ( argumentCount != 2 ) {
|
|
||||||
throw new QueryException( String.format( Locale.ENGLISH,"2 arguments expected, received %d", argumentCount ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return Stream.of(
|
|
||||||
String.valueOf( arguments.get( 0 ) ),
|
|
||||||
getRenderedName( arguments ),
|
|
||||||
String.valueOf( arguments.get( 1 ) )
|
|
||||||
).collect( Collectors.joining( " ", "(", ")" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ import org.geolatte.geom.Geometry;
|
||||||
*
|
*
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
*/
|
*/
|
||||||
public class GeoDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class GeoDBGeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An instance of this Descriptor
|
* An instance of this Descriptor
|
||||||
|
@ -36,7 +36,7 @@ public class GeoDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
public static final GeoDBGeometryTypeDescriptor INSTANCE = new GeoDBGeometryTypeDescriptor();
|
public static final GeoDBGeometryTypeDescriptor INSTANCE = new GeoDBGeometryTypeDescriptor();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.ARRAY;
|
return Types.ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,14 +51,14 @@ public class GeoDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
st.setBytes( index, GeoDbWkb.to( geometry ) );
|
st.setBytes( index, GeoDbWkb.to( geometry ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
st.setBytes( name, GeoDbWkb.to( geometry ) );
|
st.setBytes( name, GeoDbWkb.to( geometry ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -70,18 +70,18 @@ public class GeoDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( GeoDbWkb.from( rs.getObject( paramIndex ) ), options );
|
return getJavaTypeDescriptor().wrap( GeoDbWkb.from( rs.getObject( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( GeoDbWkb.from( statement.getObject( index ) ), options );
|
return getJavaTypeDescriptor().wrap( GeoDbWkb.from( statement.getObject( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( GeoDbWkb.from( statement.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( GeoDbWkb.from( statement.getObject( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,11 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
|
|
||||||
public class HANAGeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class HANAGeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
public static final HANAGeometryTypeDescriptor CRS_LOADING_INSTANCE = new HANAGeometryTypeDescriptor( true );
|
public static final HANAGeometryTypeDescriptor CRS_LOADING_INSTANCE = new HANAGeometryTypeDescriptor( true );
|
||||||
public static final HANAGeometryTypeDescriptor INSTANCE = new HANAGeometryTypeDescriptor( false );
|
public static final HANAGeometryTypeDescriptor INSTANCE = new HANAGeometryTypeDescriptor( false );
|
||||||
|
@ -34,7 +34,7 @@ public class HANAGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.OTHER;
|
return Types.OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,14 +50,14 @@ public class HANAGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Geometry<?> geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry<?> geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
st.setObject( index, HANASpatialUtils.toEWKB( geometry ) );
|
st.setObject( index, HANASpatialUtils.toEWKB( geometry ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Geometry<?> geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry<?> geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
st.setObject( name, HANASpatialUtils.toEWKB( geometry ) );
|
st.setObject( name, HANASpatialUtils.toEWKB( geometry ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,22 +71,23 @@ public class HANAGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
if ( HANAGeometryTypeDescriptor.this.determineCrsIdFromDatabase ) {
|
if ( HANAGeometryTypeDescriptor.this.determineCrsIdFromDatabase ) {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( rs, paramIndex ), options );
|
throw new UnsupportedOperationException( "First need to refactor HANASpatialUtils" );
|
||||||
|
//return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( rs, paramIndex ), options );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( rs.getObject( paramIndex ) ), options );
|
return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( rs.getObject( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( index ) ), options );
|
return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,11 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Point;
|
import org.geolatte.geom.Point;
|
||||||
|
|
||||||
public class HANAPointTypeDescriptor implements SqlTypeDescriptor {
|
public class HANAPointTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An instance of the descrtiptor
|
* An instance of the descrtiptor
|
||||||
|
@ -31,7 +31,7 @@ public class HANAPointTypeDescriptor implements SqlTypeDescriptor {
|
||||||
private static final long serialVersionUID = -6978798264716544804L;
|
private static final long serialVersionUID = -6978798264716544804L;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.STRUCT;
|
return Types.STRUCT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,14 +47,14 @@ public class HANAPointTypeDescriptor implements SqlTypeDescriptor {
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Point<?> geometry = getJavaDescriptor().unwrap( value, Point.class, options );
|
final Point<?> geometry = getJavaTypeDescriptor().unwrap( value, Point.class, options );
|
||||||
st.setObject( index, HANASpatialUtils.toEWKB( geometry ) );
|
st.setObject( index, HANASpatialUtils.toEWKB( geometry ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Point<?> geometry = getJavaDescriptor().unwrap( value, Point.class, options );
|
final Point<?> geometry = getJavaTypeDescriptor().unwrap( value, Point.class, options );
|
||||||
st.setObject( name, HANASpatialUtils.toEWKB( geometry ) );
|
st.setObject( name, HANASpatialUtils.toEWKB( geometry ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,18 +67,18 @@ public class HANAPointTypeDescriptor implements SqlTypeDescriptor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( rs.getObject( paramIndex ) ), options );
|
return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( rs.getObject( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( index ) ), options );
|
return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( HANASpatialUtils.toGeometry( statement.getObject( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
package org.hibernate.spatial.dialect.hana;
|
package org.hibernate.spatial.dialect.hana;
|
||||||
|
|
||||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
|
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
public class HANASpatialAggregate extends StandardSQLFunction {
|
public class HANASpatialAggregate extends StandardSQLFunction {
|
||||||
|
@ -15,7 +16,7 @@ public class HANASpatialAggregate extends StandardSQLFunction {
|
||||||
super( name );
|
super( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
public HANASpatialAggregate(String name, Type registeredType) {
|
public HANASpatialAggregate(String name, AllowableFunctionReturnType registeredType) {
|
||||||
super( name, registeredType );
|
super( name, registeredType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,404 +27,4 @@ import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
public class HANASpatialDialect extends HANAColumnStoreDialect implements SpatialDialect {
|
public class HANASpatialDialect extends HANAColumnStoreDialect implements SpatialDialect {
|
||||||
|
|
||||||
private static final long serialVersionUID = -432631517465714911L;
|
|
||||||
|
|
||||||
private static final String DETERMINE_CRS_ID_FROM_DATABASE_PARAMETER_NAME = "hibernate.spatial.dialect.hana.determine_crs_id_from_database";
|
|
||||||
|
|
||||||
public HANASpatialDialect() {
|
|
||||||
registerColumnType( HANAGeometryTypeDescriptor.INSTANCE.getSqlType(), "ST_GEOMETRY" );
|
|
||||||
registerColumnType( HANAPointTypeDescriptor.INSTANCE.getSqlType(), "ST_POINT" );
|
|
||||||
|
|
||||||
registerHibernateType( Types.OTHER, new GeolatteGeometryType( HANAGeometryTypeDescriptor.INSTANCE ).getName() );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hibernate Spatial functions
|
|
||||||
*/
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.asbinary.name(),
|
|
||||||
new HANASpatialFunction( "ST_AsBinary", StandardBasicTypes.MATERIALIZED_BLOB, false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.astext.name(),
|
|
||||||
new HANASpatialFunction( "ST_AsText", StandardBasicTypes.MATERIALIZED_CLOB, false ) );
|
|
||||||
registerFunction( SpatialFunction.boundary.name(), new HANASpatialFunction( "ST_Boundary", false ) );
|
|
||||||
registerFunction( SpatialFunction.buffer.name(), new HANASpatialFunction( "ST_Buffer", false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.contains.name(),
|
|
||||||
new HANASpatialFunction( "ST_Contains", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction( SpatialFunction.convexhull.name(), new HANASpatialFunction( "ST_ConvexHull", false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.crosses.name(),
|
|
||||||
new HANASpatialFunction( "ST_Crosses", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction( SpatialFunction.difference.name(), new HANASpatialFunction( "ST_Difference", true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.dimension.name(),
|
|
||||||
new HANASpatialFunction( "ST_Dimension", StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.disjoint.name(),
|
|
||||||
new HANASpatialFunction( "ST_Disjoint", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.distance.name(),
|
|
||||||
new HANASpatialFunction( "ST_Distance", StandardBasicTypes.DOUBLE, true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.dwithin.name(),
|
|
||||||
new HANASpatialFunction( "ST_WithinDistance", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction( SpatialFunction.envelope.name(), new HANASpatialFunction( "ST_Envelope", true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.equals.name(),
|
|
||||||
new HANASpatialFunction( "ST_Equals", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction( SpatialFunction.extent.name(), new HANASpatialAggregate( "ST_EnvelopeAggr" ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.geometrytype.name(),
|
|
||||||
new HANASpatialFunction( "ST_GeometryType", StandardBasicTypes.STRING, false ) );
|
|
||||||
registerFunction( SpatialFunction.geomunion.name(), new HANASpatialFunction( "ST_Union", true ) );
|
|
||||||
registerFunction( SpatialFunction.intersection.name(), new HANASpatialFunction( "ST_Intersection", true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.intersects.name(),
|
|
||||||
new HANASpatialFunction( "ST_Intersects", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.isempty.name(),
|
|
||||||
new HANASpatialFunction( "ST_IsEmpty", StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.issimple.name(),
|
|
||||||
new HANASpatialFunction( "ST_IsSimple", StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.overlaps.name(),
|
|
||||||
new HANASpatialFunction( "ST_Overlaps", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.relate.name(),
|
|
||||||
new HANASpatialFunction( "ST_Relate", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.srid.name(),
|
|
||||||
new HANASpatialFunction( "ST_SRID", StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction( SpatialFunction.symdifference.name(), new HANASpatialFunction( "ST_SymDifference", true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.touches.name(),
|
|
||||||
new HANASpatialFunction( "ST_Touches", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction( SpatialFunction.transform.name(), new HANASpatialFunction( "ST_Transform", false ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.within.name(),
|
|
||||||
new HANASpatialFunction( "ST_Within", StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
SpatialFunction.filter.name(),
|
|
||||||
new FilterFunction() );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Additional HANA functions
|
|
||||||
*/
|
|
||||||
registerFunction( HANASpatialFunctions.alphashape.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.alphashape.getFunctionName(), false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.area.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.area.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.asewkb.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.asewkb.getFunctionName(), StandardBasicTypes.MATERIALIZED_BLOB, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.asewkt.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.asewkt.getFunctionName(), StandardBasicTypes.MATERIALIZED_CLOB, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.asgeojson.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.asgeojson.getFunctionName(), StandardBasicTypes.MATERIALIZED_CLOB, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.assvg.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.assvg.getFunctionName(), StandardBasicTypes.MATERIALIZED_CLOB, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.assvgaggr.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.assvgaggr.getFunctionName(), StandardBasicTypes.MATERIALIZED_CLOB, false, true ) );
|
|
||||||
registerFunction( HANASpatialFunctions.aswkb.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.aswkb.getFunctionName(), StandardBasicTypes.MATERIALIZED_BLOB, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.aswkt.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.aswkt.getFunctionName(), StandardBasicTypes.MATERIALIZED_CLOB, false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.centroid.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.centroid.getFunctionName(), false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.convexhullaggr.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.convexhullaggr.getFunctionName(), true, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.coorddim.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.coorddim.getFunctionName(), StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.coveredby.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.coveredby.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.covers.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.covers.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.endpoint.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.endpoint.getFunctionName(), false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.envelopeaggr.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.envelopeaggr.getFunctionName(), true, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.exteriorring.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.exteriorring.getFunctionName(), false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.geomfromewkb.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.geomfromewkb.getFunctionName(), false, true ) );
|
|
||||||
registerFunction( HANASpatialFunctions.geomfromewkt.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.geomfromewkt.getFunctionName(), false, true ) );
|
|
||||||
registerFunction( HANASpatialFunctions.geomfromtext.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.geomfromtext.getFunctionName(), false, true ) );
|
|
||||||
registerFunction( HANASpatialFunctions.geomfromwkb.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.geomfromwkb.getFunctionName(), false, true ) );
|
|
||||||
registerFunction( HANASpatialFunctions.geomfromwkt.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.geomfromwkt.getFunctionName(), false, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.geometryn.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.geometryn.getFunctionName(), false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.interiorringn.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.interiorringn.getFunctionName(), false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.intersectionaggr.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.intersectionaggr.getFunctionName(), true, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.intersectsrect.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.intersectsrect.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN,
|
|
||||||
new boolean[]{ true, true } ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.is3d.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.is3d.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.isclosed.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.isclosed.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.ismeasured.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.ismeasured.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.isring.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.isring.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.isvalid.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.isvalid.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.length.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.length.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.m.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.m.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.mmax.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.mmax.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.mmin.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.mmin.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.numgeometries.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.numgeometries.getFunctionName(), StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.numinteriorring.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.numinteriorring.getFunctionName(), StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.numinteriorrings.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.numinteriorrings.getFunctionName(), StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.numpoints.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.numpoints.getFunctionName(), StandardBasicTypes.INTEGER, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.orderingequals.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.orderingequals.getFunctionName(), StandardBasicTypes.NUMERIC_BOOLEAN, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.perimeter.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.perimeter.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.pointonsurface.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.pointonsurface.getFunctionName(), false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.pointn.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.pointn.getFunctionName(), false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.snaptogrid.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.snaptogrid.getFunctionName(), false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.startpoint.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.startpoint.getFunctionName(), false ) );
|
|
||||||
registerFunction( HANASpatialFunctions.unionaggr.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.unionaggr.getFunctionName(), true, true ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.x.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.x.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.xmax.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.xmax.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.xmin.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.xmin.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.y.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.y.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.ymax.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.ymax.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.ymin.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.ymin.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.z.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.z.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.zmax.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.zmax.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
registerFunction(
|
|
||||||
HANASpatialFunctions.zmin.name(),
|
|
||||||
new HANASpatialFunction( HANASpatialFunctions.zmin.getFunctionName(), StandardBasicTypes.DOUBLE, false ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
switch ( spatialRelation ) {
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return columnName + ".ST_Within(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return columnName + ".ST_Contains(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return columnName + ".ST_Crosses(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return columnName + ".ST_Overlaps(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return columnName + ".ST_Disjoint(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return columnName + ".ST_Intersects(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return columnName + ".ST_Touches(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return columnName + ".ST_Equals(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
case SpatialRelation.FILTER:
|
|
||||||
return columnName + ".ST_IntersectsFilter(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException( "Spatial relation is not known by this dialect" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
|
|
||||||
final ConfigurationService configurationService = serviceRegistry.getService( ConfigurationService.class );
|
|
||||||
boolean determineCrsIdFromDatabase = configurationService.getSetting(
|
|
||||||
DETERMINE_CRS_ID_FROM_DATABASE_PARAMETER_NAME,
|
|
||||||
new Converter<Boolean>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Boolean convert(Object value) {
|
|
||||||
return Boolean.valueOf( value.toString() );
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
Boolean.FALSE ).booleanValue();
|
|
||||||
|
|
||||||
if ( determineCrsIdFromDatabase ) {
|
|
||||||
typeContributions.contributeType( new GeolatteGeometryType( HANAGeometryTypeDescriptor.CRS_LOADING_INSTANCE ) );
|
|
||||||
typeContributions.contributeType( new JTSGeometryType( HANAGeometryTypeDescriptor.CRS_LOADING_INSTANCE ) );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
typeContributions.contributeType( new GeolatteGeometryType( HANAGeometryTypeDescriptor.INSTANCE ) );
|
|
||||||
typeContributions.contributeType( new JTSGeometryType( HANAGeometryTypeDescriptor.INSTANCE ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( GeolatteGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( JTSGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return columnName + ".ST_IntersectsFilter(ST_GeomFromEWKB(?)) = 1";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
switch ( aggregation ) {
|
|
||||||
case SpatialAggregate.EXTENT:
|
|
||||||
return "ST_EnvelopeAggr(" + columnName + ")";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException( "The aggregate type [" + aggregation + "] is not known by this dialect" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return columnName + ".ST_WithinDistance(ST_GeomFromEWKB(?), ?) = 1";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return columnName + ".ST_SRID() = ?";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return columnName + ".ST_IsEmpty() = " + ( isEmpty ? 1 : 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
switch ( function ) {
|
|
||||||
case asbinary:
|
|
||||||
return true;
|
|
||||||
case astext:
|
|
||||||
return true;
|
|
||||||
case boundary:
|
|
||||||
return true;
|
|
||||||
case buffer:
|
|
||||||
return true;
|
|
||||||
case contains:
|
|
||||||
return true;
|
|
||||||
case convexhull:
|
|
||||||
return true;
|
|
||||||
case crosses:
|
|
||||||
return true;
|
|
||||||
case difference:
|
|
||||||
return true;
|
|
||||||
case dimension:
|
|
||||||
return true;
|
|
||||||
case disjoint:
|
|
||||||
return true;
|
|
||||||
case distance:
|
|
||||||
return true;
|
|
||||||
case dwithin:
|
|
||||||
return true;
|
|
||||||
case envelope:
|
|
||||||
return true;
|
|
||||||
case equals:
|
|
||||||
return true;
|
|
||||||
case extent:
|
|
||||||
return true;
|
|
||||||
case geometrytype:
|
|
||||||
return true;
|
|
||||||
case geomunion:
|
|
||||||
return true;
|
|
||||||
case intersection:
|
|
||||||
return true;
|
|
||||||
case intersects:
|
|
||||||
return true;
|
|
||||||
case isempty:
|
|
||||||
return true;
|
|
||||||
case issimple:
|
|
||||||
return true;
|
|
||||||
case overlaps:
|
|
||||||
return true;
|
|
||||||
case relate:
|
|
||||||
return true;
|
|
||||||
case srid:
|
|
||||||
return true;
|
|
||||||
case symdifference:
|
|
||||||
return true;
|
|
||||||
case touches:
|
|
||||||
return true;
|
|
||||||
case transform:
|
|
||||||
return true;
|
|
||||||
case within:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class FilterFunction extends HANASpatialFunction {
|
|
||||||
|
|
||||||
public FilterFunction() {
|
|
||||||
super( "ST_IntersectsFilter", StandardBasicTypes.NUMERIC_BOOLEAN, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String render(
|
|
||||||
Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
|
||||||
return super.render( firstArgumentType, arguments, sessionFactory ) + " = 1";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
public class HANASpatialFunction extends StandardSQLFunction {
|
public class HANASpatialFunction extends StandardSQLFunction {
|
||||||
|
@ -32,13 +33,13 @@ public class HANASpatialFunction extends StandardSQLFunction {
|
||||||
this.staticFunction = staticFunction;
|
this.staticFunction = staticFunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HANASpatialFunction(String name, Type registeredType, boolean firstArgumentIsGeometryType) {
|
public HANASpatialFunction(String name, AllowableFunctionReturnType registeredType, boolean firstArgumentIsGeometryType) {
|
||||||
super( name, registeredType );
|
super( name, registeredType );
|
||||||
this.argumentIsGeometryTypeMask.set( 1, firstArgumentIsGeometryType );
|
this.argumentIsGeometryTypeMask.set( 1, firstArgumentIsGeometryType );
|
||||||
this.staticFunction = false;
|
this.staticFunction = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HANASpatialFunction(String name, Type registeredType, boolean[] argumentIsGeometryTypeMask) {
|
public HANASpatialFunction(String name, AllowableFunctionReturnType registeredType, boolean[] argumentIsGeometryTypeMask) {
|
||||||
super( name, registeredType );
|
super( name, registeredType );
|
||||||
for ( int i = 0; i < argumentIsGeometryTypeMask.length; i++ ) {
|
for ( int i = 0; i < argumentIsGeometryTypeMask.length; i++ ) {
|
||||||
this.argumentIsGeometryTypeMask.set( i + 1, argumentIsGeometryTypeMask[i] );
|
this.argumentIsGeometryTypeMask.set( i + 1, argumentIsGeometryTypeMask[i] );
|
||||||
|
@ -46,13 +47,13 @@ public class HANASpatialFunction extends StandardSQLFunction {
|
||||||
this.staticFunction = false;
|
this.staticFunction = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HANASpatialFunction(String name, Type registeredType, boolean firstArgumentIsGeometryType, boolean staticFunction) {
|
public HANASpatialFunction(String name, AllowableFunctionReturnType registeredType, boolean firstArgumentIsGeometryType, boolean staticFunction) {
|
||||||
super( name, registeredType );
|
super( name, registeredType );
|
||||||
this.argumentIsGeometryTypeMask.set( staticFunction ? 0 : 1, firstArgumentIsGeometryType );
|
this.argumentIsGeometryTypeMask.set( staticFunction ? 0 : 1, firstArgumentIsGeometryType );
|
||||||
this.staticFunction = staticFunction;
|
this.staticFunction = staticFunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
||||||
if ( arguments.size() == 0 ) {
|
if ( arguments.size() == 0 ) {
|
||||||
return getName() + "()";
|
return getName() + "()";
|
||||||
|
|
|
@ -7,36 +7,9 @@
|
||||||
|
|
||||||
package org.hibernate.spatial.dialect.mariadb;
|
package org.hibernate.spatial.dialect.mariadb;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.MariaDB103Dialect;
|
import org.hibernate.dialect.MariaDB103Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
|
||||||
|
|
||||||
public class MariaDB103SpatialDialect extends MariaDB103Dialect implements MariaDBSpatialDialectTrait {
|
public class MariaDB103SpatialDialect extends MariaDB103Dialect implements SpatialDialect {
|
||||||
|
|
||||||
final private SpatialFunctionsRegistry spatialFunctions = new MariaDB103SpatialFunctions();
|
|
||||||
|
|
||||||
public MariaDB103SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
MariaDBGeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : spatialFunctions ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
delegateContributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SpatialFunctionsRegistry spatialFunctions() {
|
|
||||||
return spatialFunctions;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,9 @@ import org.hibernate.type.descriptor.ValueBinder;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
import org.hibernate.type.descriptor.ValueExtractor;
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.sql.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.sql.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.ByteBuffer;
|
import org.geolatte.geom.ByteBuffer;
|
||||||
import org.geolatte.geom.ByteOrder;
|
import org.geolatte.geom.ByteOrder;
|
||||||
|
@ -28,14 +28,14 @@ import org.geolatte.geom.codec.Wkb;
|
||||||
import org.geolatte.geom.codec.WkbDecoder;
|
import org.geolatte.geom.codec.WkbDecoder;
|
||||||
import org.geolatte.geom.codec.WkbEncoder;
|
import org.geolatte.geom.codec.WkbEncoder;
|
||||||
|
|
||||||
public class MariaDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class MariaDBGeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
public static final MariaDBGeometryTypeDescriptor INSTANCE = new MariaDBGeometryTypeDescriptor();
|
public static final MariaDBGeometryTypeDescriptor INSTANCE = new MariaDBGeometryTypeDescriptor();
|
||||||
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.MYSQL_WKB );
|
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.MYSQL_WKB );
|
||||||
final WkbDecoder decoder = Wkb.newDecoder( Wkb.Dialect.MYSQL_WKB );
|
final WkbDecoder decoder = Wkb.newDecoder( Wkb.Dialect.MYSQL_WKB );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.ARRAY;
|
return Types.ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public class MariaDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] valueToByteArray(X value, WrapperOptions options) {
|
private byte[] valueToByteArray(X value, WrapperOptions options) {
|
||||||
final Geometry<?> geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry<?> geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final ByteBuffer buffer = encoder.encode( geometry, ByteOrder.NDR );
|
final ByteBuffer buffer = encoder.encode( geometry, ByteOrder.NDR );
|
||||||
return buffer == null ? null : buffer.toByteArray();
|
return buffer == null ? null : buffer.toByteArray();
|
||||||
}
|
}
|
||||||
|
@ -74,20 +74,21 @@ public class MariaDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
public <X> ValueExtractor<X> getExtractor(JavaTypeDescriptor<X> javaTypeDescriptor) {
|
public <X> ValueExtractor<X> getExtractor(JavaTypeDescriptor<X> javaTypeDescriptor) {
|
||||||
return new BasicExtractor<X>( javaTypeDescriptor, this ) {
|
return new BasicExtractor<X>( javaTypeDescriptor, this ) {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( rs.getBytes( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( rs.getBytes( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getBytes( index ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getBytes( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getBytes( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getBytes( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ public interface MariaDBSpatialDialectTrait extends SpatialDialect {
|
||||||
|
|
||||||
SpatialFunctionsRegistry spatialFunctions();
|
SpatialFunctionsRegistry spatialFunctions();
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
default String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
||||||
switch ( spatialRelation ) {
|
switch ( spatialRelation ) {
|
||||||
case SpatialRelation.WITHIN:
|
case SpatialRelation.WITHIN:
|
||||||
|
@ -61,39 +61,37 @@ public interface MariaDBSpatialDialectTrait extends SpatialDialect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getSpatialFilterExpression(String columnName) {
|
default String getSpatialFilterExpression(String columnName) {
|
||||||
return String.format( Locale.ENGLISH, "MBRIntersects(%s,?)", columnName
|
return String.format( Locale.ENGLISH, "MBRIntersects(%s,?)", columnName
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getSpatialAggregateSQL(String columnName, int aggregation) {
|
default String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||||
throw new UnsupportedOperationException( "MariaDB has no spatial aggregate functions." );
|
throw new UnsupportedOperationException( "MariaDB has no spatial aggregate functions." );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getDWithinSQL(String columnName) {
|
default String getDWithinSQL(String columnName) {
|
||||||
throw new UnsupportedOperationException( "MariaDB doesn't support the DWithin function." );
|
throw new UnsupportedOperationException( "MariaDB doesn't support the DWithin function." );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getHavingSridSQL(String columnName) {
|
default String getHavingSridSQL(String columnName) {
|
||||||
return " (ST_SRID(" + columnName + ") = ?) ";
|
return " (ST_SRID(" + columnName + ") = ?) ";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getIsEmptySQL(String columnName, boolean isEmpty) {
|
default String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||||
final String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
final String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
||||||
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default boolean supportsFiltering() {
|
default boolean supportsFiltering() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default boolean supports(SpatialFunction function) {
|
default boolean supports(SpatialFunction function) {
|
||||||
return spatialFunctions().get( function.toString() ) != null;
|
return spatialFunctions().get( function.toString() ) != null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,19 +11,8 @@ package org.hibernate.spatial.dialect.mysql;
|
||||||
* creation-date: 10/9/13
|
* creation-date: 10/9/13
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.MySQL55Dialect;
|
import org.hibernate.dialect.MySQL55Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the MySQL5Dialect by including support for the spatial operators.
|
* Extends the MySQL5Dialect by including support for the spatial operators.
|
||||||
|
@ -36,117 +25,4 @@ import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
||||||
*/
|
*/
|
||||||
public class MySQL56SpatialDialect extends MySQL55Dialect implements SpatialDialect {
|
public class MySQL56SpatialDialect extends MySQL55Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
private MySQLSpatialDialect dialectDelegate = new MySQLSpatialDialect();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the dialect
|
|
||||||
*/
|
|
||||||
public MySQL56SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
MySQLGeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
final MySQL5SpatialFunctions functionsToRegister = overrideObjectShapeFunctions( new MySQL5SpatialFunctions() );
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : functionsToRegister ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private MySQL5SpatialFunctions overrideObjectShapeFunctions(MySQL5SpatialFunctions mysqlFunctions) {
|
|
||||||
mysqlFunctions.put( "contains", new StandardSQLFunction( "ST_Contains", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "crosses", new StandardSQLFunction( "ST_Crosses", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "disjoint", new StandardSQLFunction( "ST_Disjoint", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "equals", new StandardSQLFunction( "ST_Equals", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "intersects", new StandardSQLFunction( "ST_Intersects", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "overlaps", new StandardSQLFunction( "ST_Overlaps", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "touches", new StandardSQLFunction( "ST_Touches", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
mysqlFunctions.put( "within", new StandardSQLFunction( "ST_Within", StandardBasicTypes.BOOLEAN ) );
|
|
||||||
return mysqlFunctions;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
|
|
||||||
return dialectDelegate.remapSqlTypeDescriptor( sqlTypeDescriptor );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName(int code, long length, int precision, int scale) throws HibernateException {
|
|
||||||
return dialectDelegate.getTypeName( code, length, precision, scale );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allows the Dialect to contribute additional types
|
|
||||||
*
|
|
||||||
* @param typeContributions Callback to contribute the types
|
|
||||||
* @param serviceRegistry The service registry
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(
|
|
||||||
TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
dialectDelegate.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
switch ( spatialRelation ) {
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return " ST_Within(" + columnName + ",?)";
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return " ST_Contains(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return " ST_Crosses(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return " ST_Overlaps(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return " ST_Disjoint(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return " ST_Intersects(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return " ST_Touches(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return " ST_Equals(" + columnName + ", ?)";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Spatial relation is not known by this dialect"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return dialectDelegate.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return dialectDelegate.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return dialectDelegate.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return dialectDelegate.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return dialectDelegate.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return dialectDelegate.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return dialectDelegate.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,4 @@ import org.hibernate.dialect.MySQLStorageEngine;
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class MySQL5InnoDBSpatialDialect extends MySQL5SpatialDialect {
|
public class MySQL5InnoDBSpatialDialect extends MySQL5SpatialDialect {
|
||||||
|
|
||||||
@Override
|
|
||||||
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
|
|
||||||
return InnoDBStorageEngine.INSTANCE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,18 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.mysql;
|
package org.hibernate.spatial.dialect.mysql;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.InnoDBStorageEngine;
|
|
||||||
import org.hibernate.dialect.MySQL5Dialect;
|
import org.hibernate.dialect.MySQL5Dialect;
|
||||||
import org.hibernate.dialect.MySQLStorageEngine;
|
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Dialect for MySQL 5 using InnoDB engine, with support for its spatial features
|
* A Dialect for MySQL 5 using InnoDB engine, with support for its spatial features
|
||||||
|
@ -25,80 +15,4 @@ import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
*/
|
*/
|
||||||
public class MySQL5SpatialDialect extends MySQL5Dialect implements SpatialDialect {
|
public class MySQL5SpatialDialect extends MySQL5Dialect implements SpatialDialect {
|
||||||
|
|
||||||
private MySQLSpatialDialect dialectDelegate = new MySQLSpatialDialect();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance
|
|
||||||
*/
|
|
||||||
public MySQL5SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
MySQLGeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : new MySQL5SpatialFunctions() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
dialectDelegate.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName(int code, long length, int precision, int scale) throws HibernateException {
|
|
||||||
return dialectDelegate.getTypeName( code, length, precision, scale );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
|
|
||||||
return dialectDelegate.remapSqlTypeDescriptor( sqlTypeDescriptor );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return dialectDelegate.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return dialectDelegate.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return dialectDelegate.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return dialectDelegate.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return dialectDelegate.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return dialectDelegate.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return dialectDelegate.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return dialectDelegate.supports( function );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
|
|
||||||
return InnoDBStorageEngine.INSTANCE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,119 +6,11 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.mysql;
|
package org.hibernate.spatial.dialect.mysql;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.MySQL8Dialect;
|
import org.hibernate.dialect.MySQL8Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
|
|
||||||
import org.hibernate.spatial.GeolatteGeometryType;
|
|
||||||
import org.hibernate.spatial.JTSGeometryJavaTypeDescriptor;
|
|
||||||
import org.hibernate.spatial.JTSGeometryType;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Karel Maesen, Geovise BVBA on 2019-03-07.
|
* Created by Karel Maesen, Geovise BVBA on 2019-03-07.
|
||||||
*/
|
*/
|
||||||
public class MySQL8SpatialDialect extends MySQL8Dialect implements SpatialDialect {
|
public class MySQL8SpatialDialect extends MySQL8Dialect implements SpatialDialect {
|
||||||
|
|
||||||
private MySQLSpatialDialect dialectDelegate = new MySQLSpatialDialect();
|
|
||||||
private MySQL8SpatialFunctions spatialFunctions = new MySQL8SpatialFunctions();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance
|
|
||||||
*/
|
|
||||||
public MySQL8SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
MySQLGeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : spatialFunctions ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
dialectDelegate.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
switch ( spatialRelation ) {
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return " ST_within(" + columnName + ",?)";
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return " ST_contains(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return " ST_crosses(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return " ST_overlaps(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return " ST_disjoint(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return " ST_intersects(" + columnName
|
|
||||||
+ ", ?)";
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return " ST_touches(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return " ST_equals(" + columnName + ", ?)";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Spatial relation is not known by this dialect"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName(int code, long length, int precision, int scale) throws HibernateException {
|
|
||||||
return dialectDelegate.getTypeName( code, length, precision, scale );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
|
|
||||||
return dialectDelegate.remapSqlTypeDescriptor( sqlTypeDescriptor );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return dialectDelegate.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return dialectDelegate.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return dialectDelegate.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return " (ST_SRID(" + columnName + ") = ?) ";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
final String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
|
||||||
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return spatialFunctions.get( function.toString() ) != null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.ByteBuffer;
|
import org.geolatte.geom.ByteBuffer;
|
||||||
import org.geolatte.geom.ByteOrder;
|
import org.geolatte.geom.ByteOrder;
|
||||||
|
@ -33,7 +33,7 @@ import org.geolatte.geom.codec.WkbEncoder;
|
||||||
*
|
*
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
*/
|
*/
|
||||||
public class MySQLGeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class MySQLGeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An instance of this Descriptor
|
* An instance of this Descriptor
|
||||||
|
@ -41,7 +41,7 @@ public class MySQLGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
public static final MySQLGeometryTypeDescriptor INSTANCE = new MySQLGeometryTypeDescriptor();
|
public static final MySQLGeometryTypeDescriptor INSTANCE = new MySQLGeometryTypeDescriptor();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.ARRAY;
|
return Types.ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ public class MySQLGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.MYSQL_WKB );
|
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.MYSQL_WKB );
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final ByteBuffer buffer = encoder.encode( geometry, ByteOrder.NDR );
|
final ByteBuffer buffer = encoder.encode( geometry, ByteOrder.NDR );
|
||||||
final byte[] bytes = ( buffer == null ? null : buffer.toByteArray() );
|
final byte[] bytes = ( buffer == null ? null : buffer.toByteArray() );
|
||||||
st.setBytes( index, bytes );
|
st.setBytes( index, bytes );
|
||||||
|
@ -67,7 +67,7 @@ public class MySQLGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.MYSQL_WKB );
|
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.MYSQL_WKB );
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final ByteBuffer buffer = encoder.encode( geometry, ByteOrder.NDR );
|
final ByteBuffer buffer = encoder.encode( geometry, ByteOrder.NDR );
|
||||||
final byte[] bytes = ( buffer == null ? null : buffer.toByteArray() );
|
final byte[] bytes = ( buffer == null ? null : buffer.toByteArray() );
|
||||||
st.setBytes( name, bytes );
|
st.setBytes( name, bytes );
|
||||||
|
@ -81,18 +81,18 @@ public class MySQLGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( rs.getBytes( paramIndex ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( rs.getBytes( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getBytes( index ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getBytes( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getBytes( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getBytes( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,20 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.mysql;
|
package org.hibernate.spatial.dialect.mysql;
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.MySQLDialect;
|
import org.hibernate.dialect.MySQLDialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
|
|
||||||
import org.hibernate.spatial.GeolatteGeometryType;
|
|
||||||
import org.hibernate.spatial.JTSGeometryJavaTypeDescriptor;
|
|
||||||
import org.hibernate.spatial.JTSGeometryType;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Dialect for MySQL with support for its spatial features
|
* A Dialect for MySQL with support for its spatial features
|
||||||
|
@ -28,113 +16,4 @@ import org.hibernate.spatial.SpatialRelation;
|
||||||
*/
|
*/
|
||||||
public class MySQLSpatialDialect extends MySQLDialect implements SpatialDialect {
|
public class MySQLSpatialDialect extends MySQLDialect implements SpatialDialect {
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance
|
|
||||||
*/
|
|
||||||
public MySQLSpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
MySQLGeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : new MySQL5SpatialFunctions() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
typeContributions.contributeType( new GeolatteGeometryType( MySQLGeometryTypeDescriptor.INSTANCE ) );
|
|
||||||
typeContributions.contributeType( new JTSGeometryType( MySQLGeometryTypeDescriptor.INSTANCE ) );
|
|
||||||
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( GeolatteGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
typeContributions.contributeJavaTypeDescriptor( JTSGeometryJavaTypeDescriptor.INSTANCE );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
switch ( spatialRelation ) {
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return " within(" + columnName + ",?)";
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return " contains(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return " crosses(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return " overlaps(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return " disjoint(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return " intersects(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return " touches(" + columnName + ", ?)";
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return " equals(" + columnName + ", ?)";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Spatial relation is not known by this dialect"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return "MBRIntersects(" + columnName + ", ? ) ";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
throw new UnsupportedOperationException( "Mysql has no spatial aggregate SQL functions." );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
throw new UnsupportedOperationException( String.format(
|
|
||||||
Locale.ENGLISH,
|
|
||||||
"Mysql doesn't support the Dwithin function"
|
|
||||||
) );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return " (srid(" + columnName + ") = ?) ";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
final String emptyExpr = " IsEmpty(" + columnName + ") ";
|
|
||||||
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
switch ( function ) {
|
|
||||||
case boundary:
|
|
||||||
case relate:
|
|
||||||
case distance:
|
|
||||||
case buffer:
|
|
||||||
case convexhull:
|
|
||||||
case difference:
|
|
||||||
case symdifference:
|
|
||||||
case intersection:
|
|
||||||
case geomunion:
|
|
||||||
case dwithin:
|
|
||||||
case transform:
|
|
||||||
case extent:
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
* @return SQL fragment {@code SpatialRelateExpression}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
||||||
String sql = getOGCSpatialRelateSQL( columnName, "?", spatialRelation ) + " = 1";
|
String sql = getOGCSpatialRelateSQL( columnName, "?", spatialRelation ) + " = 1";
|
||||||
sql += " and " + columnName + " is not null";
|
sql += " and " + columnName + " is not null";
|
||||||
|
@ -226,7 +226,7 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
public String getSpatialFilterExpression(String columnName) {
|
||||||
final StringBuilder buffer = new StringBuilder( "SDO_FILTER(" );
|
final StringBuilder buffer = new StringBuilder( "SDO_FILTER(" );
|
||||||
buffer.append( columnName );
|
buffer.append( columnName );
|
||||||
|
@ -242,10 +242,10 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for the projection
|
* @return The SQL fragment for the projection
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||||
final StringBuilder aggregateFunction = new StringBuilder();
|
final StringBuilder aggregateFunction = new StringBuilder();
|
||||||
final SpatialAggregate sa = new SpatialAggregate( aggregation );
|
final SpatialAggregateImpl sa = new SpatialAggregateImpl( aggregation );
|
||||||
|
|
||||||
if ( sa.getAggregateSyntax() == null ) {
|
if ( sa.getAggregateSyntax() == null ) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
|
@ -277,7 +277,6 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
public String getDWithinSQL(String columnName) {
|
||||||
return "SDO_WITHIN_DISTANCE (" + columnName + ",?, ?) = 'TRUE' ";
|
return "SDO_WITHIN_DISTANCE (" + columnName + ",?, ?) = 'TRUE' ";
|
||||||
}
|
}
|
||||||
|
@ -289,7 +288,7 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
public String getHavingSridSQL(String columnName) {
|
||||||
return String.format( Locale.ENGLISH, " (MDSYS.ST_GEOMETRY(%s).ST_SRID() = ?)", columnName );
|
return String.format( Locale.ENGLISH, " (MDSYS.ST_GEOMETRY(%s).ST_SRID() = ?)", columnName );
|
||||||
}
|
}
|
||||||
|
@ -303,7 +302,6 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for the isempty function
|
* @return The SQL fragment for the isempty function
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||||
return String.format(
|
return String.format(
|
||||||
Locale.ENGLISH,
|
Locale.ENGLISH,
|
||||||
|
@ -319,7 +317,6 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return True if filtering is supported
|
* @return True if filtering is supported
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
public boolean supportsFiltering() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -331,7 +328,6 @@ class OracleSDOSupport implements SpatialDialect, Serializable, WithCustomJPAFil
|
||||||
*
|
*
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
public boolean supports(SpatialFunction function) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,103 +7,14 @@
|
||||||
package org.hibernate.spatial.dialect.oracle;
|
package org.hibernate.spatial.dialect.oracle;
|
||||||
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.Oracle10gDialect;
|
import org.hibernate.dialect.Oracle10gDialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.HSMessageLogger;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.dialect.WithCustomJPAFilter;
|
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spatial Dialect for Oracle10g databases.
|
* Spatial Dialect for Oracle10g databases.
|
||||||
*
|
*
|
||||||
* @author Karel Maesen
|
* @author Karel Maesen
|
||||||
*/
|
*/
|
||||||
public class OracleSpatial10gDialect extends Oracle10gDialect implements SpatialDialect, WithCustomJPAFilter, Serializable {
|
public class OracleSpatial10gDialect extends Oracle10gDialect implements SpatialDialect {
|
||||||
|
|
||||||
private static final HSMessageLogger log = Logger.getMessageLogger(
|
|
||||||
HSMessageLogger.class,
|
|
||||||
OracleSpatial10gDialect.class.getName()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
transient private OracleSDOSupport sdoSupport = new OracleSDOSupport( true );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the dialect with
|
|
||||||
*/
|
|
||||||
public OracleSpatial10gDialect() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
// register geometry type
|
|
||||||
registerColumnType( Types.STRUCT, "MDSYS.SDO_GEOMETRY" );
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : sdoSupport.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
sdoSupport.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return sdoSupport.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return sdoSupport.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return sdoSupport.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return sdoSupport.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return sdoSupport.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return sdoSupport.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return sdoSupport.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return ( getFunctions().get( function.toString() ) != null );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String filterExpression(String geometryParam, String filterParam) {
|
|
||||||
return sdoSupport.filterExpression( geometryParam, filterParam );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,17 +4,15 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.oracle.criterion;
|
|
||||||
|
|
||||||
|
package org.hibernate.spatial.dialect.oracle;
|
||||||
import org.hibernate.spatial.SpatialAggregate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines types of Oracle Spatial aggregate functions
|
* Defines types of Oracle Spatial aggregate functions
|
||||||
*
|
*
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
*/
|
*/
|
||||||
public interface OracleSpatialAggregate extends SpatialAggregate {
|
public interface OracleSpatialAggregate extends org.hibernate.spatial.SpatialAggregate {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LRS_CONCAT aggregate function
|
* LRS_CONCAT aggregate function
|
||||||
|
@ -40,4 +38,4 @@ public interface OracleSpatialAggregate extends SpatialAggregate {
|
||||||
* CONVEXHULL aggregate function
|
* CONVEXHULL aggregate function
|
||||||
*/
|
*/
|
||||||
public static int CONVEXHULL = 104;
|
public static int CONVEXHULL = 104;
|
||||||
}
|
}
|
|
@ -11,11 +11,11 @@ import java.util.List;
|
||||||
import org.hibernate.QueryException;
|
import org.hibernate.QueryException;
|
||||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
||||||
import org.hibernate.spatial.SpatialAnalysis;
|
import org.hibernate.spatial.SpatialAnalysis;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
import org.hibernate.spatial.SpatialFunction;
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
import org.hibernate.spatial.SpatialRelation;
|
||||||
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
||||||
import org.hibernate.spatial.dialect.oracle.criterion.OracleSpatialAggregate;
|
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ class OracleSpatialFunctions extends SpatialFunctionsRegistry {
|
||||||
private final int analysis;
|
private final int analysis;
|
||||||
private final boolean isOGCStrict;
|
private final boolean isOGCStrict;
|
||||||
|
|
||||||
private SpatialAnalysisFunction(String name, Type returnType, int analysis, boolean isOGCStrict) {
|
private SpatialAnalysisFunction(String name, AllowableFunctionReturnType returnType, int analysis, boolean isOGCStrict) {
|
||||||
super( name, returnType );
|
super( name, returnType );
|
||||||
this.analysis = analysis;
|
this.analysis = analysis;
|
||||||
this.isOGCStrict = isOGCStrict;
|
this.isOGCStrict = isOGCStrict;
|
||||||
|
|
|
@ -6,20 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.oracle;
|
package org.hibernate.spatial.dialect.oracle;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.Oracle10gDialect;
|
import org.hibernate.dialect.Oracle10gDialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.HSMessageLogger;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.dialect.WithCustomJPAFilter;
|
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Spatial Dialect for Oracle 10g/11g that uses the "native" SDO spatial operators.
|
* A Spatial Dialect for Oracle 10g/11g that uses the "native" SDO spatial operators.
|
||||||
|
@ -27,83 +15,5 @@ import org.jboss.logging.Logger;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 11/02/17.
|
* Created by Karel Maesen, Geovise BVBA on 11/02/17.
|
||||||
*/
|
*/
|
||||||
public class OracleSpatialSDO10gDialect extends Oracle10gDialect
|
public class OracleSpatialSDO10gDialect extends Oracle10gDialect
|
||||||
implements SpatialDialect, WithCustomJPAFilter, Serializable {
|
implements SpatialDialect {
|
||||||
|
|
||||||
private static final HSMessageLogger log = Logger.getMessageLogger(
|
|
||||||
HSMessageLogger.class,
|
|
||||||
OracleSpatial10gDialect.class.getName()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
transient private OracleSDOSupport sdoSupport = new OracleSDOSupport( false );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the dialect
|
|
||||||
*/
|
|
||||||
public OracleSpatialSDO10gDialect() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
// register geometry type
|
|
||||||
registerColumnType( Types.STRUCT, "MDSYS.SDO_GEOMETRY" );
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : sdoSupport.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
sdoSupport.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return sdoSupport.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return sdoSupport.getSDOSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return sdoSupport.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return sdoSupport.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return sdoSupport.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return sdoSupport.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return sdoSupport.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return !function.equals( SpatialFunction.crosses ) && ( getFunctions().get( function.toString() ) != null );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String filterExpression(String geometryParam, String filterParam) {
|
|
||||||
return sdoSupport.filterExpression( geometryParam, filterParam );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import java.sql.Types;
|
||||||
import org.hibernate.type.descriptor.ValueBinder;
|
import org.hibernate.type.descriptor.ValueBinder;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
import org.hibernate.type.descriptor.ValueExtractor;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory;
|
import org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory;
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ import org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory;
|
||||||
*
|
*
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
*/
|
*/
|
||||||
public class SDOGeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class SDOGeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
private final OracleJDBCTypeFactory typeFactory;
|
private final OracleJDBCTypeFactory typeFactory;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ public class SDOGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.STRUCT;
|
return Types.STRUCT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ import org.hibernate.HibernateException;
|
||||||
import org.hibernate.type.descriptor.ValueBinder;
|
import org.hibernate.type.descriptor.ValueBinder;
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.codec.db.oracle.Encoders;
|
import org.geolatte.geom.codec.db.oracle.Encoders;
|
||||||
|
@ -37,7 +37,7 @@ class SDOGeometryValueBinder<J> implements ValueBinder<J> {
|
||||||
|
|
||||||
public SDOGeometryValueBinder(
|
public SDOGeometryValueBinder(
|
||||||
JavaTypeDescriptor<J> javaTypeDescriptor,
|
JavaTypeDescriptor<J> javaTypeDescriptor,
|
||||||
SqlTypeDescriptor sqlTypeDescriptor,
|
JdbcTypeDescriptor sqlTypeDescriptor,
|
||||||
OracleJDBCTypeFactory typeFactory) {
|
OracleJDBCTypeFactory typeFactory) {
|
||||||
this.javaTypeDescriptor = javaTypeDescriptor;
|
this.javaTypeDescriptor = javaTypeDescriptor;
|
||||||
this.typeFactory = typeFactory;
|
this.typeFactory = typeFactory;
|
||||||
|
|
|
@ -15,7 +15,7 @@ import java.sql.Struct;
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.codec.db.oracle.Decoders;
|
import org.geolatte.geom.codec.db.oracle.Decoders;
|
||||||
|
@ -38,26 +38,26 @@ public class SDOGeometryValueExtractor<X> extends BasicExtractor<X> {
|
||||||
* @param javaDescriptor the {@code JavaTypeDescriptor} to use
|
* @param javaDescriptor the {@code JavaTypeDescriptor} to use
|
||||||
* @param sqlTypeDescriptor the {@code SqlTypeDescriptor} to use
|
* @param sqlTypeDescriptor the {@code SqlTypeDescriptor} to use
|
||||||
*/
|
*/
|
||||||
public SDOGeometryValueExtractor(JavaTypeDescriptor<X> javaDescriptor, SqlTypeDescriptor sqlTypeDescriptor) {
|
public SDOGeometryValueExtractor(JavaTypeDescriptor<X> javaDescriptor, JdbcTypeDescriptor sqlTypeDescriptor) {
|
||||||
super( javaDescriptor, sqlTypeDescriptor );
|
super( javaDescriptor, sqlTypeDescriptor );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
final Object geomObj = rs.getObject( paramIndex );
|
final Object geomObj = rs.getObject( paramIndex );
|
||||||
return getJavaDescriptor().wrap( convert( geomObj ), options );
|
return getJavaTypeDescriptor().wrap( convert( geomObj ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
final Object geomObj = statement.getObject( index );
|
final Object geomObj = statement.getObject( index );
|
||||||
return getJavaDescriptor().wrap( convert( geomObj ), options );
|
return getJavaTypeDescriptor().wrap( convert( geomObj ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
|
||||||
final Object geomObj = statement.getObject( name );
|
final Object geomObj = statement.getObject( name );
|
||||||
return getJavaDescriptor().wrap( convert( geomObj ), options );
|
return getJavaTypeDescriptor().wrap( convert( geomObj ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -9,7 +9,7 @@ package org.hibernate.spatial.dialect.oracle;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.QueryException;
|
import org.hibernate.QueryException;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
import org.hibernate.engine.spi.Mapping;
|
import org.hibernate.engine.spi.Mapping;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
@ -19,13 +19,14 @@ import org.hibernate.type.Type;
|
||||||
*
|
*
|
||||||
* @author Karel Maesen
|
* @author Karel Maesen
|
||||||
*/
|
*/
|
||||||
class SDOObjectMethod implements SQLFunction {
|
class SDOObjectMethod extends StandardSQLFunction {
|
||||||
|
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
public SDOObjectMethod(String name, Type type) {
|
public SDOObjectMethod(String name, Type type) {
|
||||||
|
super(name);
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,18 +8,26 @@ package org.hibernate.spatial.dialect.oracle;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
import org.hibernate.QueryException;
|
import org.hibernate.QueryException;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
import org.hibernate.cfg.NotYetImplementedException;
|
||||||
import org.hibernate.engine.spi.Mapping;
|
import org.hibernate.engine.spi.Mapping;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
||||||
|
import org.hibernate.query.spi.QueryEngine;
|
||||||
|
import org.hibernate.query.sqm.function.SelfRenderingSqmFunction;
|
||||||
|
import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
|
||||||
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
|
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
import org.hibernate.type.spi.TypeConfiguration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Special function for accessing a member variable of an Oracle Object
|
* Special function for accessing a member variable of an Oracle Object
|
||||||
*
|
*
|
||||||
* @author Karel Maesen
|
* @author Karel Maesen
|
||||||
*/
|
*/
|
||||||
class SDOObjectProperty implements SQLFunction {
|
class SDOObjectProperty implements SqmFunctionDescriptor {
|
||||||
|
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
|
||||||
|
@ -78,4 +86,60 @@ class SDOObjectProperty implements SQLFunction {
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> SelfRenderingSqmFunction<T> generateSqmExpression(
|
||||||
|
List<SqmTypedNode<?>> arguments,
|
||||||
|
AllowableFunctionReturnType<T> impliedResultType,
|
||||||
|
QueryEngine queryEngine,
|
||||||
|
TypeConfiguration typeConfiguration) {
|
||||||
|
throw new NotYetImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> SelfRenderingSqmFunction<T> generateAggregateSqmExpression(
|
||||||
|
List<SqmTypedNode<?>> arguments,
|
||||||
|
SqmPredicate filter,
|
||||||
|
AllowableFunctionReturnType<T> impliedResultType,
|
||||||
|
QueryEngine queryEngine,
|
||||||
|
TypeConfiguration typeConfiguration) {
|
||||||
|
return SqmFunctionDescriptor.super.generateAggregateSqmExpression(
|
||||||
|
arguments,
|
||||||
|
filter,
|
||||||
|
impliedResultType,
|
||||||
|
queryEngine,
|
||||||
|
typeConfiguration
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> SelfRenderingSqmFunction<T> generateSqmExpression(
|
||||||
|
SqmTypedNode<?> argument,
|
||||||
|
AllowableFunctionReturnType<T> impliedResultType,
|
||||||
|
QueryEngine queryEngine,
|
||||||
|
TypeConfiguration typeConfiguration) {
|
||||||
|
return SqmFunctionDescriptor.super.generateSqmExpression(
|
||||||
|
argument,
|
||||||
|
impliedResultType,
|
||||||
|
queryEngine,
|
||||||
|
typeConfiguration
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> SelfRenderingSqmFunction<T> generateSqmExpression(
|
||||||
|
AllowableFunctionReturnType<T> impliedResultType,
|
||||||
|
QueryEngine queryEngine,
|
||||||
|
TypeConfiguration typeConfiguration) {
|
||||||
|
return SqmFunctionDescriptor.super.generateSqmExpression( impliedResultType, queryEngine, typeConfiguration );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean alwaysIncludesParentheses() {
|
||||||
|
return SqmFunctionDescriptor.super.alwaysIncludesParentheses();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSignature(String name) {
|
||||||
|
return SqmFunctionDescriptor.super.getSignature( name );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,22 +7,19 @@
|
||||||
|
|
||||||
package org.hibernate.spatial.dialect.oracle;
|
package org.hibernate.spatial.dialect.oracle;
|
||||||
|
|
||||||
|
|
||||||
import org.hibernate.spatial.dialect.oracle.criterion.OracleSpatialAggregate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides Aggregate type spatial function interpretation
|
* Provides Aggregate type spatial function interpretation
|
||||||
*/
|
*/
|
||||||
class SpatialAggregate {
|
class SpatialAggregateImpl {
|
||||||
|
|
||||||
private static final String SDO_AGGR = "SDO_AGGR_";
|
private static final String SDO_AGGR = "SDO_AGGR_";
|
||||||
private boolean aggregateType;
|
private boolean aggregateType;
|
||||||
private String aggregateSyntax;
|
private String aggregateSyntax;
|
||||||
|
|
||||||
SpatialAggregate() {
|
SpatialAggregateImpl() {
|
||||||
}
|
}
|
||||||
|
|
||||||
SpatialAggregate(int aggregation) {
|
SpatialAggregateImpl(int aggregation) {
|
||||||
|
|
||||||
String specificAggrSyntax;
|
String specificAggrSyntax;
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
||||||
import org.hibernate.spatial.Spatial;
|
import org.hibernate.spatial.Spatial;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ class WrappedOGCFunction extends StandardSQLFunction {
|
||||||
* @param geomArrays indicates which argument places are occupied by
|
* @param geomArrays indicates which argument places are occupied by
|
||||||
* sdo_geometries
|
* sdo_geometries
|
||||||
*/
|
*/
|
||||||
WrappedOGCFunction(final String name, final Type type, final boolean[] geomArrays) {
|
WrappedOGCFunction(final String name, final AllowableFunctionReturnType type, final boolean[] geomArrays) {
|
||||||
super( name, type );
|
super( name, type );
|
||||||
if ( isSpatial( type ) ) {
|
if ( isSpatial( type ) ) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
|
@ -74,7 +75,7 @@ class WrappedOGCFunction extends StandardSQLFunction {
|
||||||
.append( ".geom" ).toString() : buf.toString();
|
.append( ".geom" ).toString() : buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSpatial(Type type) {
|
private boolean isSpatial(AllowableFunctionReturnType type) {
|
||||||
return Spatial.class.isAssignableFrom( type.getClass() );
|
return Spatial.class.isAssignableFrom( type.getClass() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.dialect.oracle.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.SimpleProjection;
|
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.type.Type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Template class for Spatial Projections
|
|
||||||
*
|
|
||||||
* @author Tom Acree
|
|
||||||
*/
|
|
||||||
public class OracleSpatialProjection extends SimpleProjection {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
private final String propertyName;
|
|
||||||
private final int aggregate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an instance for the specified aggregate function and property
|
|
||||||
*
|
|
||||||
* @param aggregate The aggregate function (a value of {@code OracleSpatialAggregate}
|
|
||||||
* @param propertyName The name of the geometry property
|
|
||||||
*/
|
|
||||||
public OracleSpatialProjection(int aggregate, String propertyName) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.aggregate = aggregate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
|
|
||||||
final SessionFactoryImplementor factory = criteriaQuery.getFactory();
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection(
|
|
||||||
criteria,
|
|
||||||
this.propertyName
|
|
||||||
);
|
|
||||||
final Dialect dialect = factory.getDialect();
|
|
||||||
if ( dialect instanceof SpatialDialect ) {
|
|
||||||
final SpatialDialect seDialect = (SpatialDialect) dialect;
|
|
||||||
|
|
||||||
return new StringBuilder(
|
|
||||||
seDialect.getSpatialAggregateSQL(
|
|
||||||
columns[0], this.aggregate
|
|
||||||
)
|
|
||||||
).append( " y" ).append( position )
|
|
||||||
.append( "_" ).toString();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Dialect must be spatially enabled dialect"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery)
|
|
||||||
throws HibernateException {
|
|
||||||
return new Type[] { criteriaQuery.getType( criteria, this.propertyName ) };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return aggregate + "(" + propertyName + ")";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.dialect.oracle.criterion;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Factory class for SpationProjection functions *
|
|
||||||
*
|
|
||||||
* @author Tom Acree
|
|
||||||
*/
|
|
||||||
public final class OracleSpatialProjections {
|
|
||||||
|
|
||||||
private OracleSpatialProjections() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a "CONCAT_LRS" projection to the named property.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the geometry property
|
|
||||||
*
|
|
||||||
* @return OracleSpatialProjection
|
|
||||||
*
|
|
||||||
* @see OracleSpatialProjection
|
|
||||||
*/
|
|
||||||
public static OracleSpatialProjection concatLrs(String propertyName) {
|
|
||||||
return new OracleSpatialProjection(
|
|
||||||
OracleSpatialAggregate.LRS_CONCAT,
|
|
||||||
propertyName
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a "CENTROID" projection to the named property.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the geometry property
|
|
||||||
*
|
|
||||||
* @return OracleSpatialProjection
|
|
||||||
*
|
|
||||||
* @see OracleSpatialProjection
|
|
||||||
*/
|
|
||||||
public static OracleSpatialProjection centroid(String propertyName) {
|
|
||||||
return new OracleSpatialProjection(
|
|
||||||
OracleSpatialAggregate.CENTROID,
|
|
||||||
propertyName
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a "CONCAT_LINES" projection to the named property.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the geometry property
|
|
||||||
*
|
|
||||||
* @return OracleSpatialProjection
|
|
||||||
*
|
|
||||||
* @see OracleSpatialProjection
|
|
||||||
*/
|
|
||||||
public static OracleSpatialProjection concatLines(String propertyName) {
|
|
||||||
return new OracleSpatialProjection(
|
|
||||||
OracleSpatialAggregate.CONCAT_LINES,
|
|
||||||
propertyName
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the specified {@code OracleSpatialProjection} to the named property.
|
|
||||||
*
|
|
||||||
* @param projection The projection function
|
|
||||||
* @param propertyName The name of the geometry property
|
|
||||||
*
|
|
||||||
* @return OracleSpatialProjection
|
|
||||||
*
|
|
||||||
* @see OracleSpatialProjection
|
|
||||||
*/
|
|
||||||
public static OracleSpatialProjection projection(int projection, String propertyName) {
|
|
||||||
return new OracleSpatialProjection( projection, propertyName );
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,259 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.dialect.oracle.criterion;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.criterion.CriteriaQuery;
|
|
||||||
import org.hibernate.criterion.Criterion;
|
|
||||||
import org.hibernate.engine.spi.TypedValue;
|
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Geometry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A static factory class for spatial criteria using the Oracle Spatial native spatial operators
|
|
||||||
* for the SDO_GEOMTRY type.
|
|
||||||
*
|
|
||||||
* @author Karel Maesen
|
|
||||||
*/
|
|
||||||
public class OracleSpatialRestrictions {
|
|
||||||
|
|
||||||
private OracleSpatialRestrictions() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_FILTER" constraint to the specified property, using the specified parameters
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the proerty
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param param The function parameters for the SDO_FILTER
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDOFilter(String propertyName, Geometry geom, SDOParameterMap param) {
|
|
||||||
return new OracleSpatialCriterion( propertyName, geom, param ) {
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName );
|
|
||||||
final StringBuilder sql = new StringBuilder( "SDO_FILTER(" );
|
|
||||||
sql.append( columns[0] ).append( "," ).append( "?" );
|
|
||||||
if ( param != null && !param.isEmpty() ) {
|
|
||||||
sql.append( "," ).append( param.toQuotedString() );
|
|
||||||
}
|
|
||||||
sql.append( ") = 'TRUE'" );
|
|
||||||
return sql.toString();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_FILTER" constraint to the specified property, using the specified parameters
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the proerty
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param minResolution The min_resolution parameter
|
|
||||||
* @param maxResolution The max_resolution parameter
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDOFilter(String propertyName, Geometry geom, Double minResolution, Double maxResolution) {
|
|
||||||
if ( minResolution == null && maxResolution == null ) {
|
|
||||||
return SDOFilter( propertyName, geom, null );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
final SDOParameterMap param = new SDOParameterMap();
|
|
||||||
param.setMinResolution( minResolution );
|
|
||||||
param.setMaxResolution( maxResolution );
|
|
||||||
return SDOFilter( propertyName, geom, param );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_NN" constraint to the specified property, using the specified parameters
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param distance The distance parameter
|
|
||||||
* @param numResults The num_results parameter
|
|
||||||
* @param unit The unit parameter
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDONN(
|
|
||||||
String propertyName,
|
|
||||||
Geometry geom,
|
|
||||||
Double distance,
|
|
||||||
Integer numResults,
|
|
||||||
String unit) {
|
|
||||||
if ( distance == null && numResults == null && unit == null ) {
|
|
||||||
return SDONN( propertyName, geom, null );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
final SDOParameterMap param = new SDOParameterMap();
|
|
||||||
param.setDistance( distance );
|
|
||||||
param.setSdoNumRes( numResults );
|
|
||||||
param.setUnit( unit );
|
|
||||||
return SDONN( propertyName, geom, param );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_NN" constraint to the specified property, using the specified {@code SDOParameterMap}
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param param The parameters for the constraint function
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDONN(String propertyName, Geometry geom, SDOParameterMap param) {
|
|
||||||
return new OracleSpatialCriterion( propertyName, geom, param ) {
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName );
|
|
||||||
final StringBuilder sql = new StringBuilder( "SDO_NN(" );
|
|
||||||
sql.append( columns[0] ).append( "," ).append( "?" );
|
|
||||||
if ( param != null && !param.isEmpty() ) {
|
|
||||||
sql.append( "," ).append( param.toQuotedString() );
|
|
||||||
}
|
|
||||||
sql.append( ") = 'TRUE'" );
|
|
||||||
return sql.toString();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_RELATE" constraint to the specified property, using the specified {@code SDOParameterMap}
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param param The parameters for the constraint function
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDORelate(String propertyName, Geometry geom, SDOParameterMap param) {
|
|
||||||
return new OracleSpatialCriterion( propertyName, geom, param ) {
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName );
|
|
||||||
final StringBuilder sql = new StringBuilder( "SDO_RELATE(" );
|
|
||||||
sql.append( columns[0] ).append( "," ).append( "?" );
|
|
||||||
if ( param != null && !param.isEmpty() ) {
|
|
||||||
sql.append( "," ).append( param.toQuotedString() );
|
|
||||||
}
|
|
||||||
sql.append( ") = 'TRUE'" );
|
|
||||||
return sql.toString();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_RELATE" constraint to the specified property, using the specified parameters.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param mask The mask parameter
|
|
||||||
* @param minResolution The min_resolution parameter
|
|
||||||
* @param maxResolution The max_resolution parameter
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDORelate(
|
|
||||||
String propertyName,
|
|
||||||
Geometry geom,
|
|
||||||
RelationshipMask[] mask,
|
|
||||||
Double minResolution,
|
|
||||||
Double maxResolution) {
|
|
||||||
final SDOParameterMap param = new SDOParameterMap();
|
|
||||||
param.setMask( RelationshipMask.booleanCombination( mask ) );
|
|
||||||
param.setMinResolution( minResolution );
|
|
||||||
param.setMaxResolution( maxResolution );
|
|
||||||
return SDORelate( propertyName, geom, param );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_WITHIN_DISTANCE" constraint to the specified property, using the specified {@code SDOParameterMap}.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param param The parameters for the constraint function
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public static Criterion SDOWithinDistance(String propertyName, Geometry geom, SDOParameterMap param) {
|
|
||||||
return new OracleSpatialCriterion( propertyName, geom, param ) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName );
|
|
||||||
final StringBuilder sql = new StringBuilder( "SDO_WITHIN_DISTANCE(" );
|
|
||||||
sql.append( columns[0] ).append( "," ).append( "?" );
|
|
||||||
if ( param != null && !param.isEmpty() ) {
|
|
||||||
sql.append( "," ).append( param.toQuotedString() );
|
|
||||||
}
|
|
||||||
sql.append( ") = 'TRUE'" );
|
|
||||||
return sql.toString();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the "SDO_WITHIN_DISTANCE" constraint to the specified property, using the specified {@code SDOParameterMap}.
|
|
||||||
*
|
|
||||||
* @param propertyName The name of the property
|
|
||||||
* @param geom The search geometry to use in the constraint
|
|
||||||
* @param distance The distance parameter for the constraint function
|
|
||||||
* @param param The parameters for the constraint function
|
|
||||||
*
|
|
||||||
* @return The Criterion
|
|
||||||
*/
|
|
||||||
public static Criterion SDOWithinDistance(
|
|
||||||
String propertyName,
|
|
||||||
Geometry geom,
|
|
||||||
Double distance,
|
|
||||||
SDOParameterMap param) {
|
|
||||||
if ( param == null ) {
|
|
||||||
param = new SDOParameterMap();
|
|
||||||
}
|
|
||||||
param.setDistance( distance );
|
|
||||||
return SDOWithinDistance( propertyName, geom, param );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class OracleSpatialCriterion implements Criterion {
|
|
||||||
protected String propertyName;
|
|
||||||
protected Geometry value;
|
|
||||||
protected SDOParameterMap param;
|
|
||||||
|
|
||||||
public OracleSpatialCriterion(String propertyName, Geometry value, SDOParameterMap param) {
|
|
||||||
this.propertyName = propertyName;
|
|
||||||
this.value = value;
|
|
||||||
this.param = param;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.hibernate.criterion.Criterion#getTypedValues(org.hibernate.Criteria,
|
|
||||||
* org.hibernate.criterion.CriteriaQuery)
|
|
||||||
*/
|
|
||||||
|
|
||||||
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
|
|
||||||
return new TypedValue[] {
|
|
||||||
criteriaQuery.getTypedValue( criteria, propertyName, value )
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.dialect.oracle.criterion;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enumerates the types of spatial relationship masks supported by Oracle Spatial.
|
|
||||||
*/
|
|
||||||
public enum RelationshipMask {
|
|
||||||
/**
|
|
||||||
* The "touch" relationship
|
|
||||||
*/
|
|
||||||
TOUCH,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "overlapbydisjoint" relationship
|
|
||||||
*/
|
|
||||||
OVERLAPBYDISJOINT,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "overlapbyintersect" relationship
|
|
||||||
*/
|
|
||||||
OVERLAPBYINTERSECT,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "equal" relationship
|
|
||||||
*/
|
|
||||||
EQUAL,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "inside" relationship
|
|
||||||
*/
|
|
||||||
INSIDE,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "coveredby" relationship
|
|
||||||
*/
|
|
||||||
COVEREDBY,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "contains" relationship
|
|
||||||
*/
|
|
||||||
CONTAINS,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "covers" relationship
|
|
||||||
*/
|
|
||||||
COVERS,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "anyinteract" relationship
|
|
||||||
*/
|
|
||||||
ANYINTERACT,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "on" relationship
|
|
||||||
*/
|
|
||||||
ON;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Combines the passed "{@code RelationshipMask}s
|
|
||||||
*
|
|
||||||
* @param masks The array of masks to combine
|
|
||||||
*
|
|
||||||
* @return A {@code String} representing the combined relationship mask
|
|
||||||
*/
|
|
||||||
public static String booleanCombination(RelationshipMask[] masks) {
|
|
||||||
String strMask = null;
|
|
||||||
for ( RelationshipMask relationshipMask : masks ) {
|
|
||||||
if ( strMask == null ) {
|
|
||||||
strMask = relationshipMask.toString();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
strMask += "+" + relationshipMask.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return strMask;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,276 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.dialect.oracle.criterion;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the parameters that can be passed into Oracle's Spatial operators
|
|
||||||
*
|
|
||||||
* @author Karel Maesen
|
|
||||||
*/
|
|
||||||
public class SDOParameterMap {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The distance parameter
|
|
||||||
*/
|
|
||||||
public static final String DISTANCE = "distance";
|
|
||||||
/**
|
|
||||||
* The sdo_batch_size parameter
|
|
||||||
*/
|
|
||||||
public static final String SDO_BATCH_SIZE = "sdo_batch_size";
|
|
||||||
/**
|
|
||||||
* The sdo_num_res parameter
|
|
||||||
*/
|
|
||||||
public static final String SDO_NUM_RES = "sdo_num_res";
|
|
||||||
/**
|
|
||||||
* The unit parameter
|
|
||||||
*/
|
|
||||||
public static final String UNIT = "unit";
|
|
||||||
/**
|
|
||||||
* The min_resolution parameter
|
|
||||||
*/
|
|
||||||
public static final String MIN_RESOLUTION = "min_resolution";
|
|
||||||
/**
|
|
||||||
* The max_resolution parameter
|
|
||||||
*/
|
|
||||||
public static final String MAX_RESOLUTION = "max_resolution";
|
|
||||||
/**
|
|
||||||
* The mask parameter
|
|
||||||
*/
|
|
||||||
public static final String MASK = "mask";
|
|
||||||
/**
|
|
||||||
* The querytype parameter
|
|
||||||
*/
|
|
||||||
public static final String QUERYTYPE = "querytype";
|
|
||||||
private Map<String, Object> params = new HashMap<String, Object>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an empty instance
|
|
||||||
*/
|
|
||||||
public SDOParameterMap() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether this instance is empty
|
|
||||||
*
|
|
||||||
* @return true if empty, false otherwise
|
|
||||||
*/
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return this.params.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getDistance() {
|
|
||||||
return (Double) params.get( DISTANCE );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the distance parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param distance The value for the distance parameter
|
|
||||||
*/
|
|
||||||
public void setDistance(Double distance) {
|
|
||||||
if ( distance != null ) {
|
|
||||||
params.put( DISTANCE, distance );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the distance parameter
|
|
||||||
*/
|
|
||||||
public void removeDistance() {
|
|
||||||
params.remove( DISTANCE );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getSdoBatchSize() {
|
|
||||||
return (Integer) params.get( SDO_BATCH_SIZE );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the sdo_batch_size parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param size The value for the sdo_batch_size parameter
|
|
||||||
*/
|
|
||||||
public void setSdoBatchSize(Integer size) {
|
|
||||||
if ( size != null ) {
|
|
||||||
params.put( SDO_BATCH_SIZE, size );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the sdo_batch_size parameter
|
|
||||||
*/
|
|
||||||
public void removeSdoBatchSize() {
|
|
||||||
params.remove( SDO_BATCH_SIZE );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getSdoNumRes() {
|
|
||||||
return (Integer) params.get( SDO_NUM_RES );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the sdo_num_res parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param res The value for the sdo_num_res parameter
|
|
||||||
*/
|
|
||||||
public void setSdoNumRes(Integer res) {
|
|
||||||
if ( res != null ) {
|
|
||||||
params.put( SDO_NUM_RES, res );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the sdo_num_res parameter
|
|
||||||
*/
|
|
||||||
public void removeSdoNumRes() {
|
|
||||||
params.remove( SDO_NUM_RES );
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUnit() {
|
|
||||||
return (String) this.params.get( UNIT );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the unit parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param unit The value for the unit parameter
|
|
||||||
*/
|
|
||||||
public void setUnit(String unit) {
|
|
||||||
if ( unit != null ) {
|
|
||||||
this.params.put( UNIT, unit );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the unit parameter
|
|
||||||
*/
|
|
||||||
public void removeUnit() {
|
|
||||||
this.params.remove( UNIT );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getMaxResolution() {
|
|
||||||
return (Double) params.get( MAX_RESOLUTION );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the max_resolution parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param res The value for the max_resolution parameter
|
|
||||||
*/
|
|
||||||
public void setMaxResolution(Double res) {
|
|
||||||
if ( res != null ) {
|
|
||||||
params.put( MAX_RESOLUTION, res );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the max_resolution parameter
|
|
||||||
*/
|
|
||||||
public void removeMaxResolution() {
|
|
||||||
params.remove( MAX_RESOLUTION );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getMinResolution() {
|
|
||||||
return (Double) params.get( MIN_RESOLUTION );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the min_resolution parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param res The value for the min_resolution parameter
|
|
||||||
*/
|
|
||||||
public void setMinResolution(Double res) {
|
|
||||||
if ( res != null ) {
|
|
||||||
params.put( MIN_RESOLUTION, res );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the min_resolution parameter
|
|
||||||
*/
|
|
||||||
public void removeMinResolution() {
|
|
||||||
params.remove( MIN_RESOLUTION );
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMask() {
|
|
||||||
return (String) this.params.get( MASK );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the mask parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param mask The value for the mask parameter
|
|
||||||
*/
|
|
||||||
public void setMask(String mask) {
|
|
||||||
if ( mask != null ) {
|
|
||||||
this.params.put( MASK, mask );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the mask parameter
|
|
||||||
*/
|
|
||||||
public void removeMask() {
|
|
||||||
this.params.remove( MASK );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the querytype parameter with value "FILTER"
|
|
||||||
*/
|
|
||||||
public void setQueryTypeToFilter() {
|
|
||||||
this.params.put( QUERYTYPE, "FILTER" );
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getQueryType() {
|
|
||||||
return (String) this.params.get( QUERYTYPE );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the querytype parameter with the specified value
|
|
||||||
*
|
|
||||||
* @param queryType The value for the quertype parameter
|
|
||||||
*/
|
|
||||||
public void setQueryType(String queryType) {
|
|
||||||
if ( queryType != null ) {
|
|
||||||
this.params.put( QUERYTYPE, queryType );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the querytype parameter
|
|
||||||
*/
|
|
||||||
public void removeQueryType() {
|
|
||||||
this.params.remove( QUERYTYPE );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns all parameters contained in this instance as a quoted String containing
|
|
||||||
* the {@code <parameter name>=<parameter value>} pairs separated by spaces.
|
|
||||||
* <p>
|
|
||||||
* The return format is as expected by the various SDO_GEOMETRY spatial functions.
|
|
||||||
*
|
|
||||||
* @return String
|
|
||||||
*/
|
|
||||||
public String toQuotedString() {
|
|
||||||
final StringBuilder stb = new StringBuilder();
|
|
||||||
if ( params.isEmpty() ) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
stb.append( '\'' );
|
|
||||||
for ( Map.Entry<String, Object> kv : params.entrySet() ) {
|
|
||||||
if ( kv.getValue() == null ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
stb.append( kv.getKey() ).append( "=" ).append( kv.getValue() ).append( " " );
|
|
||||||
}
|
|
||||||
stb.deleteCharAt( stb.length() - 1 );
|
|
||||||
stb.append( '\'' );
|
|
||||||
return stb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<!--
|
|
||||||
~ Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
~
|
|
||||||
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head></head>
|
|
||||||
<body>
|
|
||||||
<p>
|
|
||||||
A criterion API for Oracle Spatial (10g and later) using SDOGeometry.
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -11,7 +11,6 @@ import java.sql.CallableStatement;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Types;
|
|
||||||
|
|
||||||
import org.hibernate.type.descriptor.ValueBinder;
|
import org.hibernate.type.descriptor.ValueBinder;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
import org.hibernate.type.descriptor.ValueExtractor;
|
||||||
|
@ -19,9 +18,7 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.sql.BasicExtractor;
|
|
||||||
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
|
||||||
|
|
||||||
import org.geolatte.geom.ByteBuffer;
|
import org.geolatte.geom.ByteBuffer;
|
||||||
import org.geolatte.geom.ByteOrder;
|
import org.geolatte.geom.ByteOrder;
|
||||||
|
@ -38,7 +35,7 @@ import org.postgresql.util.PGobject;
|
||||||
*
|
*
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
*/
|
*/
|
||||||
public class PGGeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class PGGeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
|
|
||||||
private final Wkb.Dialect wkbDialect;
|
private final Wkb.Dialect wkbDialect;
|
||||||
|
@ -80,7 +77,7 @@ public class PGGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return 5432;
|
return 5432;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +105,7 @@ public class PGGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
|
|
||||||
private PGobject toPGobject(X value, WrapperOptions options) throws SQLException {
|
private PGobject toPGobject(X value, WrapperOptions options) throws SQLException {
|
||||||
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.POSTGIS_EWKB_1 );
|
final WkbEncoder encoder = Wkb.newEncoder( Wkb.Dialect.POSTGIS_EWKB_1 );
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final String hexString = encoder.encode( geometry, ByteOrder.NDR ).toString();
|
final String hexString = encoder.encode( geometry, ByteOrder.NDR ).toString();
|
||||||
final PGobject obj = new PGobject();
|
final PGobject obj = new PGobject();
|
||||||
obj.setType( "geometry" );
|
obj.setType( "geometry" );
|
||||||
|
@ -123,20 +120,21 @@ public class PGGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
|
public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
|
||||||
return new BasicExtractor<X>( javaTypeDescriptor, this ) {
|
return new BasicExtractor<X>( javaTypeDescriptor, this ) {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( rs.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( rs.getObject( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getObject( index ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getObject( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getObject( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
import org.hibernate.spatial.SpatialFunction;
|
||||||
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
||||||
|
|
||||||
interface PGSpatialDialectTrait extends SpatialDialect {
|
interface PGSpatialDialectTrait {
|
||||||
|
|
||||||
PostgisSupport support = new PostgisSupport();
|
PostgisSupport support = new PostgisSupport();
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
* @return SQL fragment {@code SpatialRelateExpression}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
default String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default String getSpatialFilterExpression(String columnName) {
|
default String getSpatialFilterExpression(String columnName) {
|
||||||
return support.getSpatialFilterExpression( columnName );
|
return support.getSpatialFilterExpression( columnName );
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for the projection
|
* @return The SQL fragment for the projection
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default String getSpatialAggregateSQL(String columnName, int aggregation) {
|
default String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
return support.getSpatialAggregateSQL( columnName, aggregation );
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default String getDWithinSQL(String columnName) {
|
default String getDWithinSQL(String columnName) {
|
||||||
return support.getDWithinSQL( columnName );
|
return support.getDWithinSQL( columnName );
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default String getHavingSridSQL(String columnName) {
|
default String getHavingSridSQL(String columnName) {
|
||||||
return support.getHavingSridSQL( columnName );
|
return support.getHavingSridSQL( columnName );
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for the isempty function
|
* @return The SQL fragment for the isempty function
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default String getIsEmptySQL(String columnName, boolean isEmpty) {
|
default String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
return support.getIsEmptySQL( columnName, isEmpty );
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return True if filtering is supported
|
* @return True if filtering is supported
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default boolean supportsFiltering() {
|
default boolean supportsFiltering() {
|
||||||
return support.supportsFiltering();
|
return support.supportsFiltering();
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ interface PGSpatialDialectTrait extends SpatialDialect {
|
||||||
*
|
*
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
default boolean supports(SpatialFunction function) {
|
default boolean supports(SpatialFunction function) {
|
||||||
return support.supports( function );
|
return support.supports( function );
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,10 @@ import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
import org.hibernate.spatial.SpatialFunction;
|
||||||
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
||||||
|
import org.hibernate.sql.ast.SqlAstTranslator;
|
||||||
|
import org.hibernate.sql.ast.spi.SqlAppender;
|
||||||
|
import org.hibernate.sql.ast.tree.SqlAstNode;
|
||||||
|
import org.hibernate.sql.ast.tree.predicate.Predicate;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
|
@ -182,10 +186,10 @@ public class PostgisFunctions extends SpatialFunctionsRegistry {
|
||||||
"extent", new ExtentFunction()
|
"extent", new ExtentFunction()
|
||||||
);
|
);
|
||||||
|
|
||||||
//register Spatial Filter function
|
// //register Spatial Filter function
|
||||||
put(
|
// put(
|
||||||
SpatialFunction.filter.name(), new FilterFunction()
|
// SpatialFunction.filter.name(), new FilterFunction()
|
||||||
);
|
// );
|
||||||
|
|
||||||
//other common functions
|
//other common functions
|
||||||
put(
|
put(
|
||||||
|
@ -207,39 +211,43 @@ public class PostgisFunctions extends SpatialFunctionsRegistry {
|
||||||
super( "st_extent" );
|
super( "st_extent" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String render(
|
public void render(
|
||||||
Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
SqlAppender sqlAppender,
|
||||||
String rendered = super.render( firstArgumentType, arguments, sessionFactory );
|
List<SqlAstNode> sqlAstArguments,
|
||||||
//add cast
|
Predicate filter,
|
||||||
return rendered + "::geometry";
|
SqlAstTranslator<?> translator) {
|
||||||
|
super.render( sqlAppender, sqlAstArguments, filter, translator ) ;
|
||||||
|
sqlAppender.appendSql( "::geometry" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class FilterFunction extends StandardSQLFunction {
|
// private static class FilterFunction extends StandardSQLFunction {
|
||||||
|
//
|
||||||
public FilterFunction() {
|
// public FilterFunction() {
|
||||||
super( "&&" );
|
// super( "&&" );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@Override
|
// @Override
|
||||||
public String render(
|
// public String render(
|
||||||
Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
// Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
||||||
int argumentCount = arguments.size();
|
// int argumentCount = arguments.size();
|
||||||
if ( argumentCount != 2 ) {
|
// if ( argumentCount != 2 ) {
|
||||||
throw new QueryException( String.format(
|
// throw new QueryException( String.format(
|
||||||
Locale.ENGLISH,
|
// Locale.ENGLISH,
|
||||||
"2 arguments expected, received %d",
|
// "2 arguments expected, received %d",
|
||||||
argumentCount
|
// argumentCount
|
||||||
) );
|
// ) );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return Stream.of(
|
// return Stream.of(
|
||||||
String.valueOf( arguments.get( 0 ) ),
|
// String.valueOf( arguments.get( 0 ) ),
|
||||||
getRenderedName( arguments ),
|
// getRenderedName( arguments ),
|
||||||
String.valueOf( arguments.get( 1 ) )
|
// String.valueOf( arguments.get( 1 ) )
|
||||||
).collect( Collectors.joining( " ", "(", ")" ) );
|
// ).collect( Collectors.joining( " ", "(", ")" ) );
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,6 @@
|
||||||
|
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Dialect for Postgresql with support for the Postgis spatial types, functions and operators (release 1.x - 1.3)
|
* A Dialect for Postgresql with support for the Postgis spatial types, functions and operators (release 1.x - 1.3)
|
||||||
*
|
*
|
||||||
|
@ -19,224 +14,4 @@ import org.hibernate.type.StandardBasicTypes;
|
||||||
* creation-date: Dec 18, 2010
|
* creation-date: Dec 18, 2010
|
||||||
*/
|
*/
|
||||||
public class PostgisNoSQLMM extends PostgisDialect {
|
public class PostgisNoSQLMM extends PostgisDialect {
|
||||||
|
|
||||||
public PostgisNoSQLMM() {
|
|
||||||
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
|
|
||||||
// registering OGC functions
|
|
||||||
// (spec_simplefeatures_sql_99-04.pdf)
|
|
||||||
|
|
||||||
// section 2.1.1.1
|
|
||||||
// Registerfunction calls for registering geometry functions:
|
|
||||||
// first argument is the OGC standard functionname, second the name as
|
|
||||||
// it occurs in the spatial dialect
|
|
||||||
registerFunction(
|
|
||||||
"dimension", new StandardSQLFunction(
|
|
||||||
"dimension",
|
|
||||||
StandardBasicTypes.INTEGER
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"geometrytype", new StandardSQLFunction(
|
|
||||||
"geometrytype", StandardBasicTypes.STRING
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"srid", new StandardSQLFunction(
|
|
||||||
"srid",
|
|
||||||
StandardBasicTypes.INTEGER
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"envelope", new StandardSQLFunction(
|
|
||||||
"envelope"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"astext", new StandardSQLFunction(
|
|
||||||
"astext",
|
|
||||||
StandardBasicTypes.STRING
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"asbinary", new StandardSQLFunction(
|
|
||||||
"asbinary",
|
|
||||||
StandardBasicTypes.BINARY
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"isempty", new StandardSQLFunction(
|
|
||||||
"isempty",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"issimple", new StandardSQLFunction(
|
|
||||||
"issimple",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"boundary", new StandardSQLFunction(
|
|
||||||
"boundary"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Register functions for spatial relation constructs
|
|
||||||
registerFunction(
|
|
||||||
"overlaps", new StandardSQLFunction(
|
|
||||||
"overlaps",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"intersects", new StandardSQLFunction(
|
|
||||||
"intersects",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"equals", new StandardSQLFunction(
|
|
||||||
"equals",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"contains", new StandardSQLFunction(
|
|
||||||
"contains",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"crosses", new StandardSQLFunction(
|
|
||||||
"crosses",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"disjoint", new StandardSQLFunction(
|
|
||||||
"disjoint",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"touches", new StandardSQLFunction(
|
|
||||||
"touches",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"within", new StandardSQLFunction(
|
|
||||||
"within",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"relate", new StandardSQLFunction(
|
|
||||||
"relate",
|
|
||||||
StandardBasicTypes.BOOLEAN
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// register the spatial analysis functions
|
|
||||||
registerFunction(
|
|
||||||
"distance", new StandardSQLFunction(
|
|
||||||
"distance",
|
|
||||||
StandardBasicTypes.DOUBLE
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"buffer", new StandardSQLFunction(
|
|
||||||
"buffer"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"convexhull", new StandardSQLFunction(
|
|
||||||
"convexhull"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"difference", new StandardSQLFunction(
|
|
||||||
"difference"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"intersection", new StandardSQLFunction(
|
|
||||||
"intersection"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"symdifference",
|
|
||||||
new StandardSQLFunction( "symdifference" )
|
|
||||||
);
|
|
||||||
registerFunction(
|
|
||||||
"geomunion", new StandardSQLFunction(
|
|
||||||
"geomunion"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
//register Spatial Aggregate function
|
|
||||||
registerFunction(
|
|
||||||
"extent", new StandardSQLFunction(
|
|
||||||
"extent"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
//other common spatial functions
|
|
||||||
registerFunction(
|
|
||||||
"transform", new StandardSQLFunction(
|
|
||||||
"transform"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return "( dwithin(" + columnName + ",?,?) )";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return "( srid(" + columnName + ") = ?)";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
final String emptyExpr = "( isempty(" + columnName + ")) ";
|
|
||||||
return isEmpty ? emptyExpr : "not " + emptyExpr;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
switch ( spatialRelation ) {
|
|
||||||
case SpatialRelation.WITHIN:
|
|
||||||
return "(" + columnName + " && ? AND within(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.CONTAINS:
|
|
||||||
return "(" + columnName + " && ? AND contains(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.CROSSES:
|
|
||||||
return "(" + columnName + " && ? AND crosses(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.OVERLAPS:
|
|
||||||
return "(" + columnName + " && ? AND overlaps(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.DISJOINT:
|
|
||||||
return "(" + columnName + " && ? AND disjoint(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.INTERSECTS:
|
|
||||||
return "(" + columnName + " && ? AND intersects(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.TOUCHES:
|
|
||||||
return "(" + columnName + " && ? AND touches(" + columnName + ", ?))";
|
|
||||||
case SpatialRelation.EQUALS:
|
|
||||||
return "(" + columnName + " && ? AND equals(" + columnName + ", ?))";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException( "Spatial relation is not known by this dialect" );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return super.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,41 +7,18 @@
|
||||||
|
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
import org.hibernate.boot.model.TypeContributions;
|
||||||
import org.hibernate.dialect.PostgreSQL10Dialect;
|
import org.hibernate.dialect.PostgreSQLDialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
import org.hibernate.service.ServiceRegistry;
|
||||||
|
|
||||||
public class PostgisPG10Dialect extends PostgreSQL10Dialect implements PGSpatialDialectTrait {
|
@Deprecated
|
||||||
|
public class PostgisPG10Dialect extends PostgreSQLDialect {
|
||||||
|
|
||||||
public PostgisPG10Dialect() {
|
public PostgisPG10Dialect() {
|
||||||
super();
|
super( 100 );
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( isSpatial( typeCode1 ) && isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL82Dialect;
|
import org.hibernate.dialect.PostgreSQL82Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@code PostgreSQL82Dialect} to add support for the Postgis spatial types, functions and operators .
|
* Extends the {@code PostgreSQL82Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
|
@ -21,76 +15,4 @@ import org.hibernate.spatial.SpatialFunction;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG82Dialect extends PostgreSQL82Dialect implements SpatialDialect {
|
public class PostgisPG82Dialect extends PostgreSQL82Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
transient private PostgisSupport support = new PostgisSupport();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG82Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( support.isSpatial( typeCode1 ) && support.isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL91Dialect;
|
import org.hibernate.dialect.PostgreSQL91Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@code PostgreSQL91Dialect} to add support for the Postgis spatial types, functions and operators .
|
* Extends the {@code PostgreSQL91Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
|
@ -21,143 +15,4 @@ import org.hibernate.spatial.SpatialFunction;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG91Dialect extends PostgreSQL91Dialect implements SpatialDialect {
|
public class PostgisPG91Dialect extends PostgreSQL91Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
transient private PostgisSupport support = new PostgisSupport();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG91Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( support.isSpatial( typeCode1 ) && support.isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-clause when parsing
|
|
||||||
* <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
* <p/>
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the relation is
|
|
||||||
* applied
|
|
||||||
* @param spatialRelation The type of spatial relation (as defined in
|
|
||||||
* <code>SpatialRelation</code>).
|
|
||||||
*
|
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-expression when parsing
|
|
||||||
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the filter is
|
|
||||||
* be applied
|
|
||||||
*
|
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the specfied Spatial aggregate expression.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the Geometry property
|
|
||||||
* @param aggregation The type of <code>SpatialAggregate</code>
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the projection
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
|
||||||
* <code>IsNotEmpty</code> expression.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column
|
|
||||||
* @param isEmpty Whether the geometry is tested for empty or non-empty
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the isempty function
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
|
||||||
* <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
|
||||||
*
|
|
||||||
* @return True if filtering is supported
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does this dialect supports the specified <code>SpatialFunction</code>.
|
|
||||||
*
|
|
||||||
* @param function <code>SpatialFunction</code>
|
|
||||||
*
|
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL92Dialect;
|
import org.hibernate.dialect.PostgreSQL92Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@code PostgreSQL92Dialect} to add support for the Postgis spatial types, functions and operators .
|
* Extends the {@code PostgreSQL92Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
|
@ -21,143 +15,4 @@ import org.hibernate.spatial.SpatialFunction;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG92Dialect extends PostgreSQL92Dialect implements SpatialDialect {
|
public class PostgisPG92Dialect extends PostgreSQL92Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
transient private PostgisSupport support = new PostgisSupport();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG92Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( support.isSpatial( typeCode1 ) && support.isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-clause when parsing
|
|
||||||
* <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
* <p/>
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the relation is
|
|
||||||
* applied
|
|
||||||
* @param spatialRelation The type of spatial relation (as defined in
|
|
||||||
* <code>SpatialRelation</code>).
|
|
||||||
*
|
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-expression when parsing
|
|
||||||
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the filter is
|
|
||||||
* be applied
|
|
||||||
*
|
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the specfied Spatial aggregate expression.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the Geometry property
|
|
||||||
* @param aggregation The type of <code>SpatialAggregate</code>
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the projection
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
|
||||||
* <code>IsNotEmpty</code> expression.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column
|
|
||||||
* @param isEmpty Whether the geometry is tested for empty or non-empty
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the isempty function
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
|
||||||
* <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
|
||||||
*
|
|
||||||
* @return True if filtering is supported
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does this dialect supports the specified <code>SpatialFunction</code>.
|
|
||||||
*
|
|
||||||
* @param function <code>SpatialFunction</code>
|
|
||||||
*
|
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL93Dialect;
|
import org.hibernate.dialect.PostgreSQL93Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@code PostgreSQL93Dialect} to add support for the Postgis spatial types, functions and operators .
|
* Extends the {@code PostgreSQL93Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
|
@ -21,143 +15,4 @@ import org.hibernate.spatial.SpatialFunction;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG93Dialect extends PostgreSQL93Dialect implements SpatialDialect {
|
public class PostgisPG93Dialect extends PostgreSQL93Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
transient private PostgisSupport support = new PostgisSupport();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG93Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( support.isSpatial( typeCode1 ) && support.isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-clause when parsing
|
|
||||||
* <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
* <p/>
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the relation is
|
|
||||||
* applied
|
|
||||||
* @param spatialRelation The type of spatial relation (as defined in
|
|
||||||
* <code>SpatialRelation</code>).
|
|
||||||
*
|
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-expression when parsing
|
|
||||||
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the filter is
|
|
||||||
* be applied
|
|
||||||
*
|
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the specfied Spatial aggregate expression.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the Geometry property
|
|
||||||
* @param aggregation The type of <code>SpatialAggregate</code>
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the projection
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
|
||||||
* <code>IsNotEmpty</code> expression.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column
|
|
||||||
* @param isEmpty Whether the geometry is tested for empty or non-empty
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the isempty function
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
|
||||||
* <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
|
||||||
*
|
|
||||||
* @return True if filtering is supported
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does this dialect supports the specified <code>SpatialFunction</code>.
|
|
||||||
*
|
|
||||||
* @param function <code>SpatialFunction</code>
|
|
||||||
*
|
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL94Dialect;
|
import org.hibernate.dialect.PostgreSQL94Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@code PostgreSQL94Dialect} to add support for the Postgis spatial types, functions and operators .
|
* Extends the {@code PostgreSQL94Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
|
@ -21,143 +15,4 @@ import org.hibernate.spatial.SpatialFunction;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG94Dialect extends PostgreSQL94Dialect implements SpatialDialect {
|
public class PostgisPG94Dialect extends PostgreSQL94Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
transient private PostgisSupport support = new PostgisSupport();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG94Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( support.isSpatial( typeCode1 ) && support.isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-clause when parsing
|
|
||||||
* <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
* <p/>
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the relation is
|
|
||||||
* applied
|
|
||||||
* @param spatialRelation The type of spatial relation (as defined in
|
|
||||||
* <code>SpatialRelation</code>).
|
|
||||||
*
|
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-expression when parsing
|
|
||||||
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the filter is
|
|
||||||
* be applied
|
|
||||||
*
|
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the specfied Spatial aggregate expression.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the Geometry property
|
|
||||||
* @param aggregation The type of <code>SpatialAggregate</code>
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the projection
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
|
||||||
* <code>IsNotEmpty</code> expression.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column
|
|
||||||
* @param isEmpty Whether the geometry is tested for empty or non-empty
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the isempty function
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
|
||||||
* <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
|
||||||
*
|
|
||||||
* @return True if filtering is supported
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does this dialect supports the specified <code>SpatialFunction</code>.
|
|
||||||
*
|
|
||||||
* @param function <code>SpatialFunction</code>
|
|
||||||
*
|
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,45 +6,11 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL95Dialect;
|
import org.hibernate.dialect.PostgreSQL95Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@code PostgreSQL95Dialect} to add support for the Postgis spatial types, functions and operators .
|
* Extends the {@code PostgreSQL95Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG95Dialect extends PostgreSQL95Dialect implements PGSpatialDialectTrait {
|
public class PostgisPG95Dialect extends PostgreSQL95Dialect implements PGSpatialDialectTrait {
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG95Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( isSpatial( typeCode1 ) && isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
package org.hibernate.spatial.dialect.postgis;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.PostgreSQL9Dialect;
|
import org.hibernate.dialect.PostgreSQL9Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * Extends the {@code PostgreSQL9Dialect} to add support for the Postgis spatial types, functions and operators .
|
* * Extends the {@code PostgreSQL9Dialect} to add support for the Postgis spatial types, functions and operators .
|
||||||
|
@ -21,143 +15,4 @@ import org.hibernate.spatial.SpatialFunction;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
* Created by Karel Maesen, Geovise BVBA on 01/11/16.
|
||||||
*/
|
*/
|
||||||
public class PostgisPG9Dialect extends PostgreSQL9Dialect implements SpatialDialect {
|
public class PostgisPG9Dialect extends PostgreSQL9Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
transient private PostgisSupport support = new PostgisSupport();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance
|
|
||||||
*/
|
|
||||||
public PostgisPG9Dialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equivalentTypes(int typeCode1, int typeCode2) {
|
|
||||||
return super.equivalentTypes( typeCode1, typeCode2 ) ||
|
|
||||||
( support.isSpatial( typeCode1 ) && support.isSpatial( typeCode2 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-clause when parsing
|
|
||||||
* <code>org.hibernatespatial.criterion.SpatialRelateExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
* <p/>
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the relation is
|
|
||||||
* applied
|
|
||||||
* @param spatialRelation The type of spatial relation (as defined in
|
|
||||||
* <code>SpatialRelation</code>).
|
|
||||||
*
|
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the SQL WHERE-expression when parsing
|
|
||||||
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
|
|
||||||
* into prepared statements.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the geometry-typed column to which the filter is
|
|
||||||
* be applied
|
|
||||||
*
|
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment for the specfied Spatial aggregate expression.
|
|
||||||
*
|
|
||||||
* @param columnName The name of the Geometry property
|
|
||||||
* @param aggregation The type of <code>SpatialAggregate</code>
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the projection
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>HavingSridExpression</code>.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column to test against
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the SQL fragment when parsing a <code>IsEmptyExpression</code> or
|
|
||||||
* <code>IsNotEmpty</code> expression.
|
|
||||||
*
|
|
||||||
* @param columnName The geometry column
|
|
||||||
* @param isEmpty Whether the geometry is tested for empty or non-empty
|
|
||||||
*
|
|
||||||
* @return The SQL fragment for the isempty function
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if this <code>SpatialDialect</code> supports a specific filtering function.
|
|
||||||
* <p> This is intended to signal DB-support for fast window queries, or MBR-overlap queries.</p>
|
|
||||||
*
|
|
||||||
* @return True if filtering is supported
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does this dialect supports the specified <code>SpatialFunction</code>.
|
|
||||||
*
|
|
||||||
* @param function <code>SpatialFunction</code>
|
|
||||||
*
|
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSpatial(int typeCode){
|
public boolean isSpatial(int typeCode){
|
||||||
return typeCode == Types.OTHER || typeCode == PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType();
|
return typeCode == Types.OTHER || typeCode == PGGeometryTypeDescriptor.INSTANCE_WKB_1.getJdbcType();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,7 +65,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return SQL fragment {@code SpatialRelateExpression}
|
* @return SQL fragment {@code SpatialRelateExpression}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
||||||
switch ( spatialRelation ) {
|
switch ( spatialRelation ) {
|
||||||
case SpatialRelation.WITHIN:
|
case SpatialRelation.WITHIN:
|
||||||
|
@ -102,7 +102,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
public String getSpatialFilterExpression(String columnName) {
|
||||||
return "(" + columnName + " && ? ) ";
|
return "(" + columnName + " && ? ) ";
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for the projection
|
* @return The SQL fragment for the projection
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||||
switch ( aggregation ) {
|
switch ( aggregation ) {
|
||||||
case SpatialAggregate.EXTENT:
|
case SpatialAggregate.EXTENT:
|
||||||
|
@ -137,7 +137,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
* @return The SQL fragment when parsing a <code>DWithinExpression</code>.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
public String getDWithinSQL(String columnName) {
|
||||||
return "ST_DWithin(" + columnName + ",?,?)";
|
return "ST_DWithin(" + columnName + ",?,?)";
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
* @return The SQL fragment for a <code>HavingSridExpression</code>.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
public String getHavingSridSQL(String columnName) {
|
||||||
return "( ST_srid(" + columnName + ") = ?)";
|
return "( ST_srid(" + columnName + ") = ?)";
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return The SQL fragment for the isempty function
|
* @return The SQL fragment for the isempty function
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||||
final String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
final String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
||||||
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
||||||
|
@ -175,7 +175,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return True if filtering is supported
|
* @return True if filtering is supported
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
public boolean supportsFiltering() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,7 @@ public class PostgisSupport implements SpatialDialect, Serializable {
|
||||||
*
|
*
|
||||||
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
* @return True if this <code>SpatialDialect</code> supports the spatial function specified by the function parameter.
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
public boolean supports(SpatialFunction function) {
|
||||||
return ( postgisFunctions.get( function.toString() ) != null );
|
return ( postgisFunctions.get( function.toString() ) != null );
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
import org.hibernate.type.descriptor.jdbc.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.codec.db.sqlserver.Decoders;
|
import org.geolatte.geom.codec.db.sqlserver.Decoders;
|
||||||
|
@ -32,7 +32,7 @@ import org.geolatte.geom.codec.db.sqlserver.Encoders;
|
||||||
* @author Karel Maesen, Geovise BVBA
|
* @author Karel Maesen, Geovise BVBA
|
||||||
* creation-date: 8/23/11
|
* creation-date: 8/23/11
|
||||||
*/
|
*/
|
||||||
public class SqlServer2008GeometryTypeDescriptor implements SqlTypeDescriptor {
|
public class SqlServer2008GeometryTypeDescriptor implements JdbcTypeDescriptor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An instance of the descrtiptor
|
* An instance of the descrtiptor
|
||||||
|
@ -40,7 +40,7 @@ public class SqlServer2008GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
public static final SqlServer2008GeometryTypeDescriptor INSTANCE = new SqlServer2008GeometryTypeDescriptor();
|
public static final SqlServer2008GeometryTypeDescriptor INSTANCE = new SqlServer2008GeometryTypeDescriptor();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSqlType() {
|
public int getJdbcType() {
|
||||||
return Types.ARRAY;
|
return Types.ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ public class SqlServer2008GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final byte[] bytes = Encoders.encode( geometry );
|
final byte[] bytes = Encoders.encode( geometry );
|
||||||
st.setObject( index, bytes );
|
st.setObject( index, bytes );
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ public class SqlServer2008GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
@Override
|
@Override
|
||||||
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final Geometry geometry = getJavaDescriptor().unwrap( value, Geometry.class, options );
|
final Geometry geometry = getJavaTypeDescriptor().unwrap( value, Geometry.class, options );
|
||||||
final byte[] bytes = Encoders.encode( geometry );
|
final byte[] bytes = Encoders.encode( geometry );
|
||||||
st.setObject( name, bytes );
|
st.setObject( name, bytes );
|
||||||
}
|
}
|
||||||
|
@ -77,18 +77,18 @@ public class SqlServer2008GeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( rs.getObject( paramIndex ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( rs.getObject( paramIndex ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getObject( index ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getObject( index ) ), options );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
return getJavaDescriptor().wrap( toGeometry( statement.getObject( name ) ), options );
|
return getJavaTypeDescriptor().wrap( toGeometry( statement.getObject( name ) ), options );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,21 +8,8 @@
|
||||||
package org.hibernate.spatial.dialect.sqlserver;
|
package org.hibernate.spatial.dialect.sqlserver;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.SQLServer2008Dialect;
|
import org.hibernate.dialect.SQLServer2008Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.dialect.function.SQLFunctionTemplate;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
|
|
||||||
import org.hibernate.spatial.GeolatteGeometryType;
|
|
||||||
import org.hibernate.spatial.JTSGeometryJavaTypeDescriptor;
|
|
||||||
import org.hibernate.spatial.JTSGeometryType;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.SpatialRelation;
|
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The <code>SpatialDialect</code> for Microsoft SQL Server (2008).
|
* The <code>SpatialDialect</code> for Microsoft SQL Server (2008).
|
||||||
|
@ -31,70 +18,4 @@ import org.hibernate.type.StandardBasicTypes;
|
||||||
*/
|
*/
|
||||||
public class SqlServer2008SpatialDialect extends SQLServer2008Dialect implements SpatialDialect {
|
public class SqlServer2008SpatialDialect extends SQLServer2008Dialect implements SpatialDialect {
|
||||||
|
|
||||||
|
|
||||||
final private SqlServerSupport support = new SqlServerSupport();
|
|
||||||
|
|
||||||
public SqlServer2008SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
SqlServer2008GeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,81 +6,12 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.sqlserver;
|
package org.hibernate.spatial.dialect.sqlserver;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
|
||||||
import org.hibernate.dialect.SQLServer2012Dialect;
|
import org.hibernate.dialect.SQLServer2012Dialect;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
import org.hibernate.service.ServiceRegistry;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
import org.hibernate.spatial.SpatialDialect;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Karel Maesen, Geovise BVBA on 19/09/2018.
|
* Created by Karel Maesen, Geovise BVBA on 19/09/2018.
|
||||||
*/
|
*/
|
||||||
public class SqlServer2012SpatialDialect extends SQLServer2012Dialect implements SpatialDialect {
|
public class SqlServer2012SpatialDialect extends SQLServer2012Dialect implements SpatialDialect {
|
||||||
|
|
||||||
final private SqlServerSupport support = new SqlServerSupport();
|
|
||||||
|
|
||||||
public SqlServer2012SpatialDialect() {
|
|
||||||
super();
|
|
||||||
registerColumnType(
|
|
||||||
SqlServer2008GeometryTypeDescriptor.INSTANCE.getSqlType(),
|
|
||||||
"GEOMETRY"
|
|
||||||
);
|
|
||||||
|
|
||||||
for ( Map.Entry<String, SQLFunction> entry : support.functionsToRegister() ) {
|
|
||||||
registerFunction( entry.getKey(), entry.getValue() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
|
|
||||||
super.contributeTypes(
|
|
||||||
typeContributions,
|
|
||||||
serviceRegistry
|
|
||||||
);
|
|
||||||
support.contributeTypes( typeContributions, serviceRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
|
||||||
return support.getSpatialRelateSQL( columnName, spatialRelation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
|
||||||
return support.getSpatialFilterExpression( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
|
||||||
return support.getSpatialAggregateSQL( columnName, aggregation );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
|
||||||
return support.getDWithinSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
|
||||||
return support.getHavingSridSQL( columnName );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
|
||||||
return support.getIsEmptySQL( columnName, isEmpty );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
|
||||||
return support.supportsFiltering();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
|
||||||
return support.supports( function );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.dialect.sqlserver;
|
package org.hibernate.spatial.dialect.sqlserver;
|
||||||
|
|
||||||
import org.hibernate.dialect.function.SQLFunctionTemplate;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Karel Maesen, Geovise BVBA on 19/09/2018.
|
* Created by Karel Maesen, Geovise BVBA on 19/09/2018.
|
||||||
|
@ -17,53 +17,55 @@ import org.hibernate.type.StandardBasicTypes;
|
||||||
class SqlServerFunctions extends SpatialFunctionsRegistry {
|
class SqlServerFunctions extends SpatialFunctionsRegistry {
|
||||||
public SqlServerFunctions() {
|
public SqlServerFunctions() {
|
||||||
|
|
||||||
put( "dimension", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "?1.STDimension()" ) );
|
//TODO -- re-implement. In 6.0 there is no longer a SQLFunctionTemplate class
|
||||||
put( "geometrytype", new SQLFunctionTemplate( StandardBasicTypes.STRING, "?1.STGeometryType()" ) );
|
|
||||||
put( "srid", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "?1.STSrid" ) );
|
|
||||||
put( "envelope", new SqlServerMethod( "STEnvelope" ) );
|
|
||||||
put( "astext", new SQLFunctionTemplate( StandardBasicTypes.STRING, "?1.STAsText()" ) );
|
|
||||||
put( "asbinary", new SQLFunctionTemplate( StandardBasicTypes.BINARY, "?1.STAsBinary()" ) );
|
|
||||||
|
|
||||||
put( "isempty", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STIsEmpty()" ) );
|
// put( "dimension", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "?1.STDimension()" ) );
|
||||||
put( "issimple", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STIsSimple()" ) );
|
// put( "geometrytype", new SQLFunctionTemplate( StandardBasicTypes.STRING, "?1.STGeometryType()" ) );
|
||||||
put( "boundary", new SqlServerMethod( "STBoundary" ) );
|
// put( "srid", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "?1.STSrid" ) );
|
||||||
|
// put( "envelope", new SqlServerMethod( "STEnvelope" ) );
|
||||||
// section 2.1.1.2
|
// put( "astext", new SQLFunctionTemplate( StandardBasicTypes.STRING, "?1.STAsText()" ) );
|
||||||
// Register functions for spatial relation constructs
|
// put( "asbinary", new SQLFunctionTemplate( StandardBasicTypes.BINARY, "?1.STAsBinary()" ) );
|
||||||
put( "contains", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STContains(?2)" ) );
|
//
|
||||||
put( "crosses", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STCrosses(?2)" ) );
|
// put( "isempty", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STIsEmpty()" ) );
|
||||||
put( "disjoint", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STDisjoint(?2)" ) );
|
// put( "issimple", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STIsSimple()" ) );
|
||||||
put( "equals", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STEquals(?2)" ) );
|
// put( "boundary", new SqlServerMethod( "STBoundary" ) );
|
||||||
put( "intersects", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STIntersects(?2)" ) );
|
//
|
||||||
put( "overlaps", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STOverlaps(?2)" ) );
|
// // section 2.1.1.2
|
||||||
put( "touches", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STTouches(?2)" ) );
|
// // Register functions for spatial relation constructs
|
||||||
put( "within", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STWithin(?2)" ) );
|
// put( "contains", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STContains(?2)" ) );
|
||||||
put( "relate", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STRelate(?2,?3)" ) );
|
// put( "crosses", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STCrosses(?2)" ) );
|
||||||
|
// put( "disjoint", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STDisjoint(?2)" ) );
|
||||||
// section 2.1.1.3
|
// put( "equals", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STEquals(?2)" ) );
|
||||||
// Register spatial analysis functions.
|
// put( "intersects", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STIntersects(?2)" ) );
|
||||||
put( "distance", new SQLFunctionTemplate( StandardBasicTypes.DOUBLE, "?1.STDistance(?2)" ) );
|
// put( "overlaps", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STOverlaps(?2)" ) );
|
||||||
put( "buffer", new SqlServerMethod( "STBuffer" ) );
|
// put( "touches", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STTouches(?2)" ) );
|
||||||
put( "convexhull", new SqlServerMethod( "STConvexHull" ) );
|
// put( "within", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STWithin(?2)" ) );
|
||||||
put( "difference", new SqlServerMethod( "STDifference" ) );
|
// put( "relate", new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.STRelate(?2,?3)" ) );
|
||||||
put( "intersection", new SqlServerMethod( "STIntersection" ) );
|
//
|
||||||
put( "symdifference", new SqlServerMethod( "STSymDifference" ) );
|
// // section 2.1.1.3
|
||||||
put( "geomunion", new SqlServerMethod( "STUnion" ) );
|
// // Register spatial analysis functions.
|
||||||
// we rename OGC union to geomunion because union is a reserved SQL keyword.
|
// put( "distance", new SQLFunctionTemplate( StandardBasicTypes.DOUBLE, "?1.STDistance(?2)" ) );
|
||||||
// (See also postgis documentation).
|
// put( "buffer", new SqlServerMethod( "STBuffer" ) );
|
||||||
|
// put( "convexhull", new SqlServerMethod( "STConvexHull" ) );
|
||||||
// portable spatial aggregate functions
|
// put( "difference", new SqlServerMethod( "STDifference" ) );
|
||||||
// no aggregatefunctions implemented in sql-server2000
|
// put( "intersection", new SqlServerMethod( "STIntersection" ) );
|
||||||
//put("extent", new SQLFunctionTemplate(geomType, "?1.STExtent()"));
|
// put( "symdifference", new SqlServerMethod( "STSymDifference" ) );
|
||||||
|
// put( "geomunion", new SqlServerMethod( "STUnion" ) );
|
||||||
// section 2.1.9.1 methods on surfaces
|
// // we rename OGC union to geomunion because union is a reserved SQL keyword.
|
||||||
put( "area", new SQLFunctionTemplate( StandardBasicTypes.DOUBLE, "?1.STArea()" ) );
|
// // (See also postgis documentation).
|
||||||
put( "centroid", new SqlServerMethod( "STCentroid" ) );
|
//
|
||||||
put(
|
// // portable spatial aggregate functions
|
||||||
"pointonsurface", new SqlServerMethod( "STPointOnSurface" )
|
// // no aggregatefunctions implemented in sql-server2000
|
||||||
);
|
// //put("extent", new SQLFunctionTemplate(geomType, "?1.STExtent()"));
|
||||||
|
//
|
||||||
// Register spatial filter function.
|
// // section 2.1.9.1 methods on surfaces
|
||||||
put( SpatialFunction.filter.name(), new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.Filter(?2)" ) );
|
// put( "area", new SQLFunctionTemplate( StandardBasicTypes.DOUBLE, "?1.STArea()" ) );
|
||||||
|
// put( "centroid", new SqlServerMethod( "STCentroid" ) );
|
||||||
|
// put(
|
||||||
|
// "pointonsurface", new SqlServerMethod( "STPointOnSurface" )
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// // Register spatial filter function.
|
||||||
|
// put( SpatialFunction.filter.name(), new SQLFunctionTemplate( StandardBasicTypes.BOOLEAN, "?1.Filter(?2)" ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ class SqlServerMethod extends StandardSQLFunction {
|
||||||
super( name );
|
super( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor sessionFactory) {
|
||||||
final StringBuilder buf = new StringBuilder();
|
final StringBuilder buf = new StringBuilder();
|
||||||
if ( arguments.size() < 1 ) {
|
if ( arguments.size() < 1 ) {
|
||||||
|
|
|
@ -10,7 +10,9 @@ import java.io.Serializable;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.boot.model.TypeContributions;
|
import org.hibernate.boot.model.TypeContributions;
|
||||||
import org.hibernate.dialect.function.SQLFunction;
|
|
||||||
|
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||||
|
import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
|
||||||
import org.hibernate.service.ServiceRegistry;
|
import org.hibernate.service.ServiceRegistry;
|
||||||
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
|
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
|
||||||
import org.hibernate.spatial.GeolatteGeometryType;
|
import org.hibernate.spatial.GeolatteGeometryType;
|
||||||
|
@ -27,7 +29,7 @@ class SqlServerSupport implements SpatialDialect, Serializable {
|
||||||
|
|
||||||
private SqlServerFunctions functions = new SqlServerFunctions();
|
private SqlServerFunctions functions = new SqlServerFunctions();
|
||||||
|
|
||||||
Iterable<? extends Map.Entry<String, SQLFunction>> functionsToRegister() {
|
Iterable<? extends Map.Entry<String, SqmFunctionDescriptor>> functionsToRegister() {
|
||||||
return functions;
|
return functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +42,7 @@ class SqlServerSupport implements SpatialDialect, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
||||||
final String stfunction;
|
final String stfunction;
|
||||||
switch ( spatialRelation ) {
|
switch ( spatialRelation ) {
|
||||||
|
@ -77,38 +79,38 @@ class SqlServerSupport implements SpatialDialect, Serializable {
|
||||||
return columnName + "." + stfunction + "(?) = 1";
|
return columnName + "." + stfunction + "(?) = 1";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialFilterExpression(String columnName) {
|
public String getSpatialFilterExpression(String columnName) {
|
||||||
return columnName + ".Filter(?) = 1";
|
return columnName + ".Filter(?) = 1";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||||
throw new UnsupportedOperationException( "No spatial aggregate SQL functions." );
|
throw new UnsupportedOperationException( "No spatial aggregate SQL functions." );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDWithinSQL(String columnName) {
|
public String getDWithinSQL(String columnName) {
|
||||||
throw new UnsupportedOperationException( "SQL Server has no DWithin function." );
|
throw new UnsupportedOperationException( "SQL Server has no DWithin function." );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getHavingSridSQL(String columnName) {
|
public String getHavingSridSQL(String columnName) {
|
||||||
return columnName + ".STSrid = (?)";
|
return columnName + ".STSrid = (?)";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||||
final String base = "(" + columnName + ".STIsEmpty() ";
|
final String base = "(" + columnName + ".STIsEmpty() ";
|
||||||
return isEmpty ? base + " = 1 )" : base + " = 0 )";
|
return isEmpty ? base + " = 1 )" : base + " = 0 )";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supportsFiltering() {
|
public boolean supportsFiltering() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(SpatialFunction function) {
|
public boolean supports(SpatialFunction function) {
|
||||||
return ( functions.get( function.toString() ) != null );
|
return ( functions.get( function.toString() ) != null );
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,20 +6,9 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.predicate;
|
package org.hibernate.spatial.predicate;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
|
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.query.criteria.internal.CriteriaBuilderImpl;
|
|
||||||
import org.hibernate.query.criteria.internal.ParameterRegistry;
|
|
||||||
import org.hibernate.query.criteria.internal.Renderable;
|
|
||||||
import org.hibernate.query.criteria.internal.compile.RenderingContext;
|
|
||||||
import org.hibernate.query.criteria.internal.predicate.AbstractSimplePredicate;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.dialect.WithCustomJPAFilter;
|
|
||||||
|
|
||||||
import org.geolatte.geom.Envelope;
|
import org.geolatte.geom.Envelope;
|
||||||
import org.geolatte.geom.Geometry;
|
import org.geolatte.geom.Geometry;
|
||||||
import org.geolatte.geom.Polygon;
|
import org.geolatte.geom.Polygon;
|
||||||
|
@ -31,7 +20,7 @@ import org.geolatte.geom.crs.CoordinateReferenceSystem;
|
||||||
/**
|
/**
|
||||||
* {@link JTSFilterPredicate}, but for geolatte-geom.
|
* {@link JTSFilterPredicate}, but for geolatte-geom.
|
||||||
*/
|
*/
|
||||||
public class GeolatteFilterPredicate extends AbstractSimplePredicate implements Serializable {
|
public class GeolatteFilterPredicate {
|
||||||
|
|
||||||
private final Expression<? extends Geometry> geometry;
|
private final Expression<? extends Geometry> geometry;
|
||||||
private final Expression<? extends Geometry> filter;
|
private final Expression<? extends Geometry> filter;
|
||||||
|
@ -39,7 +28,7 @@ public class GeolatteFilterPredicate extends AbstractSimplePredicate implements
|
||||||
public GeolatteFilterPredicate(
|
public GeolatteFilterPredicate(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
||||||
Expression<? extends Geometry> filter) {
|
Expression<? extends Geometry> filter) {
|
||||||
super( (CriteriaBuilderImpl) criteriaBuilder );
|
|
||||||
this.geometry = geometry;
|
this.geometry = geometry;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
}
|
}
|
||||||
|
@ -58,27 +47,27 @@ public class GeolatteFilterPredicate extends AbstractSimplePredicate implements
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public void registerParameters(ParameterRegistry registry) {
|
// public void registerParameters(ParameterRegistry registry) {
|
||||||
Helper.possibleParameter( geometry, registry );
|
// Helper.possibleParameter( geometry, registry );
|
||||||
Helper.possibleParameter( filter, registry );
|
// Helper.possibleParameter( filter, registry );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@Override
|
// @Override
|
||||||
public String render(boolean isNegated, RenderingContext renderingContext) {
|
// public String render(boolean isNegated, RenderingContext renderingContext) {
|
||||||
String geometryParameter = ( (Renderable) geometry ).render( renderingContext );
|
// String geometryParameter = ( (Renderable) geometry ).render( renderingContext );
|
||||||
String filterParameter = ( (Renderable) filter ).render( renderingContext );
|
// String filterParameter = ( (Renderable) filter ).render( renderingContext );
|
||||||
Dialect dialect = renderingContext.getDialect();
|
// Dialect dialect = renderingContext.getDialect();
|
||||||
if ( !( dialect instanceof SpatialDialect ) ) {
|
// if ( !( dialect instanceof SpatialDialect ) ) {
|
||||||
throw new IllegalStateException( "Dialect must be spatially enabled dialect" );
|
// throw new IllegalStateException( "Dialect must be spatially enabled dialect" );
|
||||||
}
|
// }
|
||||||
if ( dialect instanceof WithCustomJPAFilter ) {
|
// if ( dialect instanceof WithCustomJPAFilter ) {
|
||||||
return ( (WithCustomJPAFilter) dialect ).filterExpression( geometryParameter, filterParameter );
|
// return ( (WithCustomJPAFilter) dialect ).filterExpression( geometryParameter, filterParameter );
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
return SpatialFunction.filter.name() + "(" + geometryParameter + ", " + filterParameter + ") = true";
|
// return SpatialFunction.filter.name() + "(" + geometryParameter + ", " + filterParameter + ") = true";
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
private static <P extends Position> Polygon<P> fromEnvelope(Envelope<P> envelope) {
|
private static <P extends Position> Polygon<P> fromEnvelope(Envelope<P> envelope) {
|
||||||
CoordinateReferenceSystem<P> crs = envelope.getCoordinateReferenceSystem();
|
CoordinateReferenceSystem<P> crs = envelope.getCoordinateReferenceSystem();
|
||||||
|
|
|
@ -42,7 +42,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.equals.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.equals.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return eq( criteriaBuilder, geometry1,
|
return eq( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.within.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.within.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return within( criteriaBuilder, geometry1,
|
return within( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.contains.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.contains.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -144,7 +144,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return contains( criteriaBuilder, geometry1,
|
return contains( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.crosses.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.crosses.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return crosses( criteriaBuilder, geometry1,
|
return crosses( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.disjoint.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.disjoint.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -226,7 +226,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return disjoint( criteriaBuilder, geometry1,
|
return disjoint( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.intersects.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.intersects.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -267,7 +267,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return intersects( criteriaBuilder, geometry1,
|
return intersects( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -288,7 +288,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.overlaps.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.overlaps.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -308,7 +308,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return overlaps( criteriaBuilder, geometry1,
|
return overlaps( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.touches.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.touches.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -349,7 +349,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return touches( criteriaBuilder, geometry1,
|
return touches( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,44 +368,54 @@ public class GeolatteSpatialPredicates {
|
||||||
public static Predicate filter(
|
public static Predicate filter(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Expression<? extends Geometry> geometry2) {
|
Expression<? extends Geometry> geometry2) {
|
||||||
return new GeolatteFilterPredicate( criteriaBuilder, geometry1, geometry2 );
|
return booleanExpressionToPredicate(
|
||||||
|
criteriaBuilder,
|
||||||
|
criteriaBuilder.function( SpatialFunction.filter.toString(), boolean.class,
|
||||||
|
geometry1, geometry2
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Create a predicate for testing the arguments for bounding box overlap constraint.
|
// * Create a predicate for testing the arguments for bounding box overlap constraint.
|
||||||
*
|
// *
|
||||||
* @param criteriaBuilder CriteriaBuilder
|
// * @param criteriaBuilder CriteriaBuilder
|
||||||
* @param geometry1 geometry expression
|
// * @param geometry1 geometry expression
|
||||||
* @param geometry2 geometry value whose bounding box to use in the comparison
|
// * @param geometry2 geometry value whose bounding box to use in the comparison
|
||||||
*
|
// *
|
||||||
* @return bounding box overlap predicate
|
// * @return bounding box overlap predicate
|
||||||
*
|
// *
|
||||||
* @see GeolatteFilterPredicate
|
// * @see GeolatteFilterPredicate
|
||||||
* @see JTSSpatialPredicates#filter(CriteriaBuilder, Expression, org.locationtech.jts.geom.Geometry)
|
// * @see JTSSpatialPredicates#filter(CriteriaBuilder, Expression, org.locationtech.jts.geom.Geometry)
|
||||||
*/
|
// */
|
||||||
public static Predicate filter(
|
// public static Predicate filter(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
// CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
// Geometry geometry2) {
|
||||||
return new GeolatteFilterPredicate( criteriaBuilder, geometry1, geometry2 );
|
// return booleanExpressionToPredicate(
|
||||||
}
|
// criteriaBuilder,
|
||||||
|
// criteriaBuilder.function( SpatialFunction.filter.toString(), Geometry.class,
|
||||||
/**
|
// geometry1, geometry2
|
||||||
* Create a predicate for testing the arguments for bounding box overlap constraint.
|
// )
|
||||||
*
|
// );
|
||||||
* @param criteriaBuilder CriteriaBuilder
|
// }
|
||||||
* @param geometry geometry expression
|
//
|
||||||
* @param envelope envelope or bounding box to use in the comparison
|
// /**
|
||||||
*
|
// * Create a predicate for testing the arguments for bounding box overlap constraint.
|
||||||
* @return bounding box overlap predicate
|
// *
|
||||||
*
|
// * @param criteriaBuilder CriteriaBuilder
|
||||||
* @see GeolatteFilterPredicate
|
// * @param geometry geometry expression
|
||||||
* @see JTSSpatialPredicates#filterByPolygon(CriteriaBuilder, Expression, org.locationtech.jts.geom.Envelope, int)
|
// * @param envelope envelope or bounding box to use in the comparison
|
||||||
*/
|
// *
|
||||||
public static Predicate filterByPolygon(
|
// * @return bounding box overlap predicate
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
// *
|
||||||
Envelope envelope) {
|
// * @see GeolatteFilterPredicate
|
||||||
return new GeolatteFilterPredicate( criteriaBuilder, geometry, envelope );
|
// * @see JTSSpatialPredicates#filterByPolygon(CriteriaBuilder, Expression, org.locationtech.jts.geom.Envelope, int)
|
||||||
}
|
// */
|
||||||
|
// public static Predicate filterByPolygon(
|
||||||
|
// CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
||||||
|
// Envelope envelope) {
|
||||||
|
// return new GeolatteFilterPredicate( criteriaBuilder, geometry, envelope );
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a predicate for testing the arguments for "distance within" constraint.
|
* Create a predicate for testing the arguments for "distance within" constraint.
|
||||||
|
@ -425,7 +435,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.dwithin.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.dwithin.toString(), boolean.class,
|
||||||
geometry1, geometry2, distance
|
geometry1, geometry2, distance
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -446,7 +456,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2, Expression<Double> distance) {
|
Geometry geometry2, Expression<Double> distance) {
|
||||||
return distanceWithin( criteriaBuilder, geometry1,
|
return distanceWithin( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 ), distance
|
criteriaBuilder.literal( geometry2 ), distance
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -466,7 +476,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2, double distance) {
|
Geometry geometry2, double distance) {
|
||||||
return distanceWithin( criteriaBuilder, geometry1,
|
return distanceWithin( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 ), criteriaBuilder.literal( distance )
|
criteriaBuilder.literal( geometry2 ), criteriaBuilder.literal( distance )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,7 +496,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Expression<? extends Geometry> geometry2, double distance) {
|
Expression<? extends Geometry> geometry2, double distance) {
|
||||||
return distanceWithin( criteriaBuilder, geometry1, geometry2,
|
return distanceWithin( criteriaBuilder, geometry1, geometry2,
|
||||||
criteriaBuilder.literal( distance )
|
criteriaBuilder.literal( distance )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -525,7 +535,7 @@ public class GeolatteSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
||||||
int srid) {
|
int srid) {
|
||||||
return havingSRID( criteriaBuilder, geometry,
|
return havingSRID( criteriaBuilder, geometry,
|
||||||
criteriaBuilder.literal( srid )
|
criteriaBuilder.literal( srid )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,7 +553,7 @@ public class GeolatteSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.isempty.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.isempty.toString(), boolean.class,
|
||||||
geometry
|
geometry
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,75 +6,27 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.spatial.predicate;
|
package org.hibernate.spatial.predicate;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
import javax.persistence.criteria.Predicate;
|
import javax.persistence.criteria.Predicate;
|
||||||
|
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
import org.hibernate.query.criteria.internal.CriteriaBuilderImpl;
|
import org.hibernate.query.sqm.NodeBuilder;
|
||||||
import org.hibernate.query.criteria.internal.ParameterRegistry;
|
import org.hibernate.query.sqm.SemanticQueryWalker;
|
||||||
import org.hibernate.query.criteria.internal.Renderable;
|
import org.hibernate.query.sqm.tree.predicate.AbstractNegatableSqmPredicate;
|
||||||
import org.hibernate.query.criteria.internal.compile.RenderingContext;
|
|
||||||
import org.hibernate.query.criteria.internal.predicate.AbstractSimplePredicate;
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
import org.hibernate.spatial.criterion.SpatialFilter;
|
|
||||||
import org.hibernate.spatial.dialect.WithCustomJPAFilter;
|
|
||||||
import org.hibernate.spatial.jts.EnvelopeAdapter;
|
import org.hibernate.spatial.jts.EnvelopeAdapter;
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Envelope;
|
import org.locationtech.jts.geom.Envelope;
|
||||||
import org.locationtech.jts.geom.Geometry;
|
import org.locationtech.jts.geom.Geometry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JPA Criteria API {@link Predicate} equivalent of {@link SpatialFilter}.
|
* JPA Spatial Filter {@link Predicate}
|
||||||
*/
|
*/
|
||||||
public class JTSFilterPredicate extends AbstractSimplePredicate implements Serializable {
|
class JTSFilterPredicate {
|
||||||
|
|
||||||
private final Expression<? extends Geometry> geometry;
|
private Expression<?> geometry;
|
||||||
private final Expression<? extends Geometry> filter;
|
private Expression<?> filter;
|
||||||
|
|
||||||
public JTSFilterPredicate(
|
//require to completely re-implement
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
|
||||||
Expression<? extends Geometry> filter) {
|
|
||||||
super( (CriteriaBuilderImpl) criteriaBuilder );
|
|
||||||
this.geometry = geometry;
|
|
||||||
this.filter = filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JTSFilterPredicate(
|
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
|
||||||
Geometry filter) {
|
|
||||||
this( criteriaBuilder, geometry, criteriaBuilder.literal( filter )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JTSFilterPredicate(
|
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
|
||||||
Envelope envelope, int srid) {
|
|
||||||
this( criteriaBuilder, geometry, EnvelopeAdapter.toPolygon( envelope, srid )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerParameters(ParameterRegistry registry) {
|
|
||||||
Helper.possibleParameter( geometry, registry );
|
|
||||||
Helper.possibleParameter( filter, registry );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String render(boolean isNegated, RenderingContext renderingContext) {
|
|
||||||
String geometryParameter = ( (Renderable) geometry ).render( renderingContext );
|
|
||||||
String filterParameter = ( (Renderable) filter ).render( renderingContext );
|
|
||||||
Dialect dialect = renderingContext.getDialect();
|
|
||||||
if ( !( dialect instanceof SpatialDialect ) ) {
|
|
||||||
throw new IllegalStateException( "Dialect must be spatially enabled dialect" );
|
|
||||||
}
|
|
||||||
if ( dialect instanceof WithCustomJPAFilter ) {
|
|
||||||
return ( (WithCustomJPAFilter) dialect ).filterExpression( geometryParameter, filterParameter );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return SpatialFunction.filter.name() + "(" + geometryParameter + ", " + filterParameter + ") = true";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,8 @@ import javax.persistence.criteria.CriteriaBuilder;
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
import javax.persistence.criteria.Predicate;
|
import javax.persistence.criteria.Predicate;
|
||||||
|
|
||||||
|
import org.hibernate.query.sqm.NodeBuilder;
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
import org.hibernate.spatial.SpatialFunction;
|
||||||
import org.hibernate.spatial.criterion.SpatialRestrictions;
|
|
||||||
|
|
||||||
import org.locationtech.jts.geom.Envelope;
|
import org.locationtech.jts.geom.Envelope;
|
||||||
import org.locationtech.jts.geom.Geometry;
|
import org.locationtech.jts.geom.Geometry;
|
||||||
|
@ -20,7 +20,6 @@ import org.locationtech.jts.geom.Geometry;
|
||||||
* A factory for spatial JPA Criteria API {@link Predicate}s.
|
* A factory for spatial JPA Criteria API {@link Predicate}s.
|
||||||
*
|
*
|
||||||
* @author Daniel Shuy
|
* @author Daniel Shuy
|
||||||
* @see SpatialRestrictions
|
|
||||||
*/
|
*/
|
||||||
public class JTSSpatialPredicates {
|
public class JTSSpatialPredicates {
|
||||||
|
|
||||||
|
@ -35,17 +34,13 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially equal" predicate
|
* @return "spatially equal" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#eq(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate eq(
|
public static Predicate eq(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Expression<? extends Geometry> geometry2) {
|
Expression<? extends Geometry> geometry2) {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.equals.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.equals.toString(), boolean.class, geometry1, geometry2 )
|
||||||
geometry1, geometry2
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,9 +58,7 @@ public class JTSSpatialPredicates {
|
||||||
public static Predicate eq(
|
public static Predicate eq(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return eq( criteriaBuilder, geometry1,
|
return eq( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) );
|
||||||
criteriaBuilder.literal( geometry2 )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -76,17 +69,13 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially within" predicate
|
* @return "spatially within" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#within(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate within(
|
public static Predicate within(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Expression<? extends Geometry> geometry2) {
|
Expression<? extends Geometry> geometry2) {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.within.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.within.toString(), boolean.class, geometry1, geometry2 )
|
||||||
geometry1, geometry2
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,9 +93,7 @@ public class JTSSpatialPredicates {
|
||||||
public static Predicate within(
|
public static Predicate within(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return within( criteriaBuilder, geometry1,
|
return within( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) );
|
||||||
criteriaBuilder.literal( geometry2 )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,8 +104,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially contains" predicate
|
* @return "spatially contains" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#contains(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate contains(
|
public static Predicate contains(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -126,7 +111,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.contains.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.contains.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -146,7 +131,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return contains( criteriaBuilder, geometry1,
|
return contains( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,8 +143,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially crosses" predicate
|
* @return "spatially crosses" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#crosses(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate crosses(
|
public static Predicate crosses(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -167,7 +150,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.crosses.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.crosses.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -187,7 +170,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return crosses( criteriaBuilder, geometry1,
|
return crosses( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,8 +182,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially disjoint" predicate
|
* @return "spatially disjoint" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#disjoint(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate disjoint(
|
public static Predicate disjoint(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -208,7 +189,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.disjoint.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.disjoint.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -228,7 +209,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return disjoint( criteriaBuilder, geometry1,
|
return disjoint( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,8 +221,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially intersects" predicate
|
* @return "spatially intersects" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#intersects(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate intersects(
|
public static Predicate intersects(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -249,7 +228,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.intersects.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.intersects.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -269,7 +248,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return intersects( criteriaBuilder, geometry1,
|
return intersects( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,8 +260,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially overlaps" predicate
|
* @return "spatially overlaps" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#overlaps(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate overlaps(
|
public static Predicate overlaps(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -290,7 +267,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.overlaps.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.overlaps.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -310,7 +287,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return overlaps( criteriaBuilder, geometry1,
|
return overlaps( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,8 +299,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry2 geometry expression
|
* @param geometry2 geometry expression
|
||||||
*
|
*
|
||||||
* @return "spatially touches" predicate
|
* @return "spatially touches" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#touches(String, Geometry)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate touches(
|
public static Predicate touches(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -331,7 +306,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.touches.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.touches.toString(), boolean.class,
|
||||||
geometry1, geometry2
|
geometry1, geometry2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -345,70 +320,72 @@ public class JTSSpatialPredicates {
|
||||||
*
|
*
|
||||||
* @return "spatially touches" predicate
|
* @return "spatially touches" predicate
|
||||||
*
|
*
|
||||||
* @see #touches(CriteriaBuilder, Expression, Expression)
|
* @return "spatially touches" predicate
|
||||||
*/
|
*/
|
||||||
public static Predicate touches(
|
public static Predicate touches(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2) {
|
Geometry geometry2) {
|
||||||
return touches( criteriaBuilder, geometry1,
|
return touches( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 )
|
criteriaBuilder.literal( geometry2 )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Create a predicate for testing the arguments for bounding box overlap constraint.
|
// * Create a predicate for testing the arguments for bounding box overlap constraint.
|
||||||
*
|
// *
|
||||||
* @param criteriaBuilder CriteriaBuilder
|
// * @param nodeBuilder NodeBuilder
|
||||||
* @param geometry1 geometry expression
|
// * @param geometry1 geometry expression
|
||||||
* @param geometry2 geometry expression whose bounding box to use in the comparison
|
// * @param geometry2 geometry expression whose bounding box to use in the comparison
|
||||||
*
|
// *
|
||||||
* @return bounding box overlap predicate
|
// * @return bounding box overlap predicate
|
||||||
*
|
// *
|
||||||
* @see JTSFilterPredicate
|
// * @see JTSFilterPredicate
|
||||||
* @see SpatialRestrictions#filter(String, Geometry)
|
// */
|
||||||
*/
|
// public static Predicate filter(
|
||||||
public static Predicate filter(
|
// NodeBuilder nodeBuilder, Expression<? extends Geometry> geometry1,
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
// Expression<? extends Geometry> geometry2) {
|
||||||
Expression<? extends Geometry> geometry2) {
|
// return booleanExpressionToPredicate(
|
||||||
return new JTSFilterPredicate( criteriaBuilder, geometry1, geometry2 );
|
// nodeBuilder,
|
||||||
}
|
// nodeBuilder.function( SpatialFunction.filter.toString(), boolean.class,
|
||||||
|
// geometry1, geometry2
|
||||||
|
// )
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Create a predicate for testing the arguments for bounding box overlap constraint.
|
// * Create a predicate for testing the arguments for bounding box overlap constraint.
|
||||||
*
|
// *
|
||||||
* @param criteriaBuilder CriteriaBuilder
|
// * @param nodeBuilder NodeBuilder
|
||||||
* @param geometry1 geometry expression
|
// * @param geometry1 geometry expression
|
||||||
* @param geometry2 geometry value whose bounding box to use in the comparison
|
// * @param geometry2 geometry value whose bounding box to use in the comparison
|
||||||
*
|
// *
|
||||||
* @return bounding box overlap predicate
|
// * @return bounding box overlap predicate
|
||||||
*
|
// *
|
||||||
* @see JTSFilterPredicate
|
// * @see JTSFilterPredicate*
|
||||||
* @see SpatialRestrictions#filter(String, Geometry)
|
// */
|
||||||
*/
|
// public static Predicate filter(
|
||||||
public static Predicate filter(
|
// NodeBuilder nodeBuilder, Expression<? extends Geometry> geometry1,
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
// Geometry geometry2) {
|
||||||
Geometry geometry2) {
|
// return new JTSFilterPredicate( nodeBuilder, geometry1, geometry2 );
|
||||||
return new JTSFilterPredicate( criteriaBuilder, geometry1, geometry2 );
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Create a predicate for testing the arguments for bounding box overlap constraint.
|
// * Create a predicate for testing the arguments for bounding box overlap constraint.
|
||||||
*
|
// *
|
||||||
* @param criteriaBuilder CriteriaBuilder
|
// * @param nodeBuilder CriteriaBuilder
|
||||||
* @param geometry geometry expression
|
// * @param geometry geometry expression
|
||||||
* @param envelope envelope or bounding box to use in the comparison
|
// * @param envelope envelope or bounding box to use in the comparison
|
||||||
* @param srid the SRID of the bounding box
|
// * @param srid the SRID of the bounding box
|
||||||
*
|
// *
|
||||||
* @return bounding box overlap predicate
|
// * @return bounding box overlap predicate
|
||||||
*
|
// *
|
||||||
* @see JTSFilterPredicate
|
// * @see JTSFilterPredicate
|
||||||
* @see SpatialRestrictions#filter(String, Envelope, int)
|
// */
|
||||||
*/
|
// public static Predicate filterByPolygon(
|
||||||
public static Predicate filterByPolygon(
|
// NodeBuilder nodeBuilder, Expression<? extends Geometry> geometry,
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
// Envelope envelope, int srid) {
|
||||||
Envelope envelope, int srid) {
|
// return new JTSFilterPredicate( nodeBuilder, geometry, envelope, srid );
|
||||||
return new JTSFilterPredicate( criteriaBuilder, geometry, envelope, srid );
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a predicate for testing the arguments for "distance within" constraint.
|
* Create a predicate for testing the arguments for "distance within" constraint.
|
||||||
|
@ -419,8 +396,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param distance distance expression
|
* @param distance distance expression
|
||||||
*
|
*
|
||||||
* @return "distance within" predicate
|
* @return "distance within" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#distanceWithin(String, Geometry, double)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate distanceWithin(
|
public static Predicate distanceWithin(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
|
@ -428,7 +403,7 @@ public class JTSSpatialPredicates {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.dwithin.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.dwithin.toString(), boolean.class,
|
||||||
geometry1, geometry2, distance
|
geometry1, geometry2, distance
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -449,7 +424,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2, Expression<Double> distance) {
|
Geometry geometry2, Expression<Double> distance) {
|
||||||
return distanceWithin( criteriaBuilder, geometry1,
|
return distanceWithin( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 ), distance
|
criteriaBuilder.literal( geometry2 ), distance
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +444,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Geometry geometry2, double distance) {
|
Geometry geometry2, double distance) {
|
||||||
return distanceWithin( criteriaBuilder, geometry1,
|
return distanceWithin( criteriaBuilder, geometry1,
|
||||||
criteriaBuilder.literal( geometry2 ), criteriaBuilder.literal( distance )
|
criteriaBuilder.literal( geometry2 ), criteriaBuilder.literal( distance )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,7 +464,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
|
||||||
Expression<? extends Geometry> geometry2, double distance) {
|
Expression<? extends Geometry> geometry2, double distance) {
|
||||||
return distanceWithin( criteriaBuilder, geometry1, geometry2,
|
return distanceWithin( criteriaBuilder, geometry1, geometry2,
|
||||||
criteriaBuilder.literal( distance )
|
criteriaBuilder.literal( distance )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,8 +476,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param srid SRID expression
|
* @param srid SRID expression
|
||||||
*
|
*
|
||||||
* @return "having srid" predicate
|
* @return "having srid" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#havingSRID(String, int)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate havingSRID(
|
public static Predicate havingSRID(
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
||||||
|
@ -528,7 +501,7 @@ public class JTSSpatialPredicates {
|
||||||
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
|
||||||
int srid) {
|
int srid) {
|
||||||
return havingSRID( criteriaBuilder, geometry,
|
return havingSRID( criteriaBuilder, geometry,
|
||||||
criteriaBuilder.literal( srid )
|
criteriaBuilder.literal( srid )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -539,14 +512,12 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry geometry expression
|
* @param geometry geometry expression
|
||||||
*
|
*
|
||||||
* @return "is empty" predicate
|
* @return "is empty" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#isEmpty(String)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate isEmpty(CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry) {
|
public static Predicate isEmpty(CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry) {
|
||||||
return booleanExpressionToPredicate(
|
return booleanExpressionToPredicate(
|
||||||
criteriaBuilder,
|
criteriaBuilder,
|
||||||
criteriaBuilder.function( SpatialFunction.isempty.toString(), boolean.class,
|
criteriaBuilder.function( SpatialFunction.isempty.toString(), boolean.class,
|
||||||
geometry
|
geometry
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -558,8 +529,6 @@ public class JTSSpatialPredicates {
|
||||||
* @param geometry geometry expression
|
* @param geometry geometry expression
|
||||||
*
|
*
|
||||||
* @return "is not empty" predicate
|
* @return "is not empty" predicate
|
||||||
*
|
|
||||||
* @see SpatialRestrictions#isNotEmpty(String)
|
|
||||||
*/
|
*/
|
||||||
public static Predicate isNotEmpty(CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry) {
|
public static Predicate isNotEmpty(CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry) {
|
||||||
return isEmpty( criteriaBuilder, geometry )
|
return isEmpty( criteriaBuilder, geometry )
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.spatial.predicate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link JTSSpatialPredicates} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public class SpatialPredicates extends JTSSpatialPredicates {
|
|
||||||
|
|
||||||
protected SpatialPredicates() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.hibernate.spatial.dialect.postgis;
|
|
||||||
|
|
||||||
import org.hibernate.spatial.SpatialDialect;
|
|
||||||
import org.hibernate.spatial.SpatialFunction;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests support for
|
|
||||||
*
|
|
||||||
* @author Karel Maesen, Geovise BVBA
|
|
||||||
* creation-date: 1/19/11
|
|
||||||
*/
|
|
||||||
public class PostgisDialectTest extends TestCase {
|
|
||||||
|
|
||||||
SpatialDialect dialect = new PostgisDialect();
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSupports() throws Exception {
|
|
||||||
for ( SpatialFunction sf : SpatialFunction.values() ) {
|
|
||||||
assertTrue( "Dialect doesn't support " + sf, dialect.supports( sf ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,10 +14,12 @@ import java.util.Map;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.query.Query;
|
||||||
|
import org.hibernate.query.criteria.JpaCriteriaQuery;
|
||||||
import org.hibernate.spatial.integration.geolatte.GeomEntity;
|
import org.hibernate.spatial.integration.geolatte.GeomEntity;
|
||||||
import org.hibernate.spatial.testing.GeometryEquality;
|
import org.hibernate.spatial.testing.GeometryEquality;
|
||||||
import org.hibernate.spatial.testing.SpatialFunctionalTestCase;
|
import org.hibernate.spatial.testing.SpatialFunctionalTestCase;
|
||||||
import org.hibernate.spatial.testing.TestDataElement;
|
import org.hibernate.spatial.testing.datareader.TestDataElement;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -168,8 +170,9 @@ public abstract class AbstractTestStoreRetrieve<G, E extends GeomEntityLike<G>>
|
||||||
try {
|
try {
|
||||||
session = openSession();
|
session = openSession();
|
||||||
tx = session.beginTransaction();
|
tx = session.beginTransaction();
|
||||||
Criteria criteria = session.createCriteria( GeomEntity.class );
|
JpaCriteriaQuery<GeomEntity> criteria = session.getCriteriaBuilder().createQuery( GeomEntity.class );
|
||||||
List<GeomEntity> retrieved = criteria.list();
|
Query<GeomEntity> query = session.createQuery( criteria );
|
||||||
|
List<GeomEntity> retrieved = query.list();
|
||||||
assertEquals( "Expected exactly one result", 1, retrieved.size() );
|
assertEquals( "Expected exactly one result", 1, retrieved.size() );
|
||||||
GeomEntity entity = retrieved.get( 0 );
|
GeomEntity entity = retrieved.get( 0 );
|
||||||
assertNull( entity.getGeom() );
|
assertNull( entity.getGeom() );
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue