Hi,
 
I am using a mid-June version of GeoMesa.  Perhaps this issue has been fixed since mid-June, but if it hasn’t been I thought I should report it.
 
I am having trouble with the featureStore.removeFeatures(filter) capability in GeoMesa.  My problem is that I cannot seem to be able to add a feature once I have removed a feature with the same feature ID.  When I invoke “featureStore.addFeatures(features)”,
 I do not get an exception; however, the feature is not added to GeoMesa.  I would like to be able to add/remove/add features with the same ID.
 
Here is some partial code that illustrates my problem.  Please note the line that I have commented with “this assertion fails”.
 
                @Test
                public void testRemoveFeatureByID_AddRemoveAdd()
                {
                                // add three features, then remove one and verify its removal
                                
                                String id1 = "ID1";
                                assertTrue(addFeature(id1, 45.1d, 123.4, 15L));
                                String id2 = "ID2";
                                assertTrue(addFeature(id2, 45.0d, 123.3, 16L));
                                String id3 = "ID3";
                                assertTrue(addFeature(id3, 45.2d, 123.5, 17L));
                                
                                this.geoMesaHelper.removeFeatureByID(GeoMesaHelperTest.FEATURE_NAME, id1);
                                
                                Set<String> ids = this.geoMesaHelper.getIDsFromFeatureCollection(this.geoMesaHelper.query(this.dataStore, GeoMesaHelperTest.FEATURE_NAME, ""));
                                
                                assertNotNull(ids);
                                assertEquals(2, ids.size());
                                assertTrue(ids.contains(id2));
                                assertTrue(ids.contains(id3));
                                
                                // add back feature with id1 with different SKU
                                assertTrue(addFeature(id1, 45.1d, 123.4, 25L));
                                
                                // add a uniquely new feature that hasn't been added before
                                String id4 = "ID4";
                                assertTrue(addFeature(id4, 45.25d, 123.55, 18L));
                                
                                ids = this.geoMesaHelper.getIDsFromFeatureCollection(this.geoMesaHelper.query(this.dataStore, GeoMesaHelperTest.FEATURE_NAME, ""));
                                                               
                                assertNotNull(ids);
                                assertTrue(ids.contains(id4));
                                assertTrue(ids.contains(id2));
                                assertTrue(ids.contains(id3));
                                assertTrue(ids.contains(id1)); // this assertion fails
                                assertEquals(4, ids.size());
                }
 
                private boolean addFeature(String uniqueID, double latitude, double longitude, long sku)
                {
                                String featureSchema = "NAME:String,SKU:java.lang.Long,COST:Double,SELL_BY:Date," +
                                                                "*" + GeoMesaHelperTest.GEOMESA_GEOMETRY  + ":Geometry:srid=4326," +
                                                                GeoMesaHelperTest.GEOMESA_TIME + ":Date";
 
                                // Create feature
                                SimpleFeatureType featureType = this.geoMesaHelper.createFeatureType(dataStore, GeoMesaHelperTest.FEATURE_NAME, featureSchema, GeoMesaIndexer.GEOMESA_TIME_ATTRIBUTE_NAME);
                                SimpleFeatureBuilder simpleFeatureBuilder = new SimpleFeatureBuilder(featureType);
                                Object[] noValues = {};
                                SimpleFeature feature = simpleFeatureBuilder.buildFeature(uniqueID, noValues);
                                feature.getUserData().put(Hints.USE_PROVIDED_FID, java.lang.Boolean.TRUE);
                                
                                // create a geometric rectangle centered at the input latitude/longitude
                                double DLAT = 2.0d;
                                double DLON = 2.0d;
                                double minlat = latitude-DLAT/2.0d;
                                double minlon = longitude-DLON/2.0d;
                                double maxlat = latitude+DLAT/2.0d;
                                double maxlon = longitude+DLON/2.0d;
                                int srid = 4326;
                                Geometry geometry = GeoIndexerUtilities.createRectangleFromLatLon(minlat, minlon, maxlat, maxlon, srid);
                                feature.setAttribute(GEOMESA_GEOMETRY, geometry);
                                
                                feature.setAttribute("NAME", GeoMesaHelperTest.NAME_ATTRIBUTE);
                                feature.setAttribute("SKU", sku);
                                feature.setAttribute("COST", 1.23);
                                feature.setAttribute("SELL_BY", new Date());
                                feature.setAttribute(GEOMESA_TIME, new Date());
 
                                // Add feature to GeoMesa
                                FeatureStore<SimpleFeatureType, SimpleFeature> featureStore = this.geoMesaHelper.createFeatureStore(dataStore, GeoMesaHelperTest.FEATURE_NAME);
                                DefaultFeatureCollection features = new DefaultFeatureCollection();
                                features.add(feature);
                                try
                                {
                                                featureStore.addFeatures(features);
                                }
                                catch (IOException e)
                                {
                                                return false;
                                }
 
                                return true;
                }
 
 
Is there something I am doing wrong?  Is there a workaround?
 
Thanks,
 
Beau