package mil.nga.giat.geowave.core.geotime.store.query;
import static org.junit.Assert.assertEquals;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import mil.nga.giat.geowave.core.geotime.index.dimension.TemporalBinningStrategy.Unit;
import mil.nga.giat.geowave.core.geotime.ingest.SpatialTemporalDimensionalityTypeProvider;
import mil.nga.giat.geowave.core.geotime.store.dimension.GeometryAdapter;
import mil.nga.giat.geowave.core.geotime.store.dimension.GeometryWrapper;
import mil.nga.giat.geowave.core.geotime.store.dimension.Time.TimeRange;
import mil.nga.giat.geowave.core.geotime.store.dimension.TimeField;
import mil.nga.giat.geowave.core.geotime.store.filter.SpatialQueryFilter.CompareOperation;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.data.CommonIndexedPersistenceEncoding;
import mil.nga.giat.geowave.core.store.data.PersistentDataset;
import mil.nga.giat.geowave.core.store.data.PersistentValue;
import mil.nga.giat.geowave.core.store.filter.QueryFilter;
import mil.nga.giat.geowave.core.store.index.CommonIndexModel;
import mil.nga.giat.geowave.core.store.index.CommonIndexValue;
import org.junit.Test;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
public class SpatialTemporalQueryTest
{
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ssz");
@Test
public void test()
throws ParseException {
final GeometryFactory factory = new GeometryFactory();
final SpatialTemporalQuery query = new SpatialTemporalQuery(
df.parse("2005-05-17T19:32:56GMT-00:00"),
df.parse("2005-05-17T22:32:56GMT-00:00"),
factory.createPolygon(new Coordinate[] {
new Coordinate(
24,
33),
new Coordinate(
28,
33),
new Coordinate(
28,
31),
new Coordinate(
24,
31),
new Coordinate(
24,
33)
}));
final SpatialTemporalQuery queryCopy = new SpatialTemporalQuery();
queryCopy.fromBinary(query.toBinary());
assertEquals(
queryCopy.getQueryGeometry(),
query.getQueryGeometry());
}
private CommonIndexedPersistenceEncoding createData(
final Date start,
final Date end,
final Coordinate[] coordinates ) {
final GeometryFactory factory = new GeometryFactory();
final PersistentDataset<CommonIndexValue> commonData = new PersistentDataset<CommonIndexValue>();
commonData.addValue(new PersistentValue<CommonIndexValue>(
GeometryAdapter.DEFAULT_GEOMETRY_FIELD_ID,
new GeometryWrapper(
factory.createLineString(coordinates))));
commonData.addValue(new PersistentValue<CommonIndexValue>(
new TimeField(
Unit.YEAR).getFieldId(),
new TimeRange(
start.getTime(),
end.getTime(),
new byte[0])));
return new CommonIndexedPersistenceEncoding(
new ByteArrayId(
"1"),
new ByteArrayId(
"1"),
new ByteArrayId(
"1"),
1,
commonData,
new PersistentDataset<byte[]>());
}
public void performOp(
final CompareOperation op,
final boolean[] expectedResults )
throws ParseException {
final GeometryFactory factory = new GeometryFactory();
final SpatialTemporalQuery query = new SpatialTemporalQuery(
df.parse("2005-05-17T19:32:56GMT-00:00"),
df.parse("2005-05-17T22:32:56GMT-00:00"),
factory.createPolygon(new Coordinate[] {
new Coordinate(
24,
33),
new Coordinate(
28,
33),
new Coordinate(
28,
37),
new Coordinate(
24,
37),
new Coordinate(
24,
33)
}),
op);
final SpatialQuery queryCopy = new SpatialQuery();
queryCopy.fromBinary(query.toBinary());
final CommonIndexedPersistenceEncoding[] data = new CommonIndexedPersistenceEncoding[] {
createData(
df.parse("2005-05-17T19:32:56GMT-00:00"),
df.parse("2005-05-17T22:32:56GMT-00:00"),
new Coordinate[] {
new Coordinate(
25,
33.5),
new Coordinate(
26,
34)
}),
createData(
df.parse("2005-05-17T17:32:56GMT-00:00"),
df.parse("2005-05-17T21:32:56GMT-00:00"),
new Coordinate[] {
new Coordinate(
25,
33.5),
new Coordinate(
26,
34)
}),
createData(
df.parse("2005-05-17T19:33:56GMT-00:00"),
df.parse("2005-05-17T20:32:56GMT-00:00"),
new Coordinate[] {
new Coordinate(
25,
33.5),
new Coordinate(
26,
34)
}),
createData(
df.parse("2005-05-17T16:32:56GMT-00:00"),
df.parse("2005-05-17T21:32:56GMT-00:00"),
new Coordinate[] {
new Coordinate(
25,
33.5),
new Coordinate(
26,
34)
}),
createData(
df.parse("2005-05-17T22:33:56GMT-00:00"),
df.parse("2005-05-17T22:34:56GMT-00:00"),
new Coordinate[] {
new Coordinate(
25,
33.5),
new Coordinate(
26,
34)
})
};
final CommonIndexModel model = new SpatialTemporalDimensionalityTypeProvider()
.createPrimaryIndex()
.getIndexModel();
int pos = 0;
for (final CommonIndexedPersistenceEncoding dataItem : data) {
for (final QueryFilter filter : queryCopy.createFilters(model)) {
assertEquals(
"result: " + pos,
expectedResults[pos++],
filter.accept(
model,
dataItem));
}
}
}
@Test
public void testContains()
throws ParseException {
performOp(
CompareOperation.CONTAINS,
new boolean[] {
true,
false,
true,
false,
false
});
}
@Test
public void testOverlaps()
throws ParseException {
performOp(
CompareOperation.OVERLAPS,
new boolean[] {
false,
false,
false,
false,
false
});
}
@Test
public void testIntersects()
throws ParseException {
performOp(
CompareOperation.INTERSECTS,
new boolean[] {
true,
true,
true,
true,
false
});
}
}