QgsVectorLayerFeatureSource::QgsVectorLayerFeatureSource( const QgsVectorLayer *layer ) { QMutexLocker locker( &layer->mFeatureSourceConstructorMutex ); mProviderFeatureSource = layer->dataProvider()->featureSource(); mFields = layer->fields(); mId = layer->id(); // update layer's join caches if necessary if ( layer->mJoinBuffer->containsJoins() ) layer->mJoinBuffer->createJoinCaches(); mJoinBuffer = layer->mJoinBuffer->clone(); mExpressionFieldBuffer = new QgsExpressionFieldBuffer( *layer->mExpressionFieldBuffer ); mCrs = layer->crs(); mHasEditBuffer = layer->editBuffer(); if ( mHasEditBuffer ) { #if 0 // TODO[MD]: after merge if ( request.filterType() == QgsFeatureRequest::FilterFid ) { // only copy relevant parts if ( L->editBuffer()->addedFeatures().contains( request.filterFid() ) ) mAddedFeatures.insert( request.filterFid(), L->editBuffer()->addedFeatures()[ request.filterFid()] ); if ( L->editBuffer()->changedGeometries().contains( request.filterFid() ) ) mChangedGeometries.insert( request.filterFid(), L->editBuffer()->changedGeometries()[ request.filterFid()] ); if ( L->editBuffer()->deletedFeatureIds().contains( request.filterFid() ) ) mDeletedFeatureIds.insert( request.filterFid() ); if ( L->editBuffer()->changedAttributeValues().contains( request.filterFid() ) ) mChangedAttributeValues.insert( request.filterFid(), L->editBuffer()->changedAttributeValues()[ request.filterFid()] ); if ( L->editBuffer()->changedAttributeValues().contains( request.filterFid() ) ) mChangedFeaturesRequest.setFilterFids( QgsFeatureIds() << request.filterFid() ); } else { #endif mAddedFeatures = QgsFeatureMap( layer->editBuffer()->addedFeatures() ); mChangedGeometries = QgsGeometryMap( layer->editBuffer()->changedGeometries() ); mDeletedFeatureIds = QgsFeatureIds( layer->editBuffer()->deletedFeatureIds() ); mChangedAttributeValues = QgsChangedAttributesMap( layer->editBuffer()->changedAttributeValues() ); mAddedAttributes = QList<QgsField>( layer->editBuffer()->addedAttributes() ); mDeletedAttributeIds = QgsAttributeList( layer->editBuffer()->deletedAttributeIds() ); #if 0 } #endif } std::unique_ptr< QgsExpressionContextScope > layerScope( QgsExpressionContextUtils::layerScope( layer ) ); mLayerScope = *layerScope; }
QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayer* layer, const QgsFeatureRequest& request ) : QgsAbstractFeatureIterator( request ), L( layer ) { QgsVectorLayerJoinBuffer* joinBuffer = L->mJoinBuffer; if ( L->editBuffer() ) { mAddedFeatures = QgsFeatureMap( L->editBuffer()->addedFeatures() ); mChangedGeometries = QgsGeometryMap( L->editBuffer()->changedGeometries() ); mDeletedFeatureIds = QgsFeatureIds( L->editBuffer()->deletedFeatureIds() ); mChangedAttributeValues = QgsChangedAttributesMap( L->editBuffer()->changedAttributeValues() ); mAddedAttributes = QList<QgsField>( L->editBuffer()->addedAttributes() ); mDeletedAttributeIds = QgsAttributeList( L->editBuffer()->deletedAttributeIds() ); } // prepare joins: may add more attributes to fetch (in order to allow join) if ( joinBuffer->containsJoins() ) prepareJoins(); // by default provider's request is the same mProviderRequest = mRequest; if ( mProviderRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) { // prepare list of attributes to match provider fields QgsAttributeList providerSubset; QgsAttributeList subset = mProviderRequest.subsetOfAttributes(); const QgsFields &pendingFields = L->pendingFields(); int nPendingFields = pendingFields.count(); for ( int i = 0; i < subset.count(); ++i ) { int attrIndex = subset[i]; if ( attrIndex < 0 || attrIndex >= nPendingFields ) continue; if ( L->pendingFields().fieldOrigin( attrIndex ) == QgsFields::OriginProvider ) providerSubset << L->pendingFields().fieldOriginIndex( attrIndex ); } mProviderRequest.setSubsetOfAttributes( providerSubset ); } if ( request.filterType() == QgsFeatureRequest::FilterFid ) { mFetchedFid = false; } else // no filter or filter by rect { mProviderIterator = L->dataProvider()->getFeatures( mProviderRequest ); rewindEditBuffer(); } }
QgsVectorLayerFeatureSource::QgsVectorLayerFeatureSource( QgsVectorLayer *layer ) : mCrsId( 0 ) { mProviderFeatureSource = layer->dataProvider()->featureSource(); mFields = layer->fields(); mJoinBuffer = layer->mJoinBuffer->clone(); mExpressionFieldBuffer = new QgsExpressionFieldBuffer( *layer->mExpressionFieldBuffer ); mCrsId = layer->crs().srsid(); mCanBeSimplified = layer->hasGeometryType() && layer->geometryType() != QGis::Point; mHasEditBuffer = layer->editBuffer(); if ( mHasEditBuffer ) { #if 0 // TODO[MD]: after merge if ( request.filterType() == QgsFeatureRequest::FilterFid ) { // only copy relevant parts if ( L->editBuffer()->addedFeatures().contains( request.filterFid() ) ) mAddedFeatures.insert( request.filterFid(), L->editBuffer()->addedFeatures()[ request.filterFid()] ); if ( L->editBuffer()->changedGeometries().contains( request.filterFid() ) ) mChangedGeometries.insert( request.filterFid(), L->editBuffer()->changedGeometries()[ request.filterFid()] ); if ( L->editBuffer()->deletedFeatureIds().contains( request.filterFid() ) ) mDeletedFeatureIds.insert( request.filterFid() ); if ( L->editBuffer()->changedAttributeValues().contains( request.filterFid() ) ) mChangedAttributeValues.insert( request.filterFid(), L->editBuffer()->changedAttributeValues()[ request.filterFid()] ); if ( L->editBuffer()->changedAttributeValues().contains( request.filterFid() ) ) mChangedFeaturesRequest.setFilterFids( QgsFeatureIds() << request.filterFid() ); } else { #endif mAddedFeatures = QgsFeatureMap( layer->editBuffer()->addedFeatures() ); mChangedGeometries = QgsGeometryMap( layer->editBuffer()->changedGeometries() ); mDeletedFeatureIds = QgsFeatureIds( layer->editBuffer()->deletedFeatureIds() ); mChangedAttributeValues = QgsChangedAttributesMap( layer->editBuffer()->changedAttributeValues() ); mAddedAttributes = QList<QgsField>( layer->editBuffer()->addedAttributes() ); mDeletedAttributeIds = QgsAttributeList( layer->editBuffer()->deletedAttributeIds() ); #if 0 } #endif } }