Skip to content

Commit c6c076b

Browse files
committedDec 10, 2015
Implement provider side feature IDs filtering for mssql
1 parent a6cf547 commit c6c076b

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed
 

‎src/providers/mssql/qgsmssqlfeatureiterator.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
119119
// set fid filter
120120
if ( request.filterType() == QgsFeatureRequest::FilterFid && !mSource->mFidColName.isEmpty() )
121121
{
122-
QString fidfilter = QString( " [%1] = %2" ).arg( mSource->mFidColName, QString::number( request.filterFid() ) );
122+
QString fidfilter = QString( " [%1] = %2" ).arg( mSource->mFidColName, FID_TO_STRING( request.filterFid() ) );
123123
// set attribute filter
124124
if ( !filterAdded )
125125
mStatement += " WHERE ";
@@ -129,6 +129,26 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
129129
mStatement += fidfilter;
130130
filterAdded = true;
131131
}
132+
else if ( request.filterType() == QgsFeatureRequest::FilterFids && !mSource->mFidColName.isEmpty()
133+
&& !mRequest.filterFids().isEmpty() )
134+
{
135+
QString delim;
136+
QString inClause = QString( "%1 IN (" ).arg( mSource->mFidColName );
137+
Q_FOREACH ( QgsFeatureId featureId, mRequest.filterFids() )
138+
{
139+
inClause += delim + FID_TO_STRING( featureId );
140+
delim = ',';
141+
}
142+
inClause.append( ')' );
143+
144+
if ( !filterAdded )
145+
mStatement += " WHERE ";
146+
else
147+
mStatement += " AND ";
148+
149+
mStatement += inClause;
150+
filterAdded = true;
151+
}
132152

133153
if ( !mSource->mSqlWhereClause.isEmpty() )
134154
{

‎tests/src/python/providertestbase.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,29 @@ def testGetFeaturesCompiled(self):
120120
except AttributeError:
121121
print 'Provider does not support compiling'
122122

123+
def testGetFeaturesFidTests(self):
124+
fids = [f.id() for f in self.provider.getFeatures()]
125+
assert len(fids) == 5, 'Expected 5 features, got {} instead'.format(len(fids))
126+
for id in fids:
127+
result = [f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFid(id))]
128+
expected = [id]
129+
assert result == expected, 'Expected {} and got {} when testing for feature ID filter'.format(expected, result)
130+
131+
def testGetFeaturesFidsTests(self):
132+
fids = [f.id() for f in self.provider.getFeatures()]
133+
134+
result = set([f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFids([fids[0], fids[2]]))])
135+
expected = set([fids[0], fids[2]])
136+
assert result == expected, 'Expected {} and got {} when testing for feature IDs filter'.format(expected, result)
137+
138+
result = set([f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFids([fids[1], fids[3], fids[4]]))])
139+
expected = set([fids[1], fids[3], fids[4]])
140+
assert result == expected, 'Expected {} and got {} when testing for feature IDs filter'.format(expected, result)
141+
142+
result = set([f.id() for f in self.provider.getFeatures(QgsFeatureRequest().setFilterFids([]))])
143+
expected = set([])
144+
assert result == expected, 'Expected {} and got {} when testing for feature IDs filter'.format(expected, result)
145+
123146
def testGetFeaturesFilterRectTests(self):
124147
extent = QgsRectangle(-70, 67, -60, 80)
125148
features = [f['pk'] for f in self.provider.getFeatures(QgsFeatureRequest().setFilterRect(extent))]

0 commit comments

Comments
 (0)
Please sign in to comment.