[ArcGIS REST] fix caching logic for extent filtered requests

This commit is contained in:
Mathieu Pellerin 2017-11-23 11:34:04 +07:00 committed by GitHub
parent d2369425c6
commit f32791ee21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -32,7 +32,7 @@ bool QgsAfsSharedData::getFeature( QgsFeatureId id, QgsFeature &f, bool fetchGeo
if ( it != mCache.constEnd() ) if ( it != mCache.constEnd() )
{ {
f = it.value(); f = it.value();
return filterRect.isNull() || f.geometry().intersects( filterRect ); return filterRect.isNull() || ( f.hasGeometry() && f.geometry().intersects( filterRect ) );
} }
// Determine attributes to fetch // Determine attributes to fetch
@ -86,9 +86,7 @@ bool QgsAfsSharedData::getFeature( QgsFeatureId id, QgsFeature &f, bool fetchGeo
{ {
QVariantMap featureData = featuresData[i].toMap(); QVariantMap featureData = featuresData[i].toMap();
QgsFeature feature; QgsFeature feature;
int objectId = startId + i;
// Set FID
feature.setId( startId + i );
// Set attributes // Set attributes
if ( !fetchAttribIdx.isEmpty() ) if ( !fetchAttribIdx.isEmpty() )
@ -99,10 +97,17 @@ bool QgsAfsSharedData::getFeature( QgsFeatureId id, QgsFeature &f, bool fetchGeo
foreach ( int idx, fetchAttribIdx ) foreach ( int idx, fetchAttribIdx )
{ {
attributes[idx] = attributesData[mFields.at( idx ).name()]; attributes[idx] = attributesData[mFields.at( idx ).name()];
if ( mFields.at( idx ).name() == QStringLiteral( "OBJECTID" ) )
{
objectId = attributesData[mFields.at( idx ).name()].toInt();
}
} }
feature.setAttributes( attributes ); feature.setAttributes( attributes );
} }
// Set FID
feature.setId( startId + objectIds.indexOf( objectId ) );
// Set geometry // Set geometry
if ( fetchGeometry ) if ( fetchGeometry )
{ {
@ -115,7 +120,14 @@ bool QgsAfsSharedData::getFeature( QgsFeatureId id, QgsFeature &f, bool fetchGeo
feature.setValid( true ); feature.setValid( true );
mCache.insert( feature.id(), feature ); mCache.insert( feature.id(), feature );
} }
f = mCache[id];
Q_ASSERT( f.isValid() ); // If added to cache, return feature
it = mCache.constFind( id );
if ( it != mCache.constEnd() )
{
f = it.value();
return filterRect.isNull() || ( f.hasGeometry() && f.geometry().intersects( filterRect ) ); return filterRect.isNull() || ( f.hasGeometry() && f.geometry().intersects( filterRect ) );
}
return false;
} }