/* * GeotoolKit - An Open source Java GIS Toolkit * http://geotoolkit.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.data.shapefile.indexed; import org.junit.Test; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.sis.storage.DataStoreException; import org.geotoolkit.data.FeatureStoreUtilities; import org.geotoolkit.data.FeatureIterator; import org.geotoolkit.data.query.Query; import org.geotoolkit.data.query.QueryBuilder; import org.geotoolkit.data.session.Session; import org.geotoolkit.factory.FactoryFinder; import org.opengis.util.GenericName; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; import org.opengis.filter.Id; import org.opengis.filter.identity.FeatureId; import org.opengis.filter.spatial.BBOX; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import org.apache.sis.feature.FeatureExt; import org.geotoolkit.data.FeatureWriter; import static org.junit.Assert.*; import org.junit.Ignore; import org.opengis.feature.Feature; import org.opengis.feature.FeatureType; import org.opengis.feature.PropertyType; public class FidQueryTest extends FIDTestCase { private IndexedShapefileFeatureStore ds; private static final FilterFactory2 fac = (FilterFactory2) FactoryFinder.getFilterFactory(null); private Map<String, Feature> fids = new HashMap<>(); private GenericName name; private Session session; private int numFeatures; @Override public void setUp() throws Exception { super.setUp(); final URI uri = backshp.toURI(); ds = new IndexedShapefileFeatureStore(uri, null, false, true, IndexType.QIX,null); numFeatures = 0; name = ds.getNames().iterator().next(); session = ds.createSession(true); final FeatureIterator features = ds.getFeatureReader(QueryBuilder.all(name)); try { while (features.hasNext()) { numFeatures++; final Feature feature = features.next(); fids.put(FeatureExt.getId(feature).getID(), feature); } } finally { if (features != null) features.close(); } assertEquals(numFeatures, fids.size()); } @Test public void testGetByFID() throws Exception { assertFidsMatch(); } @Test @Ignore public void testAddFeature() throws Exception { Feature feature = fids.values().iterator().next(); final FeatureType schema = ds.getFeatureType(ds.getName().toString()); final Feature newFeature = schema.newInstance(); final GeometryFactory gf = new GeometryFactory(); newFeature.setPropertyValue("a",gf.createPoint((new Coordinate(0, 0)))); newFeature.setPropertyValue("b",new Long(0)); newFeature.setPropertyValue("c",new Long(0)); newFeature.setPropertyValue("d","Hey"); final Collection<Feature> collection = new ArrayList<>(); collection.add(newFeature); final List<FeatureId> newFids; try(FeatureWriter writer = ds.getFeatureWriter(QueryBuilder.filtered(name.toString(), Filter.EXCLUDE))){ newFids = FeatureStoreUtilities.write(writer, collection); } assertEquals(1, newFids.size()); // this.assertFidsMatch(); final FeatureId id = newFids.iterator().next(); final Filter filter = fac.id(Collections.singleton(id)); final QueryBuilder builder = new QueryBuilder(); builder.setTypeName(schema.getName()); builder.setFilter(filter); final Query query = builder.buildQuery(); final FeatureIterator features = ds.getFeatureReader(query); try { feature = features.next(); for(PropertyType desc : schema.getProperties(true)){ final Object value = feature.getPropertyValue(desc.getName().tip().toString()); final Object newValue = newFeature.getPropertyValue(desc.getName().tip().toString()); if (value instanceof Geometry) { assertTrue(((Geometry) newValue).equals((Geometry) value)); } else { assertEquals(newValue, value); } } assertFalse(features.hasNext()); } finally { if (features != null) features.close(); } } @Test public void testModifyFeature() throws Exception { final Feature feature = this.fids.values().iterator().next(); final long newId = 237594123; final Id createFidFilter = fac.id(Collections.singleton(FeatureExt.getId(feature))); final FeatureType schema = feature.getType(); session.updateFeatures(schema.getName().toString(),createFidFilter, Collections.singletonMap("ID", newId)); session.commit(); final FeatureIterator features = ds.getFeatureReader(QueryBuilder.filtered(name.toString(), createFidFilter)); try { assertFalse(feature.equals(features.next())); } finally { if (features != null) { features.close(); } } feature.setPropertyValue("ID", newId); this.assertFidsMatch(); } @Test public void testDeleteFeature() throws Exception { FeatureIterator features = ds.getFeatureReader(QueryBuilder.all(name.toString())); Feature feature; try { feature = features.next(); } finally { if (features != null) features.close(); } final Id createFidFilter = fac.id(Collections.singleton(FeatureExt.getId(feature))); session.removeFeatures(name.toString(),createFidFilter); session.commit(); fids.remove(FeatureExt.getId(feature).getID()); assertEquals(fids.size(), ds.getCount(QueryBuilder.all(name.toString()))); features = ds.getFeatureReader(QueryBuilder.filtered(name.toString(), createFidFilter)); try { assertFalse(features.hasNext()); } finally { if (features != null) features.close(); } this.assertFidsMatch(); } @Test public void testFIDBBoxQuery() throws Exception { FeatureIterator features = ds.getFeatureReader(QueryBuilder.all(name.toString())); Feature feature; try { feature = features.next(); feature = features.next(); feature = features.next(); } finally { if (features != null) features.close(); } // FilterFactory factory = FilterFactoryFinder.createFilterFactory(); // BBoxExpression bb = // factory.createBBoxExpression(feature.getBounds()); // // GeometryFilter bboxFilter = // factory.createGeometryFilter(FilterType.GEOMETRY_INTERSECTS); // bboxFilter.addRightGeometry(bb); // // String geom = ds.getSchema().getDefaultGeometry().getLocalName(); // // bboxFilter.addLeftGeometry(factory.createAttributeExpression(geom)); FilterFactory2 ff = (FilterFactory2) FactoryFinder.getFilterFactory(null); BBOX bbox = ff.bbox(ff.property(""), FeatureExt.getEnvelope(feature)); features = ds.getFeatureReader(QueryBuilder.filtered(name.toString(), bbox)); try { while (features.hasNext()) { Feature newFeature = features.next(); assertEquals(newFeature, fids.get(FeatureExt.getId(newFeature).getID())); } } finally { if (features != null) features.close(); } } private void assertFidsMatch() throws IOException, DataStoreException { int i = 0; for (Iterator<Entry<String,Feature>> iter = fids.entrySet().iterator(); iter.hasNext();) { i++; final Entry<String,Feature> entry = iter.next(); final String fid = (String) entry.getKey(); final FeatureId id = fac.featureId(fid); final Filter filter = fac.id(Collections.singleton(id)); final Query query = QueryBuilder.filtered(name.toString(), filter); final FeatureIterator features = ds.getFeatureReader(query); try { final Feature feature = features.next(); assertFalse(features.hasNext()); assertEquals(i + "th feature", entry.getValue(), feature); } finally { if (features != null) features.close(); } } } }