http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/core/testsupport/src/main/java/org/qi4j/test/indexing/AbstractSpatialRegressionTest.java ---------------------------------------------------------------------- diff --git a/core/testsupport/src/main/java/org/qi4j/test/indexing/AbstractSpatialRegressionTest.java b/core/testsupport/src/main/java/org/qi4j/test/indexing/AbstractSpatialRegressionTest.java index 74cf07a..f442cdf 100644 --- a/core/testsupport/src/main/java/org/qi4j/test/indexing/AbstractSpatialRegressionTest.java +++ b/core/testsupport/src/main/java/org/qi4j/test/indexing/AbstractSpatialRegressionTest.java @@ -2,6 +2,7 @@ package org.qi4j.test.indexing; import org.junit.Ignore; import org.junit.Test; +import org.qi4j.api.association.Association; import org.qi4j.api.common.Optional; import org.qi4j.api.entity.EntityBuilder; import org.qi4j.api.entity.EntityComposite; @@ -20,15 +21,12 @@ import java.util.Iterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; import static org.qi4j.api.geometry.TGeometryFactory.*; import static org.qi4j.api.geometry.TGeometryFactory.TLinearRing; import static org.qi4j.api.query.QueryExpressions.and; import static org.qi4j.api.query.QueryExpressions.not; import static org.qi4j.api.query.QueryExpressions.templateFor; -import static org.qi4j.api.query.grammar.extensions.spatial.SpatialQueryExpressions.ST_Disjoint; -import static org.qi4j.api.query.grammar.extensions.spatial.SpatialQueryExpressions.ST_GeometryFromText; -import static org.qi4j.api.query.grammar.extensions.spatial.SpatialQueryExpressions.ST_Within; +import static org.qi4j.api.query.grammar.extensions.spatial.SpatialQueryExpressions.*; /** * Created by jj on 21.12.14. @@ -37,25 +35,36 @@ public abstract class AbstractSpatialRegressionTest extends AbstractAnyQueryTest { - protected abstract boolean isExpressionSupported(Query<?> expression); - - public interface SpatialRegressionEntity extends EntityComposite, SpatialRegressionsValues {} - - public interface SpatialRegressionsValues + public interface A { @Optional Property<TPoint> point(); @Optional Property<TMultiPoint> multipoint(); @Optional Property<TLineString> line(); + @Optional Property<TMultiLineString> multiline(); @Optional Property<TPolygon> polygon(); @Optional Property<TMultiPolygon> multipolygon(); @Optional Property<TFeature> feature(); @Optional Property<TFeatureCollection> featurecollection(); + @Optional Association<Nested> nested(); + } + + public interface Nested + { + @Optional Property<TPoint> point(); } - private TPoint _TPoint1,_TPoint2, _TPoint3; + public interface SpatialAEntity extends EntityComposite, A {} + public interface SpatialBEntity extends EntityComposite, Nested {} + + + private TPoint _TPoint1, _TPointNested,_TPoint2, _TPoint3; private TMultiPoint _TMultiPoint; private TLineString _TLineString; + private TMultiLineString _TMultiLineString; + private TMultiPolygon _TMultiPolygon; private TPolygon _TPolygon; + private TFeature _TFeature; + private TFeatureCollection _TFeatureCollection; public void setUp() throws Exception { @@ -66,6 +75,9 @@ public abstract class AbstractSpatialRegressionTest _TPoint1 = TPoint(module).lat(48.13905780942574).lon(11.57958984375) .geometry(); + _TPointNested = TPoint(module).lat(48.13905780942574).lon(11.57958984375) + .geometry(); + _TPoint2 = TPoint(module).lat(48.145748).lon(11.567976) .geometry(); @@ -74,29 +86,33 @@ public abstract class AbstractSpatialRegressionTest _TMultiPoint = TMultiPoint(module).points(new double[][] { - { 48.13905780942574 , 11.579589843750000 }, - { 48.14913756559802 , 11.599502563476562 } + {48.13905780942574, 11.579589843750000}, + {48.14913756559802, 11.599502563476562} }) .geometry(); - _TLineString = TlineString(module).points(new double[][] + + _TLineString = TLineString(module).points(new double[][] { { 48.109035906197036 , 11.550750732421875 }, { 48.16608541901253 , 11.552810668945312 } }) .geometry(); + + _TMultiLineString = TMultiLineString(module).of(_TLineString).of(_TLineString, _TLineString).geometry(); + _TPolygon = TPolygon(module) .shell ( TLinearRing(module).ring(new double[][] { - { 48.14478518644042 , 11.475906372070312 }, - { 48.18760570101003 , 11.572723388671875 }, - { 48.14043243818813 , 11.692886352539062 }, - { 48.08243697630599 , 11.679153442382812 }, - { 48.07211472138644 , 11.581306457519531 }, - { 48.10124109364004 , 11.522941589355469 }, - { 48.10949438777014 , 11.470069885253906 }, - { 48.14478518644042 , 11.475906372070312 } + {48.14478518644042, 11.475906372070312}, + {48.18760570101003, 11.572723388671875}, + {48.14043243818813, 11.692886352539062}, + {48.08243697630599, 11.679153442382812}, + {48.07211472138644, 11.581306457519531}, + {48.10124109364004, 11.522941589355469}, + {48.10949438777014, 11.470069885253906}, + {48.14478518644042, 11.475906372070312} }) .geometry() @@ -105,17 +121,28 @@ public abstract class AbstractSpatialRegressionTest ( TLinearRing(module).ring(new double[][] { - { 48.13837048124154 , 11.538391113281250 }, - { 48.15028286718964 , 11.614952087402344 }, - { 48.10513864768105 , 11.640357971191406 }, - { 48.10330454141599 , 11.558303833007812 }, - { 48.13837048124154 , 11.538391113281250 } + {48.13837048124154, 11.538391113281250}, + {48.15028286718964, 11.614952087402344}, + {48.10513864768105, 11.640357971191406}, + {48.10330454141599, 11.558303833007812}, + {48.13837048124154, 11.538391113281250} }) .geometry() ) .geometry(); + _TMultiPolygon = TMultiPolygon(module).of(_TPolygon).of(_TPolygon, _TPolygon).geometry(); + + _TFeature = TFeature(module).of(_TPoint1).addProperty("property", "feature").geometry(); + _TFeatureCollection = TFeatureCollection(module) + .of(TFeature(module).of(_TPoint1).addProperty("property", "point").geometry()) + .of(TFeature(module).of(_TMultiPoint).addProperty("property", "multipoint").geometry()) + .of(TFeature(module).of(_TLineString).addProperty("property", "linestring").geometry()) + .of(TFeature(module).of(_TMultiLineString).addProperty("property", "multilinestring").geometry()) + .of(TFeature(module).of(_TPolygon).addProperty("property", "polygon").geometry()) + .of(TFeature(module).of(_TMultiPolygon).addProperty("property", "multipolygon").geometry()) + .geometry(); try (UnitOfWork unitOfWork = module.newUnitOfWork()) @@ -123,41 +150,71 @@ public abstract class AbstractSpatialRegressionTest // TPoint { - EntityBuilder<SpatialRegressionEntity> pointBuilder = unitOfWork.newEntityBuilder(SpatialRegressionEntity.class, "Point1"); + EntityBuilder<SpatialBEntity> pointBuilderNested = unitOfWork.newEntityBuilder(SpatialBEntity.class, "Nested"); + pointBuilderNested.instance().point().set(_TPointNested); + SpatialBEntity nested = pointBuilderNested.newInstance(); + + EntityBuilder<SpatialAEntity> pointBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "Point1"); pointBuilder.instance().point().set(_TPoint1); + pointBuilder.instance().nested().set(nested); pointBuilder.newInstance(); - EntityBuilder<SpatialRegressionEntity> pointBuilder2 = unitOfWork.newEntityBuilder(SpatialRegressionEntity.class, "Point2"); + EntityBuilder<SpatialAEntity> pointBuilder2 = unitOfWork.newEntityBuilder(SpatialAEntity.class, "Point2"); pointBuilder2.instance().point().set(_TPoint2); pointBuilder2.newInstance(); - EntityBuilder<SpatialRegressionEntity> pointBuilder3 = unitOfWork.newEntityBuilder(SpatialRegressionEntity.class, "Point3"); + EntityBuilder<SpatialAEntity> pointBuilder3 = unitOfWork.newEntityBuilder(SpatialAEntity.class, "Point3"); pointBuilder3.instance().point().set(_TPoint3); pointBuilder3.newInstance(); - } // TMultiPoint { - EntityBuilder<SpatialRegressionEntity> mPointBuilder = unitOfWork.newEntityBuilder(SpatialRegressionEntity.class, "MultiPoint"); + EntityBuilder<SpatialAEntity> mPointBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "MultiPoint"); mPointBuilder.instance().multipoint().set(_TMultiPoint); mPointBuilder.newInstance(); } // TLineString { - EntityBuilder<SpatialRegressionEntity> tlineStringBuilder = unitOfWork.newEntityBuilder(SpatialRegressionEntity.class, "LineString"); + EntityBuilder<SpatialAEntity> tlineStringBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "LineString"); tlineStringBuilder.instance().line().set(_TLineString); tlineStringBuilder.newInstance(); } + // TMultiLineString + { + EntityBuilder<SpatialAEntity> tlineStringBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "MultiLineString"); + tlineStringBuilder.instance().multiline().set(_TMultiLineString); + tlineStringBuilder.newInstance(); + } // TPolygon { - EntityBuilder<SpatialRegressionEntity> tPolygonBuilder = unitOfWork.newEntityBuilder(SpatialRegressionEntity.class, "Polygon"); + EntityBuilder<SpatialAEntity> tPolygonBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "Polygon"); tPolygonBuilder.instance().polygon().set(_TPolygon); tPolygonBuilder.newInstance(); } + // TMultiPolygon + { + EntityBuilder<SpatialAEntity> tPolygonBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "MultiPolygon"); + tPolygonBuilder.instance().multipolygon().set(_TMultiPolygon); + tPolygonBuilder.newInstance(); + } + + // TFeature + { + EntityBuilder<SpatialAEntity> tFeatureBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "Feature"); + tFeatureBuilder.instance().feature().set(_TFeature); + tFeatureBuilder.newInstance(); + } + + // TFeatureCollection + { + EntityBuilder<SpatialAEntity> tFeatureCollectionBuilder = unitOfWork.newEntityBuilder(SpatialAEntity.class, "FeatureCollection"); + tFeatureCollectionBuilder.instance().featurecollection().set(_TFeatureCollection); + tFeatureCollectionBuilder.newInstance(); + } unitOfWork.complete(); } } @@ -171,79 +228,75 @@ public abstract class AbstractSpatialRegressionTest { super.assemble( module ); - module.entities(SpatialRegressionEntity.class); + module.entities(SpatialAEntity.class, SpatialBEntity.class); } - // ST_Within() @Test - public void script01() + public void script01a() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), 10,TUnit.METER ) )); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(1, query.count()); TPoint tPoint = query.iterator().next().point().get(); assertTrue(tPoint.compareTo(_TPoint1) == 0); - // assertSame } @Test - public void script02() + public void script01b() + throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(2389280.7514562616).x(1286436.5975464052).geometry("EPSG:27572"), 10,TUnit.METER ) )); - assumeTrue(isExpressionSupported(query)); + System.out.println(query); query.find(); assertEquals(1, query.count()); TPoint tPoint = query.iterator().next().point().get(); assertTrue(tPoint.compareTo(_TPoint1) == 0); - - // Transform(module).from(tPoint).to("EPSG:4326"); } @Test - public void script03() + public void script01c() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 10, TUnit.METER ) )) - .orderBy(templateFor(SpatialRegressionsValues.class).point(), _TPoint1, OrderBy.Order.ASCENDING); + .orderBy(templateFor(A.class).point(), _TPoint1, OrderBy.Order.ASCENDING); - assumeTrue(isExpressionSupported(query)); + System.out.println(query); query.find(); assertEquals(query.count(), 1); TPoint tPoint = query.iterator().next().point().get(); @@ -251,31 +304,30 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script03a() + public void script01d() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where(and( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 10, TUnit.METER ) , ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 5, TUnit.METER ) )) ) - .orderBy(templateFor(SpatialRegressionsValues.class).point(), _TPoint1, OrderBy.Order.ASCENDING); - - assumeTrue(isExpressionSupported(query)); + .orderBy(templateFor(A.class).point(), _TPoint1, OrderBy.Order.ASCENDING); + System.out.println(query); query.find(); assertEquals(query.count(), 1); TPoint tPoint = query.iterator().next().point().get(); @@ -283,34 +335,35 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script03b() { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + public void script01e() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where(and( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 1000, TUnit.KILOMETER ) , not(ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 1, TUnit.METER )) )) ) - .orderBy(templateFor(SpatialRegressionsValues.class).point(), _TPoint1, OrderBy.Order.ASCENDING); + .orderBy(templateFor(A.class).point(), _TPoint1, OrderBy.Order.ASCENDING); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(query.count(), 2); - Iterator<SpatialRegressionsValues> results = query.iterator(); + Iterator<A> results = query.iterator(); // sorted ascending by distance TPoint tPoint2 = results.next().point().get(); @@ -321,34 +374,35 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script03c() { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + public void script01f() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where(and( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 1000, TUnit.KILOMETER ) , not(ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780941111).x(11.57958981111).geometry(), 1, TUnit.METER )) )) ) - .orderBy(templateFor(SpatialRegressionsValues.class).point(), _TPoint1, OrderBy.Order.DESCENDING); + .orderBy(templateFor(A.class).point(), _TPoint1, OrderBy.Order.DESCENDING); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(query.count(), 2); - Iterator<SpatialRegressionsValues> results = query.iterator(); + Iterator<A> results = query.iterator(); // sorted descending by distance TPoint tPoint3 = results.next().point().get(); @@ -359,25 +413,25 @@ public abstract class AbstractSpatialRegressionTest } - @Ignore + @Ignore // <-- WKT support disabled @Test - public void script04() + public void script01g() + throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), ST_GeometryFromText("POINT(11.57958981111 48.13905780941111 )"), 10,TUnit.METER ) )) - .orderBy(templateFor(SpatialRegressionsValues.class).point(), _TPoint1, OrderBy.Order.ASCENDING); + .orderBy(templateFor(A.class).point(), _TPoint1, OrderBy.Order.ASCENDING); - // assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(query.count(), 1); TPoint tPoint = query.iterator().next().point().get(); @@ -385,16 +439,17 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script05() + public void script01h() + throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPolygon(module) .shell ( @@ -415,7 +470,6 @@ public abstract class AbstractSpatialRegressionTest ) )); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(1, query.count()); @@ -425,36 +479,35 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script06() + public void script01i() + throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).line(), + templateFor(A.class).line(), TPolygon(module) .shell - ( - new double[][] - {{ 48.17341248658083 , 11.499938964843750 }, - { 48.21003212234042 , 11.622848510742188 }, - { 48.13470457551313 , 11.732711791992188 }, - { 48.07280293614395 , 11.699409484863281 }, - { 48.07372054150283 , 11.534614562988281 }, - { 48.08817066753472 , 11.481056213378906 }, - { 48.17341248658083 , 11.499938964843750 }} - - ).geometry() + ( + new double[][] + + { + {48.17341248658083, 11.499938964843750}, + {48.21003212234042, 11.622848510742188}, + {48.13470457551313, 11.732711791992188}, + {48.07280293614395, 11.699409484863281}, + {48.07372054150283, 11.534614562988281}, + {48.08817066753472, 11.481056213378906}, + {48.17341248658083, 11.499938964843750} + } + + ).geometry() ) )); - - // .orderBy(templateFor(VerifyStatialTypes.class).point(), _tPoint, OrderBy.Order.ASCENDING); - - assumeTrue(isExpressionSupported(query)); - query.find(); assertEquals(1, query.count()); TLineString tLineString = query.iterator().next().line().get(); @@ -464,16 +517,17 @@ public abstract class AbstractSpatialRegressionTest @Test - public void script07() + public void script01j() + throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Within ( - templateFor(SpatialRegressionsValues.class).polygon(), + templateFor(A.class).polygon(), TPolygon(module) .shell @@ -502,85 +556,97 @@ public abstract class AbstractSpatialRegressionTest assertTrue(tPolygon.holes().get().get(0).compareTo(_TPolygon.holes().get().get(0)) == 0); } + @Test + public void script01k() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); + + Query<A> query = unitOfWork.newQuery( + qb + .where( + ST_Within + ( + templateFor(A.class).nested().get().point(), // <- "nested.point" : [ 11.57958984375, 48.13905780942574 ] + TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), + 10,TUnit.METER + ) + )); + query.find(); + assertEquals(1, query.count()); + TPoint tPoint = query.iterator().next().point().get(); + assertTrue(tPoint.compareTo(_TPointNested) == 0); + } + // ST_Disjoint() @Test - public void script08() + public void script02a() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Disjoint ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), 10,TUnit.METER ) )); - assumeTrue(isExpressionSupported(query)); query.find(); - assertEquals(4, query.count()); - TPoint tPoint = query.iterator().next().point().get(); - assertTrue(tPoint.compareTo(_TPoint1) == 0); - // assertSame + assertEquals(2, query.count()); } @Test - public void script09() + public void script02b() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where( ST_Disjoint ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), - // TPoint(module).y(45.13905780942574).x(10.57958984375).geometry(), 10,TUnit.KILOMETER ) )); - assumeTrue(isExpressionSupported(query)); query.find(); - System.out.println("Count " + query.count()); - assertEquals(1, query.count()); TPoint tPoint = query.iterator().next().point().get(); assertTrue(tPoint.compareTo(_TPoint3) == 0); - // assertSame } @Test - public void script10() + public void script02c() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where(and( ST_Disjoint ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), 10, TUnit.METER ), ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), 10,TUnit.KILOMETER ) ) )); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(1, query.count()); @@ -589,29 +655,28 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script11() + public void script02d() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where(and( ST_Disjoint ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(2389280.7514562616).x(1286436.5975464052).geometry("EPSG:27572"), 10, TUnit.METER ), ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), 100,TUnit.KILOMETER ) ) )); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(1, query.count()); @@ -621,35 +686,159 @@ public abstract class AbstractSpatialRegressionTest } @Test - public void script12() + public void script02e() throws EntityFinderException { - QueryBuilder<SpatialRegressionsValues> qb = this.module.newQueryBuilder(SpatialRegressionsValues.class); + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); - Query<SpatialRegressionsValues> query = unitOfWork.newQuery( + Query<A> query = unitOfWork.newQuery( qb .where(and( ST_Disjoint ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(2389280.7514562616).x(1286436.5975464052).geometry("EPSG:27572"), 10, TUnit.METER ), ST_Within ( - templateFor(SpatialRegressionsValues.class).point(), + templateFor(A.class).point(), TPoint(module).y(2389280.7514562616).x(1286436.5975464052).geometry("EPSG:27572"), 1000,TUnit.KILOMETER ) ) )); - assumeTrue(isExpressionSupported(query)); query.find(); assertEquals(2, query.count()); } + @Test + public void script02f() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); + + Query<A> query = unitOfWork.newQuery( + qb + .where( + ST_Disjoint + ( + templateFor(A.class).nested().get().point(), + TPoint(module).y(49.13905780942574).x(12.57958984375).geometry(), + 10,TUnit.METER + ) + )); + query.find(); + assertEquals(1, query.count()); + TPoint tPoint = query.iterator().next().point().get(); + assertTrue(tPoint.compareTo(_TPointNested) == 0); + } + + // ST_Intersects() + + @Test + public void script03a() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); + + Query<A> query = unitOfWork.newQuery( + qb + .where( + ST_Intersects + ( + templateFor(A.class).point(), + TPoint(module).y(48.13905780942574).x(11.57958984375).geometry(), + 10,TUnit.METER + ) + )); + query.find(); + assertEquals(1, query.count()); + } + + @Test + public void script03b() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); + + Query<A> query = unitOfWork.newQuery( + qb + .where( + ST_Intersects + ( + templateFor(A.class).polygon(), + + TPolygon(module) + .shell + ( + new double[][] + { + { 48.160131, 11.778717 }, + { 48.156925, 11.631775 }, + { 48.061561, 11.600876 }, + { 48.006922, 11.778030 }, + { 48.062020, 11.858368 }, + { 48.159215, 11.778717 } + } + ).geometry() + ) + )); + + + query.find(); + + assertEquals(query.count(), 1); + TPolygon tPolygon = query.iterator().next().polygon().get(); + assertTrue(tPolygon.holes().get().size() == 1); + assertTrue(tPolygon.shell().get().compareTo(_TPolygon.shell().get()) == 0); + assertFalse(tPolygon.holes().get().get(0).compareTo(_TPolygon.shell().get()) == 0); + assertTrue(tPolygon.holes().get().get(0).compareTo(_TPolygon.holes().get().get(0)) == 0); + } + + @Test + public void script03c() + throws EntityFinderException + { + QueryBuilder<A> qb = this.module.newQueryBuilder(A.class); + + Query<A> query = unitOfWork.newQuery( + qb + .where( + ST_Intersects + ( + templateFor(A.class).polygon(), + + TPolygon(module) + .shell + ( + new double[][] + { + { 48.160131, 11.778717 }, + { 48.156925, 11.631775 }, + { 48.061561, 11.600876 }, + { 48.006922, 11.778030 }, + { 48.062020, 11.858368 }, + { 48.159215, 11.778717 } + } + ).geometry() + ) + )) + .orderBy(templateFor(A.class).point(), _TPoint1, OrderBy.Order.ASCENDING); + + + query.find(); + + assertEquals(query.count(), 1); + TPolygon tPolygon = query.iterator().next().polygon().get(); + assertTrue(tPolygon.holes().get().size() == 1); + assertTrue(tPolygon.shell().get().compareTo(_TPolygon.shell().get()) == 0); + assertFalse(tPolygon.holes().get().get(0).compareTo(_TPolygon.shell().get()) == 0); + assertTrue(tPolygon.holes().get().get(0).compareTo(_TPolygon.holes().get().get(0)) == 0); + } + }
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/core/testsupport/src/main/java/org/qi4j/test/indexing/TestData.java ---------------------------------------------------------------------- diff --git a/core/testsupport/src/main/java/org/qi4j/test/indexing/TestData.java b/core/testsupport/src/main/java/org/qi4j/test/indexing/TestData.java index 1312a46..2dbe700 100644 --- a/core/testsupport/src/main/java/org/qi4j/test/indexing/TestData.java +++ b/core/testsupport/src/main/java/org/qi4j/test/indexing/TestData.java @@ -106,7 +106,6 @@ class TestData kualaLumpur.name().set( "Kuala Lumpur" ); kualaLumpur.country().set( "Malaysia" ); kualaLumpur.county().set( "Some Jaya" ); - kualaLumpur.location().set(TPoint(module).x(101.686854).y(3.139003).geometry()); kualaLumpur = cityBuilder.newInstance(); NameableAssert.trace( kualaLumpur ); } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/build.gradle ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/build.gradle b/extensions/indexing-elasticsearch/build.gradle index 6bf7bfa..525bf4e 100644 --- a/extensions/indexing-elasticsearch/build.gradle +++ b/extensions/indexing-elasticsearch/build.gradle @@ -9,6 +9,8 @@ dependencies { compile project(":org.qi4j.libraries:org.qi4j.library.spatial") compile project(":org.qi4j.libraries:org.qi4j.library.sql") compile project(":org.qi4j.extensions:org.qi4j.extension.entitystore-sql") + compile(project(":org.qi4j.extensions:org.qi4j.extension.entitystore-riak")) + compile libraries.elasticsearch http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchConfiguration.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchConfiguration.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchConfiguration.java index 795fc6b..9fe42d7 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchConfiguration.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchConfiguration.java @@ -22,7 +22,6 @@ import org.qi4j.api.common.Optional; import org.qi4j.api.common.UseDefaults; import org.qi4j.api.configuration.ConfigurationComposite; import org.qi4j.api.property.Property; -import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialExceptionConfiguration; import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration; // START SNIPPET: config @@ -50,11 +49,6 @@ public interface ElasticSearchConfiguration @UseDefaults Property<Boolean> indexNonAggregatedAssociations(); - public static enum INDEX_MAPPING_POINT_METHOD {GEO_POINT, GEO_SHAPE} - - - @Optional Property<INDEX_MAPPING_POINT_METHOD> indexPointMappingMethod(); - @Optional Property<SpatialConfiguration.Configuration> spatial(); http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchFinder.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchFinder.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchFinder.java index dd204ea..1936d50 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchFinder.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchFinder.java @@ -78,15 +78,6 @@ public interface ElasticSearchFinder private static final Map<Class<?>, ComplexTypeSupport> COMPLEX_TYPE_SUPPORTS = new HashMap<>( 9 ); public static final Map<Class<?>, SpatialQuerySpecSupport> EXTENDED_SPEC_SUPPORTS = new HashMap<>( 2 ); - public static final Map<Class<?>, SpatialQuerySpecSupport> EXTENDED_QUERY_EXPRESSIONS_CATALOG = new HashMap<>( 2 ); - - static - { - - EXTENDED_QUERY_EXPRESSIONS_CATALOG.put(SpatialPredicatesSpecification.class, new PredicateFinderSupport()); - EXTENDED_QUERY_EXPRESSIONS_CATALOG.put(SpatialConvertSpecification.class, new ConvertFinderSupport()); - } - // Spec Support static { @@ -198,12 +189,9 @@ public interface ElasticSearchFinder System.out.println("request " + request.toString()); - // Execute SearchResponse response = request.execute().actionGet(); - // System.out.println("response " + response.toString()); - if( response.getHits().totalHits() == 1 ) { return EntityReference.parseEntityReference( response.getHits().getAt( 0 ).id() ); @@ -596,38 +584,16 @@ public interface ElasticSearchFinder throws EntityFinderException { LOGGER.trace("Processing SpatialPredicatesSpecification {}", spec); - SpatialQuerySpecSupport spatialQuerySpecSupport = EXTENDED_SPEC_SUPPORTS.get( spec.getClass().getSuperclass() ); - spatialQuerySpecSupport.setModule(module, support); - - - - try - { - spatialQuerySpecSupport.processSpecification(filterBuilder, spec, variables); - - } catch(Exception _ex) - { - throw new EntityFinderException(_ex); - } + EXTENDED_SPEC_SUPPORTS.get( spec.getClass().getSuperclass() ).support(module, support).processSpecification(filterBuilder, spec, variables); } private void processSpatialConvertSpecification( FilterBuilder filterBuilder, SpatialConvertSpecification<?> spec, Map<String, Object> variables ) + throws EntityFinderException { LOGGER.trace("Processing SpatialConvertSpecification {}", spec); - - SpatialQuerySpecSupport spatialQuerySpecSupport = EXTENDED_SPEC_SUPPORTS.get( spec.getClass().getSuperclass() ); - spatialQuerySpecSupport.setModule(module, support); - - try - { - spatialQuerySpecSupport.processSpecification(filterBuilder, spec, variables); - - } catch(Exception _ex) - { - _ex.printStackTrace(); - } + EXTENDED_SPEC_SUPPORTS.get( spec.getClass().getSuperclass() ).support(module, support).processSpecification(filterBuilder, spec, variables); } } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java index fe969ba..e651ee3 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java @@ -23,7 +23,6 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.qi4j.api.association.AssociationDescriptor; -import org.qi4j.api.association.AssociationStateDescriptor; import org.qi4j.api.entity.EntityDescriptor; import org.qi4j.api.entity.EntityReference; import org.qi4j.api.geometry.internal.TGeometry; @@ -52,10 +51,7 @@ import org.qi4j.spi.entitystore.StateChangeListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Stack; +import java.util.*; /** * Listen to Entity state changes and index them in ElasticSearch. @@ -82,6 +78,9 @@ public interface ElasticSearchIndexer @This private ElasticSearchSupport support; + Stack<String> deepSpatialMappingKeyStack = new Stack<>(); + + public void emptyIndex() { support.client().admin().indices().prepareDelete( support.index() ).execute().actionGet(); @@ -195,16 +194,9 @@ public interface ElasticSearchIndexer { return toJSON(null, state, newStates, uow); } - - - Stack<String> stack = new Stack<>(); - int iterations = 0; - - private String toJSON(String assotiationKey, EntityState state, Map<String, EntityState> newStates, EntityStoreUnitOfWork uow ) + private String toJSON(String mKey, EntityState state, Map<String, EntityState> newStates, EntityStoreUnitOfWork uow ) { - // System.out.println("# --- > Iterations " + iterations++); - try { JSONObject json = new JSONObject(); @@ -218,36 +210,32 @@ public interface ElasticSearchIndexer for( PropertyDescriptor propDesc : entityType.state().properties() ) { - AssociationStateDescriptor associationStateDescriptor = entityType.state(); - if( propDesc.queryable() ) { String key = propDesc.qualifiedName().name(); Object value = state.propertyValueOf( propDesc.qualifiedName() ); if( value == null || ValueType.isPrimitiveValue( value ) ) { - json.put( key, value ); + json.put(key, value); } - else - if (ValueType.isGeometryValue(value) ) + // For spatial types is is required to generate a "deep mapping key" that is used during indexing as + // mapping name. The mapping name has to be "deep" and is also used for spatial queries : + // "geo_distance" : { + // "city.location" : [ 11.57958984375, 48.13905780942574 ], + // "distance" : "10.0km" + if (ValueType.isGeometricValue(value) ) { - - String newKey = null; - - if (assotiationKey != null) + if (mKey != null) { - newKey = assotiationKey + "." + key; + deepSpatialMappingKeyStack.add(mKey); + deepSpatialMappingKeyStack.add(key); } - else - { - newKey = key; - } - - - ElasticSearchSpatialIndexer.toJSON(support, (TGeometry) value, key, newKey, json, module); + else { deepSpatialMappingKeyStack.add(key);} - //System.out.println("Spatial JSON " + json); + String deepKey = ElasticSearchSpatialIndexer.spatialMappingPropertyName(deepSpatialMappingKeyStack); + ElasticSearchSpatialIndexer.toJSON(support, (TGeometry) value, key, deepKey, json, module); + deepSpatialMappingKeyStack.clear(); } else { @@ -373,7 +361,6 @@ public interface ElasticSearchIndexer json.put( key, array ); } } - iterations = 0; return json.toString(); } catch( JSONException e ) http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchSupport.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchSupport.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchSupport.java index f3d683b..16859fd 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchSupport.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchSupport.java @@ -34,8 +34,6 @@ public interface ElasticSearchSupport boolean indexNonAggregatedAssociations(); - ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD indexPointMappingMethod(); - SpatialConfiguration.Configuration spatialConfiguration(); Module getModule(); http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/cluster/ESClusterSupport.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/cluster/ESClusterSupport.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/cluster/ESClusterSupport.java index 1a88b49..c573d3f 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/cluster/ESClusterSupport.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/cluster/ESClusterSupport.java @@ -46,12 +46,8 @@ public class ESClusterSupport index = config.index().get() == null ? DEFAULT_INDEX_NAME : config.index().get(); indexNonAggregatedAssociations = config.indexNonAggregatedAssociations().get(); - indexPointMappingMethod = config.indexPointMappingMethod() == null ? - ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD.GEO_POINT : config.indexPointMappingMethod().get(); + defaultSpatialConfiguration(config); - indexPointMappingMethod = ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD.GEO_POINT; - - System.out.println("---- TEST ---- " + config.spatial()); String[] nodes = config.nodes().get() == null ? new String[]{ "localhost:9300" } : config.nodes().get().split( "," ); boolean clusterSniff = config.clusterSniff().get(); http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/ElasticSearchSpatialFinder.java ---------------------------------------------------------------------- diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/ElasticSearchSpatialFinder.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/ElasticSearchSpatialFinder.java index af529fd..29c38c4 100644 --- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/ElasticSearchSpatialFinder.java +++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/ElasticSearchSpatialFinder.java @@ -1,4 +1,3 @@ -package org.qi4j.index.elasticsearch.extensions.spatial; /* * Copyright 2014 Jiri Jetmar. @@ -17,11 +16,13 @@ package org.qi4j.index.elasticsearch.extensions.spatial; * See the License for the specific language governing permissions and * limitations under the License. */ +package org.qi4j.index.elasticsearch.extensions.spatial; + import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; -import org.elasticsearch.index.query.*; +import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.search.sort.GeoDistanceSortBuilder; import org.elasticsearch.search.sort.SortOrder; import org.qi4j.api.composite.Composite; @@ -34,6 +35,7 @@ import org.qi4j.api.query.grammar.extensions.spatial.convert.SpatialConvertSpeci import org.qi4j.api.query.grammar.extensions.spatial.predicate.SpatialPredicatesSpecification; import org.qi4j.api.structure.Module; import org.qi4j.functional.Specification; +import org.qi4j.index.elasticsearch.ElasticSearchFinderSupport; import org.qi4j.index.elasticsearch.ElasticSearchSupport; import org.qi4j.index.elasticsearch.extensions.spatial.functions.convert.ConvertFinderSupport; import org.qi4j.index.elasticsearch.extensions.spatial.functions.predicates.PredicateFinderSupport; @@ -46,111 +48,83 @@ import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; -import static org.elasticsearch.index.query.FilterBuilders.geoShapeFilter; - -import org.qi4j.index.elasticsearch.ElasticSearchFinderSupport; - -public final class ElasticSearchSpatialFinder -{ +public final class ElasticSearchSpatialFinder { private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchSpatialFinder.class); - private static final Map<Class<?>, SpatialQuerySpecSupport> SPATIAL_QUERY_EXPRESSIONS_CATALOG = new HashMap<>( 2 ); + private static final Map<Class<?>, SpatialQuerySpecSupport> SPATIAL_QUERY_EXPRESSIONS_CATALOG = new HashMap<>(2); - static - { + static { SPATIAL_QUERY_EXPRESSIONS_CATALOG.put(SpatialPredicatesSpecification.class, new PredicateFinderSupport()); SPATIAL_QUERY_EXPRESSIONS_CATALOG.put(SpatialConvertSpecification.class, new ConvertFinderSupport()); } - - public interface ModuleHelper { - void setModule(Module module, ElasticSearchSupport support); + private ElasticSearchSpatialFinder() { } - public static interface SpatialQuerySpecSupport extends ModuleHelper - { - void processSpecification(FilterBuilder filterBuilder, Specification<?> spec, Map<String, Object> variables) throws EntityFinderException; + public interface Support { + SpatialQuerySpecSupport support(Module module, ElasticSearchSupport support); } + public static interface SpatialQuerySpecSupport extends Support { + void processSpecification(FilterBuilder filterBuilder, Specification<?> spec, Map<String, Object> variables) throws EntityFinderException; + } public static class SpatialSpecSupport - implements SpatialQuerySpecSupport { - - Module module; - ElasticSearchSupport support; + implements SpatialQuerySpecSupport { + private Module module; + private ElasticSearchSupport support; - public void setModule(Module module, ElasticSearchSupport support) - { - this.module = module; + public SpatialQuerySpecSupport support(Module module, ElasticSearchSupport support) { + this.module = module; this.support = support; + return this; } public void processSpecification(FilterBuilder filterBuilder, - Specification<?> spec, - Map<String, Object> variables) - throws EntityFinderException - { - - SpatialQuerySpecSupport spatialQuerySpecSupport = SPATIAL_QUERY_EXPRESSIONS_CATALOG.get(spec.getClass().getSuperclass()); - spatialQuerySpecSupport.setModule(module, support); - - try { - spatialQuerySpecSupport.processSpecification(filterBuilder, spec, variables); - - } catch (Exception _ex) { - throw new EntityFinderException(_ex); - } - - + Specification<?> spec, + Map<String, Object> variables) + throws EntityFinderException { + SPATIAL_QUERY_EXPRESSIONS_CATALOG.get(spec.getClass().getSuperclass()).support(module, support).processSpecification(filterBuilder, spec, variables); } } - public static class SpatialTypeSupport - implements ElasticSearchFinderSupport.ComplexTypeSupport - { + implements ElasticSearchFinderSupport.ComplexTypeSupport { private Module module; private ElasticSearchSupport support; - public ElasticSearchFinderSupport.ComplexTypeSupport support(Module module, ElasticSearchSupport support) - { - this.module = module; + public ElasticSearchFinderSupport.ComplexTypeSupport support(Module module, ElasticSearchSupport support) { + this.module = module; this.support = support; return this; } - public FilterBuilder comparison( ComparisonSpecification<?> spec, Map<String, Object> variables ) - { + public FilterBuilder comparison(ComparisonSpecification<?> spec, Map<String, Object> variables) { throw new RuntimeException("Unsupported operation"); } - public FilterBuilder contains( ContainsSpecification<?> spec, Map<String, Object> variables ) - { + public FilterBuilder contains(ContainsSpecification<?> spec, Map<String, Object> variables) { throw new RuntimeException("Unsupported operation"); } - public FilterBuilder containsAll( ContainsAllSpecification<?> spec, Map<String, Object> variables ) - { + public FilterBuilder containsAll(ContainsAllSpecification<?> spec, Map<String, Object> variables) { throw new RuntimeException("Unsupported operation"); } - public void orderBy(SearchRequestBuilder request, Specification<Composite> whereClause, OrderBy orderBySegment, Map<String, Object> variables ) throws EntityFinderException - { - if (!TPoint.class.isAssignableFrom(InternalUtils.classOfPropertyType(orderBySegment.property()))) - { + public void orderBy(SearchRequestBuilder request, Specification<Composite> whereClause, OrderBy orderBySegment, Map<String, Object> variables) throws EntityFinderException { + if (!TPoint.class.isAssignableFrom(InternalUtils.classOfPropertyType(orderBySegment.property()))) { throw new EntityFinderException("Ordering can only be done on TPoints.. TODO"); } - if (!SpatialIndexMapper.IndexMappingCache.isMappedAsGeoPoint(support.index(), support.entitiesType(), orderBySegment.property().toString())) - { + if (!SpatialIndexMapper.IndexMappingCache.isMappedAsGeoPoint(support.index(), support.entitiesType(), orderBySegment.property().toString())) { throw new EntityFinderException("OrderBy is only supported when GEO_POINT indexing is used"); } @@ -162,11 +136,4 @@ public final class ElasticSearchSpatialFinder } } - - - - private ElasticSearchSpatialFinder() - { - } - }
