package org.infinispan.query.queries.spatial; import static org.testng.AssertJUnit.assertEquals; import java.util.List; import org.apache.lucene.search.Query; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.Spatial; import org.hibernate.search.annotations.SpatialMode; import org.hibernate.search.annotations.Store; import org.hibernate.search.query.dsl.Unit; import org.hibernate.search.spatial.Coordinates; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.query.CacheQuery; import org.infinispan.query.Search; import org.infinispan.test.AbstractCacheTest; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * Testing and verifying that Spatial queries work properly. The information on the coordinates was taken from the * hibernate-search tests. * * @author Anna Manukyan */ @Test(groups = {"functional", "smoke"}, testName = "query.queries.spatial.QuerySpatialTest") public class QuerySpatialTest extends SingleCacheManagerTest { public QuerySpatialTest() { cleanup = AbstractCacheTest.CleanupPhase.AFTER_METHOD; } @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(true); cfg.indexing() .index(Index.ALL) .addIndexedEntity(CitySpatial.class) .addProperty("default.directory_provider", "ram") .addProperty("lucene_version", "LUCENE_CURRENT"); return TestCacheManagerFactory.createCacheManager(cfg); } public void testSpatialQueries() { loadData(); double centerLatitude = 24; double centerLongitude = 31.5; Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(CitySpatial.class).get().spatial() .onField("city_location") .within(50, Unit.KM).ofLatitude(centerLatitude).andLongitude(centerLongitude).createQuery(); CacheQuery<?> cacheQuery = Search.getSearchManager(cache).getQuery(query); List<?> found = cacheQuery.list(); assertEquals(0, found.size()); query = Search.getSearchManager(cache).buildQueryBuilderForClass(CitySpatial.class).get().spatial() .onField("city_location") .within(51, Unit.KM).ofLatitude(centerLatitude).andLongitude(centerLongitude).createQuery(); cacheQuery = Search.getSearchManager(cache).getQuery(query); found = cacheQuery.list(); assertEquals(1, found.size()); } private void loadData() { CitySpatial city1 = new CitySpatial(24.0d, 32.0d, "Some City"); cache.put("key1", city1); } @Indexed @Spatial(name = "city_location", spatialMode = SpatialMode.HASH) static public class CitySpatial implements Coordinates { private Double latitude; private Double longitude; @Field(store = Store.YES) String name; public CitySpatial(Double latitude, Double longitude, String name) { this.latitude = latitude; this.longitude = longitude; this.name = name; } public Double getLatitude() { return latitude; } public Double getLongitude() { return longitude; } } }