Skip to content

Commit

Permalink
Implement provider side feature IDs filtering for mssql
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Dec 10, 2015
1 parent a6cf547 commit c6c076b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
22 changes: 21 additions & 1 deletion src/providers/mssql/qgsmssqlfeatureiterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ";
Expand All @@ -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() )
{
Expand Down
23 changes: 23 additions & 0 deletions tests/src/python/providertestbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,29 @@ def testGetFeaturesCompiled(self):
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))]
Expand Down

0 comments on commit c6c076b

Please sign in to comment.