HHH-14808 SpatialPredicates use value() method for literal expressions

This commit is contained in:
Karel Maesen 2021-09-20 21:02:46 +02:00
parent 9de428ac1a
commit b88596df6a
7 changed files with 193 additions and 67 deletions

View File

@ -20,6 +20,7 @@ import org.geolatte.geom.crs.CoordinateReferenceSystem;
/** /**
* {@link JTSFilterPredicate}, but for geolatte-geom. * {@link JTSFilterPredicate}, but for geolatte-geom.
*/ */
//TODO update class to H6
public class GeolatteFilterPredicate { public class GeolatteFilterPredicate {
private final Expression<? extends Geometry> geometry; private final Expression<? extends Geometry> geometry;

View File

@ -10,6 +10,7 @@ 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.criteria.HibernateCriteriaBuilder;
import org.hibernate.spatial.SpatialFunction; import org.hibernate.spatial.SpatialFunction;
import org.geolatte.geom.Geometry; import org.geolatte.geom.Geometry;
@ -28,6 +29,7 @@ import static org.hibernate.spatial.CommonSpatialFunction.ST_WITHIN;
* *
* @author Daniel Shuy * @author Daniel Shuy
*/ */
@SuppressWarnings("rawtypes")
public class GeolatteSpatialPredicates { public class GeolatteSpatialPredicates {
protected GeolatteSpatialPredicates() { protected GeolatteSpatialPredicates() {
@ -68,7 +70,8 @@ public class GeolatteSpatialPredicates {
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, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return eq( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -106,7 +109,8 @@ public class GeolatteSpatialPredicates {
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, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return within( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -145,7 +149,8 @@ public class GeolatteSpatialPredicates {
public static Predicate contains( public static Predicate contains(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return contains( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return contains( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -184,8 +189,8 @@ public class GeolatteSpatialPredicates {
public static Predicate crosses( public static Predicate crosses(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return crosses( criteriaBuilder, geometry1, HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
criteriaBuilder.literal( geometry2 ) return crosses( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -223,7 +228,8 @@ public class GeolatteSpatialPredicates {
public static Predicate disjoint( public static Predicate disjoint(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return disjoint( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return disjoint( cb, geometry1, cb.value( geometry2 ) );
} }
/** /**
@ -260,7 +266,8 @@ public class GeolatteSpatialPredicates {
public static Predicate intersects( public static Predicate intersects(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return intersects( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return intersects( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -298,7 +305,8 @@ public class GeolatteSpatialPredicates {
public static Predicate overlaps( public static Predicate overlaps(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return overlaps( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return overlaps( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -336,7 +344,8 @@ public class GeolatteSpatialPredicates {
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, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return touches( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -349,8 +358,6 @@ public class GeolatteSpatialPredicates {
* *
* @return bounding box overlap predicate * @return bounding box overlap predicate
* *
* @see GeolatteFilterPredicate
* @see JTSSpatialPredicates#filter(CriteriaBuilder, Expression, Expression)
*/ */
public static Predicate filter( public static Predicate filter(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
@ -444,7 +451,8 @@ public class GeolatteSpatialPredicates {
public static Predicate distanceWithin( public static Predicate distanceWithin(
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, criteriaBuilder.literal( geometry2 ), distance HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return distanceWithin( cb, geometry1, cb.value( geometry2 ), distance
); );
} }
@ -463,11 +471,12 @@ public class GeolatteSpatialPredicates {
public static Predicate distanceWithin( public static Predicate distanceWithin(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2, double distance) { Geometry geometry2, double distance) {
HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return distanceWithin( return distanceWithin(
criteriaBuilder, cb,
geometry1, geometry1,
criteriaBuilder.literal( geometry2 ), cb.value( geometry2 ),
criteriaBuilder.literal( distance ) cb.value( distance )
); );
} }
@ -486,7 +495,8 @@ public class GeolatteSpatialPredicates {
public static Predicate distanceWithin( public static Predicate distanceWithin(
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, criteriaBuilder.literal( distance ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return distanceWithin( cb, geometry1, geometry2, cb.value( distance )
); );
} }
@ -524,7 +534,8 @@ public class GeolatteSpatialPredicates {
public static Predicate havingSRID( public static Predicate havingSRID(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
int srid) { int srid) {
return havingSRID( criteriaBuilder, geometry, criteriaBuilder.literal( srid ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return havingSRID( cb, geometry, cb.value( srid ) );
} }
/** /**

View File

@ -10,6 +10,7 @@ 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.criteria.HibernateCriteriaBuilder;
import org.hibernate.spatial.SpatialFunction; import org.hibernate.spatial.SpatialFunction;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
@ -65,7 +66,8 @@ 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, criteriaBuilder.literal( geometry2 ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return eq( cb, geometry1, cb.value( geometry2 ) );
} }
/** /**
@ -100,7 +102,8 @@ 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, criteriaBuilder.literal( geometry2 ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return within( cb, geometry1, cb.value( geometry2 ) );
} }
/** /**
@ -135,7 +138,8 @@ public class JTSSpatialPredicates {
public static Predicate contains( public static Predicate contains(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return contains( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return contains( cb, geometry1, cb.value( geometry2 ) );
} }
/** /**
@ -170,8 +174,9 @@ public class JTSSpatialPredicates {
public static Predicate crosses( public static Predicate crosses(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return crosses( criteriaBuilder, geometry1, HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
criteriaBuilder.literal( geometry2 ) return crosses( cb, geometry1,
cb.value( geometry2 )
); );
} }
@ -207,7 +212,8 @@ public class JTSSpatialPredicates {
public static Predicate disjoint( public static Predicate disjoint(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return disjoint( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return disjoint( cb, geometry1, cb.value( geometry2 ) );
} }
/** /**
@ -242,7 +248,8 @@ public class JTSSpatialPredicates {
public static Predicate intersects( public static Predicate intersects(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return intersects( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return intersects( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -279,7 +286,8 @@ public class JTSSpatialPredicates {
public static Predicate overlaps( public static Predicate overlaps(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2) { Geometry geometry2) {
return overlaps( criteriaBuilder, geometry1, criteriaBuilder.literal( geometry2 ) HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return overlaps( cb, geometry1, cb.value( geometry2 )
); );
} }
@ -309,13 +317,12 @@ public class JTSSpatialPredicates {
* @param geometry2 geometry value * @param geometry2 geometry value
* *
* @return "spatially touches" predicate * @return "spatially touches" predicate
*
* @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, criteriaBuilder.literal( geometry2 ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return touches( cb, geometry1, cb.value( geometry2 ) );
} }
@ -416,7 +423,8 @@ public class JTSSpatialPredicates {
public static Predicate distanceWithin( public static Predicate distanceWithin(
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, criteriaBuilder.literal( geometry2 ), distance ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return distanceWithin( cb, geometry1, cb.value( geometry2 ), distance );
} }
/** /**
@ -434,11 +442,12 @@ public class JTSSpatialPredicates {
public static Predicate distanceWithin( public static Predicate distanceWithin(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry1,
Geometry geometry2, double distance) { Geometry geometry2, double distance) {
HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return distanceWithin( return distanceWithin(
criteriaBuilder, criteriaBuilder,
geometry1, geometry1,
criteriaBuilder.literal( geometry2 ), cb.value( geometry2 ),
criteriaBuilder.literal( distance ) cb.value( distance )
); );
} }
@ -457,7 +466,8 @@ public class JTSSpatialPredicates {
public static Predicate distanceWithin( public static Predicate distanceWithin(
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, criteriaBuilder.literal( distance ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return distanceWithin( cb, geometry1, geometry2, cb.value( distance ) );
} }
/** /**
@ -492,7 +502,8 @@ public class JTSSpatialPredicates {
public static Predicate havingSRID( public static Predicate havingSRID(
CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry, CriteriaBuilder criteriaBuilder, Expression<? extends Geometry> geometry,
int srid) { int srid) {
return havingSRID( criteriaBuilder, geometry, criteriaBuilder.literal( srid ) ); HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
return havingSRID( criteriaBuilder, geometry, cb.value( srid ) );
} }
/** /**

View File

@ -21,13 +21,11 @@ import org.hibernate.spatial.integration.Model;
import org.hibernate.spatial.predicate.GeolatteSpatialPredicates; import org.hibernate.spatial.predicate.GeolatteSpatialPredicates;
import org.hibernate.spatial.predicate.JTSSpatialPredicates; import org.hibernate.spatial.predicate.JTSSpatialPredicates;
import org.hibernate.spatial.testing.HSReflectionUtil; import org.hibernate.spatial.testing.HSReflectionUtil;
import org.hibernate.spatial.testing.IsSupportedBySpatial;
import org.hibernate.spatial.testing.SpatialTestBase; import org.hibernate.spatial.testing.SpatialTestBase;
import org.hibernate.spatial.testing.datareader.TestSupport; import org.hibernate.spatial.testing.datareader.TestSupport;
import org.hibernate.spatial.testing.dialects.PredicateRegexes;
import org.hibernate.testing.jdbc.SQLStatementInspector; import org.hibernate.testing.jdbc.SQLStatementInspector;
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.Executable; import org.junit.jupiter.api.function.Executable;
@ -43,9 +41,7 @@ import static org.geolatte.geom.crs.CoordinateReferenceSystems.WGS84;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
@RequiresDialectFeature(feature = IsSupportedBySpatial.class) abstract public class SpatialPredicatesTest extends SpatialTestBase {
@SessionFactory
public class GeolatteSpatialPredicatesTest extends SpatialTestBase {
public final static TestSupport.TestDataPurpose PURPOSE = TestSupport.TestDataPurpose.SpatialFunctionsData; public final static TestSupport.TestDataPurpose PURPOSE = TestSupport.TestDataPurpose.SpatialFunctionsData;
@ -59,13 +55,15 @@ public class GeolatteSpatialPredicatesTest extends SpatialTestBase {
return PURPOSE; return PURPOSE;
} }
abstract public Stream<PredicateRegexes.PredicateRegex> getTestRegexes();
@TestFactory @TestFactory
public Stream<DynamicTest> testFactory() { public Stream<DynamicTest> testFactory() {
return return
predicateRegexes.all() getTestRegexes()
.flatMap( entry -> Stream.of( .flatMap( rp -> Stream.of(
new Args( entry.getKey(), entry.getValue(), Model.GLMODEL ), new Args( rp.predicate, rp.regex, Model.GLMODEL ),
new Args( entry.getKey(), entry.getValue(), Model.JTSMODEL ) new Args( rp.predicate, rp.regex, Model.JTSMODEL )
) ) ) )
.map( args -> DynamicTest.dynamicTest( .map( args -> DynamicTest.dynamicTest(
displayName( args ), displayName( args ),
@ -92,8 +90,11 @@ public class GeolatteSpatialPredicatesTest extends SpatialTestBase {
String stmt = inspector.getSqlQueries() String stmt = inspector.getSqlQueries()
.get( 0 ) .get( 0 )
.toLowerCase( Locale.ROOT ); .toLowerCase( Locale.ROOT );
//TODO -- can't we use a (hamcrest) matcher here?
assertTrue( stmt.matches( regex ) ); assertTrue(
stmt.matches( regex ),
String.format( Locale.ROOT, "Statement didn't match regex:\n%s\n%s\n", stmt, regex )
);
} ); } );
} }
@ -151,4 +152,4 @@ class Args {
this.model = model; this.model = model;
} }
} }

View File

@ -0,0 +1,31 @@
/*
* 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.integration.predicates;
import java.util.stream.Stream;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.spatial.testing.IsSupportedBySpatial;
import org.hibernate.spatial.testing.dialects.PredicateRegexes;
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.Setting;
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
@ServiceRegistry(settings = {
@Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "BIND")
})
@SessionFactory
public class SpatialPredicatesTestBindingMode extends SpatialPredicatesTest {
@Override
public Stream<PredicateRegexes.PredicateRegex> getTestRegexes() {
return super.predicateRegexes.bindingModeRegexes();
}
}

View File

@ -0,0 +1,31 @@
/*
* 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.integration.predicates;
import java.util.stream.Stream;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.spatial.testing.IsSupportedBySpatial;
import org.hibernate.spatial.testing.dialects.PredicateRegexes;
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.Setting;
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
@ServiceRegistry(settings = {
@Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "INLINE")
})
@SessionFactory
public class SpatialPredicatesTestInlineMode extends SpatialPredicatesTest{
@Override
public Stream<PredicateRegexes.PredicateRegex> getTestRegexes() {
return super.predicateRegexes.inlineModeRegexes();
}
}

View File

@ -9,53 +9,93 @@ package org.hibernate.spatial.testing.dialects;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
public class PredicateRegexes { public class PredicateRegexes {
protected final Map<String, String> regexes = new HashMap<>(); protected final Map<String, RegexPair> regexes = new HashMap<>();
// Note that we alias the function invocation so that // Note that we alias the function invocation so that
// we can map the return value to the required type // we can map the return value to the required type
public PredicateRegexes() { public PredicateRegexes() {
regexes.put( add(
"overlaps", "overlaps",
"select .* from .* where st_overlaps\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_overlaps\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_overlaps\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
regexes.put( add(
"intersects",
"select .* from .* where st_intersects\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*"
);
regexes.put(
"crosses", "crosses",
"select .* from .* where st_crosses\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_crosses\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_crosses\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
regexes.put( add(
"contains", "contains",
"select .* from .* where st_contains\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_contains\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_contains\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
regexes.put( add(
"disjoint", "disjoint",
"select .* from .* where st_disjoint\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_disjoint\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_disjoint\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
regexes.put( add(
"touches", "touches",
"select .* from .* where st_touches\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_touches\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_touches\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
regexes.put( add(
"within", "within",
"select .* from .* where st_within\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_within\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_within\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
regexes.put( add(
"eq", "eq",
"select .* from .* where st_equals\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=\\?.*" "select .* from .* where st_equals\\(.*geom\\s*,.*st_geomfromewkt\\(.*\\)\\s*=true.*",
"select .* from .* where st_equals\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
); );
} }
public Stream<Map.Entry<String, String>> all() { public Stream<PredicateRegex> inlineModeRegexes() {
return this.regexes.entrySet().stream(); return extractForMode( entry -> new PredicateRegex( entry.getKey(), entry.getValue().inlineMode ) );
} }
public Stream<PredicateRegex> bindingModeRegexes() {
return extractForMode( entry -> new PredicateRegex( entry.getKey(), entry.getValue().bindingMode ) );
}
private Stream<PredicateRegex> extractForMode(Function<Map.Entry<String, RegexPair>, PredicateRegex> mkPredRegex) {
return this.regexes
.entrySet()
.stream()
.map( mkPredRegex );
}
private void add(String predicate, String inlineRegex, String bindingRegex) {
regexes.put( predicate, new RegexPair( inlineRegex, bindingRegex ) );
}
static public class PredicateRegex {
public final String predicate;
public final String regex;
PredicateRegex(String predicate, String regex) {
this.predicate = predicate;
this.regex = regex;
}
}
static class RegexPair {
final String inlineMode;
final String bindingMode;
private RegexPair(String inline, String binding) {
inlineMode = inline;
bindingMode = binding;
}
}
} }