package mil.nga.giat.geowave.analytic.clustering; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.List; import org.geotools.feature.type.BasicFeatureTypes; 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 mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter; import mil.nga.giat.geowave.analytic.AnalyticFeature; import mil.nga.giat.geowave.analytic.AnalyticItemWrapper; import mil.nga.giat.geowave.analytic.SimpleFeatureItemWrapperFactory; import mil.nga.giat.geowave.analytic.clustering.CentroidManager.CentroidProcessingFn; import mil.nga.giat.geowave.core.geotime.ingest.SpatialDimensionalityTypeProvider; import mil.nga.giat.geowave.core.index.StringUtils; import mil.nga.giat.geowave.core.store.DataStore; import mil.nga.giat.geowave.core.store.IndexWriter; import mil.nga.giat.geowave.core.store.StoreFactoryFamilySpi; import mil.nga.giat.geowave.core.store.StoreFactoryOptions; import mil.nga.giat.geowave.core.store.adapter.AdapterStore; import mil.nga.giat.geowave.core.store.index.IndexStore; import mil.nga.giat.geowave.core.store.index.PrimaryIndex; import mil.nga.giat.geowave.core.store.memory.MemoryStoreFactoryFamily; public class CentroidManagerTest { private void ingest( final DataStore dataStore, final FeatureDataAdapter adapter, final PrimaryIndex index, final SimpleFeature feature ) throws IOException { try (IndexWriter writer = dataStore.createWriter( adapter, index)) { writer.write(feature); writer.close(); } } @Test public void testSampleRecall() throws IOException { final SimpleFeatureType ftype = AnalyticFeature.createGeometryFeatureAdapter( "centroid", new String[] { "extra1" }, BasicFeatureTypes.DEFAULT_NAMESPACE, ClusteringUtils.CLUSTERING_CRS).getFeatureType(); final GeometryFactory factory = new GeometryFactory(); final String grp1 = "g1"; final String grp2 = "g2"; SimpleFeature feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "123", "fred", grp1, 20.30203, factory.createPoint(new Coordinate( 02.33, 0.23)), new String[] { "extra1" }, new double[] { 0.022 }, 1, 1, 0); final PrimaryIndex index = new SpatialDimensionalityTypeProvider().createPrimaryIndex(); final FeatureDataAdapter adapter = new FeatureDataAdapter( ftype); final String namespace = "test_" + getClass().getName(); final StoreFactoryFamilySpi storeFamily = new MemoryStoreFactoryFamily(); StoreFactoryOptions opts = storeFamily.getDataStoreFactory().createOptionsInstance(); opts.setGeowaveNamespace(namespace); final DataStore dataStore = storeFamily.getDataStoreFactory().createStore( opts); final IndexStore indexStore = storeFamily.getIndexStoreFactory().createStore( opts); final AdapterStore adapterStore = storeFamily.getAdapterStoreFactory().createStore( opts); ingest( dataStore, adapter, index, feature); feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "231", "flood", grp1, 20.30203, factory.createPoint(new Coordinate( 02.33, 0.23)), new String[] { "extra1" }, new double[] { 0.022 }, 1, 1, 0); ingest( dataStore, adapter, index, feature); feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "321", "flou", grp2, 20.30203, factory.createPoint(new Coordinate( 02.33, 0.23)), new String[] { "extra1" }, new double[] { 0.022 }, 1, 1, 0); ingest( dataStore, adapter, index, feature); feature = AnalyticFeature.createGeometryFeature( ftype, "b2", "312", "flapper", grp2, 20.30203, factory.createPoint(new Coordinate( 02.33, 0.23)), new String[] { "extra1" }, new double[] { 0.022 }, 1, 1, 0); ingest( dataStore, adapter, index, feature); // and one feature with a different zoom level feature = AnalyticFeature.createGeometryFeature( ftype, "b2", "312", "flapper", grp2, 20.30203, factory.createPoint(new Coordinate( 02.33, 0.23)), new String[] { "extra1" }, new double[] { 0.022 }, 2, 1, 0); ingest( dataStore, adapter, index, feature); CentroidManagerGeoWave<SimpleFeature> manager = new CentroidManagerGeoWave<SimpleFeature>( dataStore, indexStore, adapterStore, new SimpleFeatureItemWrapperFactory(), StringUtils.stringFromBinary(adapter.getAdapterId().getBytes()), StringUtils.stringFromBinary(index.getId().getBytes()), "b1", 1); List<AnalyticItemWrapper<SimpleFeature>> centroids = manager.getCentroidsForGroup(null); assertEquals( 3, centroids.size()); feature = centroids.get( 0).getWrappedItem(); assertEquals( 0.022, (Double) feature.getAttribute("extra1"), 0.001); centroids = manager.getCentroidsForGroup(grp1); assertEquals( 2, centroids.size()); centroids = manager.getCentroidsForGroup(grp2); assertEquals( 1, centroids.size()); feature = centroids.get( 0).getWrappedItem(); assertEquals( 0.022, (Double) feature.getAttribute("extra1"), 0.001); manager = new CentroidManagerGeoWave<SimpleFeature>( dataStore, indexStore, adapterStore, new SimpleFeatureItemWrapperFactory(), StringUtils.stringFromBinary(adapter.getAdapterId().getBytes()), StringUtils.stringFromBinary(index.getId().getBytes()), "b1", 1); manager.processForAllGroups(new CentroidProcessingFn<SimpleFeature>() { @Override public int processGroup( final String groupID, final List<AnalyticItemWrapper<SimpleFeature>> centroids ) { if (groupID.equals(grp1)) { assertEquals( 2, centroids.size()); } else if (groupID.equals(grp2)) { assertEquals( 1, centroids.size()); } else { assertTrue( "what group is this : " + groupID, false); } return 0; } }); } }