package mil.nga.giat.geowave.adapter.vector.query.cql; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.List; import org.geotools.data.DataUtilities; import org.geotools.feature.SchemaException; import org.geotools.filter.text.cql2.CQLException; import org.junit.Before; import org.junit.Test; import org.opengis.feature.simple.SimpleFeatureType; import mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter; import mil.nga.giat.geowave.core.geotime.ingest.SpatialDimensionalityTypeProvider; import mil.nga.giat.geowave.core.geotime.ingest.SpatialTemporalDimensionalityTypeProvider; import mil.nga.giat.geowave.core.index.NumericIndexStrategy; import mil.nga.giat.geowave.core.index.sfc.data.MultiDimensionalNumericData; public class CQLQueryTest { private static final NumericIndexStrategy SPATIAL_INDEX_STRATEGY = new SpatialDimensionalityTypeProvider() .createPrimaryIndex() .getIndexStrategy(); private static final NumericIndexStrategy SPATIAL_TEMPORAL_INDEX_STRATEGY = new SpatialTemporalDimensionalityTypeProvider() .createPrimaryIndex() .getIndexStrategy(); SimpleFeatureType type; FeatureDataAdapter adapter; @Before public void init() throws SchemaException { type = DataUtilities.createType( "geostuff", "geometry:Geometry:srid=4326,pop:java.lang.Long,when:Date,pid:String"); adapter = new FeatureDataAdapter( type); } @Test public void testGeoAndTemporalWithMatchingIndex() throws CQLException { final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20) and when during 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z", adapter, null, null); final List<MultiDimensionalNumericData> constraints = query .getIndexConstraints(SPATIAL_TEMPORAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2, 1.116534776001E12 })); assertTrue(Arrays.equals( constraints.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3, 1.116538375999E12 })); } @Test public void testGeoAndTemporalWithNonMatchingIndex() throws CQLException { final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20) and when during 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z", adapter, null, null); final List<MultiDimensionalNumericData> constraints = query.getIndexConstraints(SPATIAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2 })); assertTrue(Arrays.equals( constraints.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3 })); } @Test public void testGeoWithMatchingIndex() throws CQLException { final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20)", adapter, null, null); final List<MultiDimensionalNumericData> constraints = query.getIndexConstraints(SPATIAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2 })); assertTrue(Arrays.equals( constraints.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3 })); } @Test public void testNoConstraintsWithGeoIndex() throws CQLException { final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "pid = '10'", adapter, null, null); assertTrue(query.getIndexConstraints( SPATIAL_INDEX_STRATEGY).isEmpty()); } @Test public void testNoConstraintsWithTemporalIndex() throws CQLException { final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "pid = '10'", adapter, null, null); assertTrue(query.getIndexConstraints( SPATIAL_TEMPORAL_INDEX_STRATEGY).isEmpty()); } @Test public void testGeoWithTemporalIndex() throws CQLException { final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20)", adapter, null, null); assertTrue(query.getIndexConstraints( SPATIAL_TEMPORAL_INDEX_STRATEGY).isEmpty()); } @Test public void testGeoTemporalRangeWithMatchingIndex() throws CQLException, SchemaException { final SimpleFeatureType type = DataUtilities.createType( "geostuff", "geometry:Geometry:srid=4326,pop:java.lang.Long,start:Date,end:Date,pid:String"); final FeatureDataAdapter adapter = new FeatureDataAdapter( type); final CQLQuery query = (CQLQuery) CQLQuery.createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20) and start during 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z", adapter, null, null); final List<MultiDimensionalNumericData> constraints = query .getIndexConstraints(SPATIAL_TEMPORAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2, 1.116534776001E12 })); assertTrue(Arrays.equals( constraints.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3, 1.116538375999E12 })); final CQLQuery query2 = (CQLQuery) CQLQuery.createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20) and end during 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z", adapter, null, null); final List<MultiDimensionalNumericData> constraints2 = query2 .getIndexConstraints(SPATIAL_TEMPORAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints2.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2, 1.116534776001E12 })); assertTrue(Arrays.equals( constraints2.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3, 1.116538375999E12 })); final CQLQuery query3 = (CQLQuery) CQLQuery .createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20) and (start before 2005-05-19T21:32:56Z and end after 2005-05-19T20:32:56Z)", adapter, null, null); final List<MultiDimensionalNumericData> constraints3 = query3 .getIndexConstraints(SPATIAL_TEMPORAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints3.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2, 1.116534776001E12 })); assertTrue(Arrays.equals( constraints3.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3, 1.116538375999E12 })); final CQLQuery query4 = (CQLQuery) CQLQuery .createOptimalQuery( "BBOX(geometry,27.20,41.30,27.30,41.20) and (start after 2005-05-19T20:32:56Z and end after 2005-05-19T20:32:56Z)", adapter, null, null); final List<MultiDimensionalNumericData> constraints4 = query4 .getIndexConstraints(SPATIAL_TEMPORAL_INDEX_STRATEGY); assertTrue(Arrays.equals( constraints4.get( 0).getMinValuesPerDimension(), new double[] { 27.2, 41.2, 1.116534776001E12 })); assertTrue(Arrays.equals( constraints4.get( 0).getMaxValuesPerDimension(), new double[] { 27.3, 41.3, 9.223372036854775999E18 })); } }