Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[geomesa-users] Possible bug with removing features, cannot add a feature with same ID as a feature that has been removed

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


Back to the top