Implement provider side feature IDs filtering for mssql

This commit is contained in:
Nyall Dawson 2015-12-10 16:21:52 +11:00
parent a6cf5475c6
commit c6c076b082
2 changed files with 44 additions and 1 deletions

View File

@ -119,7 +119,7 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
// set fid filter
if ( request.filterType() == QgsFeatureRequest::FilterFid && !mSource->mFidColName.isEmpty() )
{
QString fidfilter = QString( " [%1] = %2" ).arg( mSource->mFidColName, QString::number( request.filterFid() ) );
QString fidfilter = QString( " [%1] = %2" ).arg( mSource->mFidColName, FID_TO_STRING( request.filterFid() ) );
// set attribute filter
if ( !filterAdded )
mStatement += " WHERE ";
@ -129,6 +129,26 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
mStatement += fidfilter;
filterAdded = true;
}
else if ( request.filterType() == QgsFeatureRequest::FilterFids && !mSource->mFidColName.isEmpty()
&& !mRequest.filterFids().isEmpty() )
{
QString delim;
QString inClause = QString( "%1 IN (" ).arg( mSource->mFidColName );
Q_FOREACH ( QgsFeatureId featureId, mRequest.filterFids() )
{
inClause += delim + FID_TO_STRING( featureId );
delim = ',';
}
inClause.append( ')' );
if ( !filterAdded )
mStatement += " WHERE ";
else
mStatement += " AND ";
mStatement += inClause;
filterAdded = true;
}
if ( !mSource->mSqlWhereClause.isEmpty() )
{

View File

@ -120,6 +120,29 @@ class ProviderTestCase(object):
except AttributeError:
print 'Provider does not support compiling'
def testGetFeaturesFidTests(self):
fids = [f.id() for f in self.provider.getFeatures()]
assert len(fids) == 5, 'Expected 5 features, got {} instead'.format(len(fids))
for id in fids:
result = [f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFid(id))]
expected = [id]
assert result == expected, 'Expected {} and got {} when testing for feature ID filter'.format(expected, result)
def testGetFeaturesFidsTests(self):
fids = [f.id() for f in self.provider.getFeatures()]
result = set([f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFids([fids[0], fids[2]]))])
expected = set([fids[0], fids[2]])
assert result == expected, 'Expected {} and got {} when testing for feature IDs filter'.format(expected, result)
result = set([f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFids([fids[1], fids[3], fids[4]]))])
expected = set([fids[1], fids[3], fids[4]])
assert result == expected, 'Expected {} and got {} when testing for feature IDs filter'.format(expected, result)
result = set([f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFids([]))])
expected = set([])
assert result == expected, 'Expected {} and got {} when testing for feature IDs filter'.format(expected, result)
def testGetFeaturesFilterRectTests(self):
extent = QgsRectangle(-70, 67, -60, 80)
features = [f['pk'] for f in self.provider.getFeatures(QgsFeatureRequest().setFilterRect(extent))]