/* * Hibernate, Relational Persistence for Idiomatic Java * * JBoss, Home of Professional Open Source * Copyright 2012 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @authors tag. All rights reserved. * See the copyright.txt in the distribution for a * full listing of individual contributors. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package org.hibernate.search.test.spatial; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.lucene.search.Sort; import org.junit.Assert; import org.hibernate.Transaction; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.query.dsl.Unit; import org.hibernate.search.spatial.impl.DistanceSortField; import org.hibernate.search.test.SearchTestCase; /** * Hibernate Search spatial : unit tests on indexing POIs in with Grid and Grid+Distance * * @author Nicolas Helleringer <nicolas.helleringer@novacodex.net> */ public class SpatialIndexingTest extends SearchTestCase { public void testIndexing() throws Exception { POI poi = new POI( 1, "Test", 24.0d, 32.0d, "" ); POI poi2 = new POI( 2, "Test2", 0.0d, -179.0d, "" ); POI poi3 = new POI( 3, "Test3", 0.0d, 179.0d, "" ); POI poi4 = new POI( 4, "Test4", 89.0d, 1.0d, "" ); POI poi5 = new POI( 5, "Test5", -90.0d, 17.0d, "" ); POI poi6 = new POI( 6, "Test6", 47.0d, 154.0d, "" ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( poi ); fullTextSession.save( poi2 ); fullTextSession.save( poi3 ); fullTextSession.save( poi4 ); fullTextSession.save( poi5 ); fullTextSession.save( poi6 ); tx.commit(); tx = fullTextSession.beginTransaction(); //Point center = Point.fromDegrees( 24, 31.5 ); // 50.79 km fromBoundingCircle 24.32 double centerLatitude= 24; double centerLongitude= 31.5; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( POI.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "location" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, POI.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "location" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, POI.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); org.apache.lucene.search.Query luceneQuery3 = builder.spatial().onCoordinates( "location" ) .within( 112, Unit.KM ).ofLatitude( 0.0d ).andLongitude( 180.0d ).createQuery(); org.hibernate.Query hibQuery3 = fullTextSession.createFullTextQuery( luceneQuery3, POI.class ); List results3 = hibQuery3.list(); Assert.assertEquals( 2, results3.size() ); org.apache.lucene.search.Query luceneQuery4 = builder.spatial().onCoordinates( "location" ) .within( 100000, Unit.KM ).ofLatitude( 0.0d ).andLongitude( 0.0d ).createQuery(); org.hibernate.Query hibQuery4 = fullTextSession.createFullTextQuery( luceneQuery4, POI.class ); List results4 = hibQuery4.list(); Assert.assertEquals( 6, results4.size() ); List<?> pois = fullTextSession.createQuery( "from " + POI.class.getName() ).list(); for (Object entity : pois) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testDistanceProjection() throws Exception { POI poi = new POI( 1, "Distance to 24,32 : 0", 24.0d, 32.0d, "" ); POI poi2= new POI( 2, "Distance to 24,32 : 10.16", 24.0d, 31.9d, "" ); POI poi3= new POI( 3, "Distance to 24,32 : 11.12", 23.9d, 32.0d, "" ); POI poi4= new POI( 4, "Distance to 24,32 : 15.06", 23.9d, 32.1d, "" ); POI poi5= new POI( 5, "Distance to 24,32 : 22.24", 24.2d, 32.0d, "" ); POI poi6= new POI( 6, "Distance to 24,32 : 24.45", 24.2d, 31.9d, "" ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( poi ); fullTextSession.save( poi2 ); fullTextSession.save( poi3 ); tx.commit(); tx = fullTextSession.beginTransaction(); fullTextSession.save( poi4 ); fullTextSession.save( poi5 ); fullTextSession.save( poi6 ); tx.commit(); tx = fullTextSession.beginTransaction(); double centerLatitude= 24.0d; double centerLongitude= 32.0d; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( POI.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "location" ) .within( 100, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); FullTextQuery hibQuery = fullTextSession.createFullTextQuery( luceneQuery, POI.class ); hibQuery.setProjection( FullTextQuery.THIS, FullTextQuery.SPATIAL_DISTANCE ); hibQuery.setSpatialParameters( centerLatitude, centerLongitude, "location" ); List results = hibQuery.list(); Object[] firstResult = (Object[]) results.get(0); Object[] secondResult = (Object[]) results.get(1); Object[] thirdResult = (Object[]) results.get(2); Object[] fourthResult = (Object[]) results.get(3); Object[] fifthResult = (Object[]) results.get(4); Object[] sixthResult = (Object[]) results.get(5); Assert.assertEquals( ((Double)firstResult[1]), 0.0, 0.0001 ); Assert.assertEquals( ((Double)secondResult[1]), 10.1582, 0.0001 ); Assert.assertEquals( ((Double)thirdResult[1]), 11.1195, 0.0001 ); Assert.assertEquals( ((Double)fourthResult[1]), 15.0636, 0.0001 ); Assert.assertEquals( ((Double)fifthResult[1]), 22.239, 0.001 ); Assert.assertEquals( ((Double)sixthResult[1]), 24.446, 0.001 ); List<?> pois = fullTextSession.createQuery( "from " + POI.class.getName() ).list(); for (Object entity : pois) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testDistanceSort() throws Exception { POI poi = new POI( 1, "Distance to 24,32 : 0", 24.0d, 32.0d, "" ); POI poi2 = new POI( 2, "Distance to 24,32 : 24.45", 24.2d, 31.9d, "" ); POI poi3 = new POI( 3, "Distance to 24,32 : 10.16", 24.0d, 31.9d, "" ); POI poi4 = new POI( 4, "Distance to 24,32 : 15.06", 23.9d, 32.1d, "" ); POI poi5 = new POI( 5, "Distance to 24,32 : 11.12", 23.9d, 32.0d, "" ); POI poi6 = new POI( 6, "Distance to 24,32 : 22.24", 24.2d, 32.0d, "" ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( poi ); fullTextSession.save( poi2 ); fullTextSession.save( poi3 ); tx.commit(); tx = fullTextSession.beginTransaction(); fullTextSession.save( poi4 ); fullTextSession.save( poi5 ); fullTextSession.save( poi6 ); tx.commit(); tx = fullTextSession.beginTransaction(); double centerLatitude= 24.0d; double centerLongitude= 32.0d; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( POI.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "location" ) .within( 100, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); FullTextQuery hibQuery = fullTextSession.createFullTextQuery( luceneQuery, POI.class ); Sort distanceSort = new Sort( new DistanceSortField( centerLatitude, centerLongitude, "location" )); hibQuery.setSort( distanceSort ); hibQuery.setProjection( FullTextQuery.THIS, FullTextQuery.SPATIAL_DISTANCE ); hibQuery.setSpatialParameters( centerLatitude, centerLongitude, "location" ); List results = hibQuery.list(); List<?> pois = fullTextSession.createQuery( "from " + POI.class.getName() ).list(); for (Object entity : pois) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testNonGeoDistanceSort() throws Exception { NonGeoPOI poi = new NonGeoPOI( 1, "Distance to 24,32 : 0", 24.0d, null, "" ); NonGeoPOI poi2 = new NonGeoPOI( 2, "Distance to 24,32 : 24.45", 24.2d, 31.9d, "" ); NonGeoPOI poi3 = new NonGeoPOI( 3, "Distance to 24,32 : 10.16", 24.0d, 31.9d, "" ); NonGeoPOI poi4 = new NonGeoPOI( 4, "Distance to 24,32 : 15.06", 23.9d, 32.1d, "" ); NonGeoPOI poi5 = new NonGeoPOI( 5, "Distance to 24,32 : 11.12", 23.9d, 32.0d, "" ); NonGeoPOI poi6 = new NonGeoPOI( 6, "Distance to 24,32 : 22.24", 24.2d, 32.0d, "" ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( poi ); fullTextSession.save( poi2 ); fullTextSession.save( poi3 ); tx.commit(); tx = fullTextSession.beginTransaction(); fullTextSession.save( poi4 ); fullTextSession.save( poi5 ); fullTextSession.save( poi6 ); tx.commit(); tx = fullTextSession.beginTransaction(); double centerLatitude= 24.0d; double centerLongitude= 32.0d; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( NonGeoPOI.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.all().createQuery(); FullTextQuery hibQuery = fullTextSession.createFullTextQuery( luceneQuery, NonGeoPOI.class ); Sort distanceSort = new Sort( new DistanceSortField( centerLatitude, centerLongitude, "location" )); hibQuery.setSort( distanceSort ); hibQuery.setProjection( FullTextQuery.THIS, FullTextQuery.SPATIAL_DISTANCE ); hibQuery.setSpatialParameters( centerLatitude, centerLongitude, "location" ); List results = hibQuery.list(); List<?> pois = fullTextSession.createQuery( "from " + NonGeoPOI.class.getName() ).list(); for (Object entity : pois) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationOnFieldLevel() throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat("d M yyyy"); Date date = dateFormat.parse( "10 9 1976" ); Event event = new Event( 1, "Test", 24.0d, 32.0d, date ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( event ); tx.commit(); tx = fullTextSession.beginTransaction(); //Point center = Point.fromDegrees( 24, 31.5 ); // 50.79 km fromBoundingCircle 24.32 double centerLatitude= 24; double centerLongitude= 31.5; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( Event.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "location" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, Event.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "location" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, Event.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + Event.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationWithSubAnnotationsLevel() throws Exception { User user = new User( 1, 24.0d, 32.0d ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( user ); tx.commit(); tx = fullTextSession.beginTransaction(); //Point center = Point.fromDegrees( 24, 31.5 ); // 50.79 km fromBoundingCircle 24.32 double centerLatitude= 24; double centerLongitude= 31.5; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( User.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "home" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, User.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "home" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, User.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + User.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationWithSubAnnotationsLevelRangeMode() throws Exception { UserRange user = new UserRange( 1, 24.0d, 32.0d ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( user ); tx.commit(); tx = fullTextSession.beginTransaction(); //Point center = Point.fromDegrees( 24, 31.5 ); // 50.79 km fromBoundingCircle 24.32 double centerLatitude= 24; double centerLongitude= 31.5; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( UserRange.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onDefaultCoordinates() .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, UserRange.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onDefaultCoordinates() .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, UserRange.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + UserRange.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialsAnnotation() throws Exception { UserEx user = new UserEx( 1, 24.0d, 32.0d, 11.9d, 27.4d ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( user ); tx.commit(); tx = fullTextSession.beginTransaction(); final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( UserEx.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onDefaultCoordinates() .within( 100.0d, Unit.KM ).ofLatitude( 24.0d ).andLongitude( 31.5d ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, UserEx.class ); List results = hibQuery.list(); Assert.assertEquals( 1, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "work" ) .within( 100.0d, Unit.KM ).ofLatitude( 12.0d ).andLongitude( 27.5d ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, UserEx.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + UserEx.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationOnFieldLevelRangeMode() throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat( "d M yyyy" ); Date date = dateFormat.parse( "10 9 1976" ); RangeEvent event = new RangeEvent( 1, "Test", 24.0d, 32.0d, date ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( event ); tx.commit(); tx = fullTextSession.beginTransaction(); final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( RangeEvent.class ).get(); double centerLatitude= 24; double centerLongitude= 31.5; org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "location" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, RangeEvent.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "location" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, RangeEvent.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + RangeEvent.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationOnClassLevel() throws Exception { Hotel hotel = new Hotel( 1, "Plazza Athénée", 24.0d, 32.0d, "Luxurious" ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( hotel ); tx.commit(); tx = fullTextSession.beginTransaction(); //Point center = Point.fromDegrees( 24, 31.5 ); // 50.79 km fromBoundingCircle 24.32 double centerLatitude= 24; double centerLongitude= 31.5; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( Hotel.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "hotel_location" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, Hotel.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "hotel_location" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, Hotel.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + Hotel.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationOnClassLevelRangeMode() throws Exception { RangeHotel hotel = new RangeHotel( 1, "Plazza Athénée", 24.0d, 32.0d, "Luxurious" ); RangeHotel hotel2 = new RangeHotel( 2, "End of the world Hotel - Left", 0.0d, 179.0d, "Roots" ); RangeHotel hotel3 = new RangeHotel( 3, "End of the world Hotel - Right", 0.0d, -179.0d, "Cosy" ); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( hotel ); fullTextSession.save( hotel2 ); fullTextSession.save( hotel3 ); tx.commit(); tx = fullTextSession.beginTransaction(); //Point center = Point.fromDegrees( 24, 31.5 ); // 50.79 km fromBoundingCircle 24.32 double centerLatitude= 24; double centerLongitude= 31.5; final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( RangeHotel.class ).get(); org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "location" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, RangeHotel.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "location" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, RangeHotel.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); double endOfTheWorldLatitude= 0.0d; double endOfTheWorldLongitude= 180.0d; org.apache.lucene.search.Query luceneQuery3 = builder.spatial().onCoordinates( "location" ) .within( 112, Unit.KM ).ofLatitude( endOfTheWorldLatitude ).andLongitude( endOfTheWorldLongitude ).createQuery(); org.hibernate.Query hibQuery3 = fullTextSession.createFullTextQuery( luceneQuery3, RangeHotel.class ); List results3 = hibQuery3.list(); Assert.assertEquals( 2, results3.size() ); org.apache.lucene.search.Query luceneQuery4 = builder.spatial().onCoordinates( "location" ) .within( 100000, Unit.KM ).ofLatitude( endOfTheWorldLatitude ).andLongitude( endOfTheWorldLongitude ).createQuery(); org.hibernate.Query hibQuery4 = fullTextSession.createFullTextQuery( luceneQuery4, RangeHotel.class ); List results4 = hibQuery4.list(); Assert.assertEquals( 3, results4.size() ); List<?> events = fullTextSession.createQuery( "from " + RangeHotel.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } public void testSpatialAnnotationOnEmbeddableFieldLevel() throws Exception { Restaurant restaurant = new Restaurant( 1, "Al's kitchen", "42, space avenue CA8596 BYOB Street", 24.0d, 32.0d); FullTextSession fullTextSession = Search.getFullTextSession( openSession() ); Transaction tx = fullTextSession.beginTransaction(); fullTextSession.save( restaurant ); tx.commit(); tx = fullTextSession.beginTransaction(); final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity( Restaurant.class ).get(); double centerLatitude= 24; double centerLongitude= 31.5; org.apache.lucene.search.Query luceneQuery = builder.spatial().onCoordinates( "position.location" ) .within( 50, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( luceneQuery, Restaurant.class ); List results = hibQuery.list(); Assert.assertEquals( 0, results.size() ); org.apache.lucene.search.Query luceneQuery2 = builder.spatial().onCoordinates( "position.location" ) .within( 51, Unit.KM ).ofLatitude( centerLatitude ).andLongitude( centerLongitude ).createQuery(); org.hibernate.Query hibQuery2 = fullTextSession.createFullTextQuery( luceneQuery2, Restaurant.class ); List results2 = hibQuery2.list(); Assert.assertEquals( 1, results2.size() ); List<?> events = fullTextSession.createQuery( "from " + Restaurant.class.getName() ).list(); for (Object entity : events) { fullTextSession.delete( entity ); } tx.commit(); fullTextSession.close(); } @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { POI.class, Event.class, Hotel.class, User.class, UserRange.class, UserEx.class, RangeHotel.class, RangeEvent.class, Restaurant.class, NonGeoPOI.class }; } }