IndexexShapefileDataStore produces inaccurate results with fid filters
----------------------------------------------------------------------

                 Key: GEOT-2050
                 URL: http://jira.codehaus.org/browse/GEOT-2050
             Project: GeoTools
          Issue Type: Bug
          Components: data shapefile
    Affects Versions: 2.5.0
            Reporter: Gabriel Roldán
            Assignee: Gabriel Roldán
             Fix For: 2.5.1


IndexedShapefileDataStore does not handle fid filters correctly.

Added the below test case which exposes the defect and produces the following 
failure:
AssertionFailedError: lacking fids: [statepop.20, statepop.30, statepop.31, 
statepop.32, statepop.40, statepop.41, statepop.42, statepop.43]. Unexpected 
ones: [] expected:<49> but was:<41>


{code}
    public void testFidFilter() throws Exception {
        URL url;
        {
            File shpFile = copyShapefiles(STATE_POP);
            url = shpFile.toURL();
            String filename = url.getFile();
            filename = filename.substring(0, filename.lastIndexOf("."));

            // force creating the index
            File file = new File(filename + ".qix");

            if (file.exists()) {
                file.delete();
            }
            file.deleteOnExit();
        }
        IndexedShapefileDataStore ds = new IndexedShapefileDataStore(url, null, 
true, true,
                IndexType.QIX);
        FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = 
ds.getFeatureSource();
        FeatureCollection<SimpleFeatureType, SimpleFeature> features = 
featureSource.getFeatures();
        FeatureIterator<SimpleFeature> indexIter = features.features();

        Set<String> expectedFids = new HashSet<String>();
        final Filter fidFilter;
        try {
            FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);
            Set<FeatureId> fids = new HashSet<FeatureId>();
            while (indexIter.hasNext()) {
                SimpleFeature newFeature = indexIter.next();
                String id = newFeature.getID();
                expectedFids.add(id);
                fids.add(ff.featureId(id));
            }
            fidFilter = ff.id(fids);
        } finally {
            indexIter.close();
        }

        Set<String> actualFids = new HashSet<String>();
        {
            features = featureSource.getFeatures(fidFilter);
            indexIter = features.features();
            while (indexIter.hasNext()) {
                SimpleFeature next = indexIter.next();
                String id = next.getID();
                actualFids.add(id);
            }
        }

        TreeSet<String> lackingFids = new TreeSet<String>(expectedFids);
        lackingFids.removeAll(actualFids);
        
        TreeSet<String> unexpectedFids = new TreeSet<String>(actualFids);
        unexpectedFids.removeAll(expectedFids);

        String lacking = String.valueOf(lackingFids);
        String unexpected = String.valueOf(unexpectedFids);
        String failureMsg = "lacking fids: " + lacking + ". Unexpected ones: " 
+ unexpected;
        assertEquals(failureMsg, expectedFids.size(), actualFids.size());
        assertEquals(failureMsg, expectedFids, actualFids);
    }
{code}

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Geotools-devel mailing list
Geotools-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to