package mil.nga.giat.geowave.adapter.vector.plugin; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; import org.geotools.data.DataStore; import org.geotools.data.DataUtilities; import org.geotools.data.DefaultTransaction; import org.geotools.data.DelegatingFeatureReader; import org.geotools.data.FeatureReader; import org.geotools.data.FeatureWriter; import org.geotools.data.Query; import org.geotools.data.Transaction; import org.geotools.feature.SchemaException; import org.geotools.feature.visitor.MaxVisitor; import org.geotools.feature.visitor.MinVisitor; import org.geotools.filter.FilterFactoryImpl; import org.geotools.filter.text.cql2.CQLException; import org.geotools.filter.text.ecql.ECQL; import org.junit.Before; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.PrecisionModel; import mil.nga.giat.geowave.adapter.vector.BaseDataStoreTest; import mil.nga.giat.geowave.adapter.vector.utils.DateUtilities; public class GeoWaveFeatureReaderTest extends BaseDataStoreTest { DataStore dataStore; SimpleFeatureType schema; SimpleFeatureType type; final GeometryFactory factory = new GeometryFactory( new PrecisionModel( PrecisionModel.FIXED)); Query query = null; List<String> fids = new ArrayList<String>(); List<String> pids = new ArrayList<String>(); Date stime, etime; @Before public void setup() throws SchemaException, CQLException, Exception { dataStore = createDataStore(); type = DataUtilities.createType( "GeoWaveFeatureReaderTest", "geometry:Geometry:srid=4326,start:Date,end:Date,pop:java.lang.Long,pid:String"); dataStore.createSchema(type); stime = DateUtilities.parseISO("2005-05-15T20:32:56Z"); etime = DateUtilities.parseISO("2005-05-20T20:32:56Z"); final Transaction transaction1 = new DefaultTransaction(); final FeatureWriter<SimpleFeatureType, SimpleFeature> writer = dataStore.getFeatureWriter( type.getTypeName(), transaction1); assertFalse(writer.hasNext()); SimpleFeature newFeature = writer.next(); newFeature.setAttribute( "pop", Long.valueOf(100)); newFeature.setAttribute( "pid", "a" + UUID.randomUUID().toString()); newFeature.setAttribute( "start", stime); newFeature.setAttribute( "end", etime); newFeature.setAttribute( "geometry", factory.createPoint(new Coordinate( 27.25, 41.25))); fids.add(newFeature.getID()); pids.add(newFeature.getAttribute( "pid").toString()); writer.write(); newFeature = writer.next(); newFeature.setAttribute( "pop", Long.valueOf(101)); newFeature.setAttribute( "pid", "b" + UUID.randomUUID().toString()); newFeature.setAttribute( "start", etime); newFeature.setAttribute( "geometry", factory.createPoint(new Coordinate( 28.25, 41.25))); fids.add(newFeature.getID()); pids.add(newFeature.getAttribute( "pid").toString()); writer.write(); writer.close(); transaction1.commit(); transaction1.close(); // System.out.println(fids); query = new Query( "GeoWaveFeatureReaderTest", ECQL.toFilter("IN ('" + fids.get(0) + "')"), new String[] { "geometry", "pid" }); } @Test public void testFID() throws IllegalArgumentException, NoSuchElementException, IOException, CQLException { final FeatureReader<SimpleFeatureType, SimpleFeature> reader = dataStore.getFeatureReader( query, Transaction.AUTO_COMMIT); int count = 0; while (reader.hasNext()) { final SimpleFeature feature = reader.next(); assertTrue(fids.contains(feature.getID())); count++; } assertTrue(count > 0); } @Test public void testBBOX() throws IllegalArgumentException, NoSuchElementException, IOException { final FilterFactoryImpl factory = new FilterFactoryImpl(); final Query query = new Query( "GeoWaveFeatureReaderTest", factory.bbox( "", -180, -90, 180, 90, "EPSG:4326"), new String[] { "geometry", "pid" }); final FeatureReader<SimpleFeatureType, SimpleFeature> reader = dataStore.getFeatureReader( query, Transaction.AUTO_COMMIT); int count = 0; while (reader.hasNext()) { final SimpleFeature feature = reader.next(); assertTrue(fids.contains(feature.getID())); count++; } assertTrue(count > 0); } @Test public void testRangeIndex() throws IllegalArgumentException, NoSuchElementException, IOException { final FeatureReader<SimpleFeatureType, SimpleFeature> reader = dataStore.getFeatureReader( query, Transaction.AUTO_COMMIT); int count = 0; while (reader.hasNext()) { final SimpleFeature feature = reader.next(); assertTrue(fids.contains(feature.getID())); count++; } assertEquals( 1, count); } @Test public void testLike() throws IllegalArgumentException, NoSuchElementException, IOException, CQLException { System.out.println(pids); final Query query = new Query( "GeoWaveFeatureReaderTest", ECQL.toFilter("pid like '" + pids.get( 0).substring( 0, 1) + "%'"), new String[] { "geometry", "pid" }); final FeatureReader<SimpleFeatureType, SimpleFeature> reader = dataStore.getFeatureReader( query, Transaction.AUTO_COMMIT); int count = 0; while (reader.hasNext()) { final SimpleFeature feature = reader.next(); assertTrue(fids.contains(feature.getID())); count++; } assertEquals( 1, count); } @Test public void testMax() throws IllegalArgumentException, NoSuchElementException, IOException { final FeatureReader<SimpleFeatureType, SimpleFeature> reader = dataStore.getFeatureReader( query, Transaction.AUTO_COMMIT); final MaxVisitor visitor = new MaxVisitor( "start", type); unwrapDelegatingFeatureReader( reader).getFeatureCollection().accepts( visitor, null); assertTrue(visitor.getMax().equals( etime)); } @Test public void testMin() throws IllegalArgumentException, NoSuchElementException, IOException { final FeatureReader<SimpleFeatureType, SimpleFeature> reader = dataStore.getFeatureReader( query, Transaction.AUTO_COMMIT); final MinVisitor visitor = new MinVisitor( "start", type); unwrapDelegatingFeatureReader( reader).getFeatureCollection().accepts( visitor, null); assertTrue(visitor.getMin().equals( stime)); } private GeoWaveFeatureReader unwrapDelegatingFeatureReader( final FeatureReader<SimpleFeatureType, SimpleFeature> reader ) { // GeoTools uses decorator pattern to wrap FeatureReaders // we need to get down to the inner GeoWaveFeatureReader FeatureReader<SimpleFeatureType, SimpleFeature> currReader = reader; while (!(currReader instanceof GeoWaveFeatureReader)) { currReader = ((DelegatingFeatureReader<SimpleFeatureType, SimpleFeature>) currReader).getDelegate(); } return (GeoWaveFeatureReader) currReader; } }