package mil.nga.giat.geowave.analytic.clustering; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.ArrayList; 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.SimpleFeatureItemWrapperFactory; import mil.nga.giat.geowave.analytic.distance.FeatureCentroidDistanceFn; import mil.nga.giat.geowave.analytic.kmeans.AssociationNotification; 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.adapter.WritableDataAdapter; 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 NestedGroupCentroidAssignmentTest { private <T> void ingest( final DataStore dataStore, final WritableDataAdapter<T> adapter, final PrimaryIndex index, final T entry ) throws IOException { try (IndexWriter writer = dataStore.createWriter( adapter, index)) { writer.write(entry); writer.close(); } } @Test public void test() 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"; final SimpleFeature level1b1G1Feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "level1b1G1Feature", "fred", grp1, 20.30203, factory.createPoint(new Coordinate( 02.5, 0.25)), 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, level1b1G1Feature); final SimpleFeature level1b1G2Feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "level1b1G2Feature", "flood", grp2, 20.30203, factory.createPoint(new Coordinate( 02.03, 0.2)), new String[] { "extra1" }, new double[] { 0.022 }, 1, 1, 0); ingest( dataStore, adapter, index, level1b1G2Feature); final SimpleFeature level2b1G1Feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "level2b1G1Feature", "flou", level1b1G1Feature.getID(), 20.30203, factory.createPoint(new Coordinate( 02.5, 0.25)), new String[] { "extra1" }, new double[] { 0.022 }, 2, 1, 0); ingest( dataStore, adapter, index, level2b1G1Feature); final SimpleFeature level2b1G2Feature = AnalyticFeature.createGeometryFeature( ftype, "b1", "level2b1G2Feature", "flapper", level1b1G2Feature.getID(), 20.30203, factory.createPoint(new Coordinate( 02.03, 0.2)), new String[] { "extra1" }, new double[] { 0.022 }, 2, 1, 0); ingest( dataStore, adapter, index, level2b1G2Feature); // different batch final SimpleFeature level2B2G1Feature = AnalyticFeature.createGeometryFeature( ftype, "b2", "level2B2G1Feature", "flapper", level1b1G1Feature.getID(), 20.30203, factory.createPoint(new Coordinate( 02.63, 0.25)), new String[] { "extra1" }, new double[] { 0.022 }, 2, 1, 0); ingest( dataStore, adapter, index, level2B2G1Feature); final SimpleFeatureItemWrapperFactory wrapperFactory = new SimpleFeatureItemWrapperFactory(); final CentroidManagerGeoWave<SimpleFeature> mananger = new CentroidManagerGeoWave<SimpleFeature>( dataStore, indexStore, adapterStore, new SimpleFeatureItemWrapperFactory(), StringUtils.stringFromBinary(adapter.getAdapterId().getBytes()), StringUtils.stringFromBinary(index.getId().getBytes()), "b1", 1); final List<CentroidPairing<SimpleFeature>> capturedPairing = new ArrayList<CentroidPairing<SimpleFeature>>(); final AssociationNotification<SimpleFeature> assoc = new AssociationNotification<SimpleFeature>() { @Override public void notify( final CentroidPairing<SimpleFeature> pairing ) { capturedPairing.add(pairing); } }; final FeatureCentroidDistanceFn distanceFn = new FeatureCentroidDistanceFn(); final NestedGroupCentroidAssignment<SimpleFeature> assigmentB1 = new NestedGroupCentroidAssignment<SimpleFeature>( mananger, 1, "b1", distanceFn); assigmentB1.findCentroidForLevel( wrapperFactory.create(level1b1G1Feature), assoc); assertEquals( 1, capturedPairing.size()); assertEquals( level1b1G1Feature.getID(), capturedPairing.get( 0).getCentroid().getID()); capturedPairing.clear(); final NestedGroupCentroidAssignment<SimpleFeature> assigmentB1L2G1 = new NestedGroupCentroidAssignment<SimpleFeature>( mananger, 2, "b1", distanceFn); assigmentB1L2G1.findCentroidForLevel( wrapperFactory.create(level1b1G1Feature), assoc); assertEquals( 1, capturedPairing.size()); assertEquals( level2b1G1Feature.getID(), capturedPairing.get( 0).getCentroid().getID()); capturedPairing.clear(); // level 2 and different parent grouping final NestedGroupCentroidAssignment<SimpleFeature> assigmentB1L2G2 = new NestedGroupCentroidAssignment<SimpleFeature>( mananger, 2, "b1", distanceFn); assigmentB1L2G2.findCentroidForLevel( wrapperFactory.create(level1b1G2Feature), assoc); assertEquals( 1, capturedPairing.size()); assertEquals( level2b1G2Feature.getID(), capturedPairing.get( 0).getCentroid().getID()); capturedPairing.clear(); // level two with different batch than parent final CentroidManagerGeoWave<SimpleFeature> mananger2 = new CentroidManagerGeoWave<SimpleFeature>( dataStore, indexStore, adapterStore, new SimpleFeatureItemWrapperFactory(), StringUtils.stringFromBinary(adapter.getAdapterId().getBytes()), StringUtils.stringFromBinary(index.getId().getBytes()), "b2", 2); final NestedGroupCentroidAssignment<SimpleFeature> assigmentB2L2 = new NestedGroupCentroidAssignment<SimpleFeature>( mananger2, 2, "b1", distanceFn); assigmentB2L2.findCentroidForLevel( wrapperFactory.create(level1b1G1Feature), assoc); assertEquals( 1, capturedPairing.size()); assertEquals( level2B2G1Feature.getID(), capturedPairing.get( 0).getCentroid().getID()); capturedPairing.clear(); } }