21
21
#include " qgsvectorlayerjoinbuffer.h"
22
22
23
23
QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator ( QgsVectorLayer* layer, const QgsFeatureRequest& request )
24
- : QgsAbstractFeatureIterator( request ), L( layer )
24
+ : QgsAbstractFeatureIterator( request )
25
25
{
26
- QgsVectorLayerJoinBuffer* joinBuffer = L->mJoinBuffer ;
26
+ mProvider = layer->dataProvider ();
27
+ mFields = layer->pendingFields ();
28
+ mAllAttributesList = layer->pendingAllAttributesList ();
29
+ mJoinBuffer = new QgsVectorLayerJoinBuffer ( *layer->mJoinBuffer );
27
30
28
31
mChangedFeaturesRequest = mRequest ;
29
32
30
- if ( L ->editBuffer () )
33
+ if ( layer ->editBuffer () )
31
34
{
32
- mAddedFeatures = QgsFeatureMap ( L ->editBuffer ()->addedFeatures () );
33
- mChangedGeometries = QgsGeometryMap ( L ->editBuffer ()->changedGeometries () );
34
- mDeletedFeatureIds = QgsFeatureIds ( L ->editBuffer ()->deletedFeatureIds () );
35
- mChangedAttributeValues = QgsChangedAttributesMap ( L ->editBuffer ()->changedAttributeValues () );
36
- mAddedAttributes = QList<QgsField>( L ->editBuffer ()->addedAttributes () );
37
- mDeletedAttributeIds = QgsAttributeList ( L ->editBuffer ()->deletedAttributeIds () );
38
- mChangedFeaturesRequest .setFilterFids ( L ->editBuffer ()->changedAttributeValues ().keys ().toSet () );
35
+ mAddedFeatures = QgsFeatureMap ( layer ->editBuffer ()->addedFeatures () );
36
+ mChangedGeometries = QgsGeometryMap ( layer ->editBuffer ()->changedGeometries () );
37
+ mDeletedFeatureIds = QgsFeatureIds ( layer ->editBuffer ()->deletedFeatureIds () );
38
+ mChangedAttributeValues = QgsChangedAttributesMap ( layer ->editBuffer ()->changedAttributeValues () );
39
+ mAddedAttributes = QList<QgsField>( layer ->editBuffer ()->addedAttributes () );
40
+ mDeletedAttributeIds = QgsAttributeList ( layer ->editBuffer ()->deletedAttributeIds () );
41
+ mChangedFeaturesRequest .setFilterFids ( layer ->editBuffer ()->changedAttributeValues ().keys ().toSet () );
39
42
}
40
43
41
44
// prepare joins: may add more attributes to fetch (in order to allow join)
42
- if ( joinBuffer ->containsJoins () )
45
+ if ( mJoinBuffer ->containsJoins () )
43
46
prepareJoins ();
44
47
45
48
// by default provider's request is the same
@@ -50,14 +53,13 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayer* la
50
53
// prepare list of attributes to match provider fields
51
54
QgsAttributeList providerSubset;
52
55
QgsAttributeList subset = mProviderRequest .subsetOfAttributes ();
53
- const QgsFields &pendingFields = L->pendingFields ();
54
- int nPendingFields = pendingFields.count ();
56
+ int nPendingFields = mFields .count ();
55
57
for ( int i = 0 ; i < subset.count (); ++i )
56
58
{
57
59
int attrIndex = subset[i];
58
60
if ( attrIndex < 0 || attrIndex >= nPendingFields ) continue ;
59
- if ( L-> pendingFields () .fieldOrigin ( attrIndex ) == QgsFields::OriginProvider )
60
- providerSubset << L-> pendingFields () .fieldOriginIndex ( attrIndex );
61
+ if ( mFields .fieldOrigin ( attrIndex ) == QgsFields::OriginProvider )
62
+ providerSubset << mFields .fieldOriginIndex ( attrIndex );
61
63
}
62
64
mProviderRequest .setSubsetOfAttributes ( providerSubset );
63
65
}
@@ -68,28 +70,30 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayer* la
68
70
}
69
71
else // no filter or filter by rect
70
72
{
71
- if ( L ->editBuffer () )
73
+ if ( layer ->editBuffer () )
72
74
{
73
- mChangedFeaturesIterator = L ->dataProvider ()->getFeatures ( mChangedFeaturesRequest );
75
+ mChangedFeaturesIterator = layer ->dataProvider ()->getFeatures ( mChangedFeaturesRequest );
74
76
}
75
77
else
76
78
{
77
- mProviderIterator = L ->dataProvider ()->getFeatures ( mProviderRequest );
79
+ mProviderIterator = layer ->dataProvider ()->getFeatures ( mProviderRequest );
78
80
}
79
81
80
82
rewindEditBuffer ();
81
83
}
82
84
83
85
if ( mRequest .filterType () == QgsFeatureRequest::FilterExpression )
84
86
{
85
- mRequest .filterExpression ()->prepare ( L-> pendingFields () );
87
+ mRequest .filterExpression ()->prepare ( mFields );
86
88
}
87
89
}
88
90
89
91
90
92
QgsVectorLayerFeatureIterator::~QgsVectorLayerFeatureIterator ()
91
93
{
92
94
close ();
95
+
96
+ delete mJoinBuffer ;
93
97
}
94
98
95
99
@@ -135,7 +139,7 @@ bool QgsVectorLayerFeatureIterator::fetchFeature( QgsFeature& f )
135
139
if ( mProviderIterator .isClosed () )
136
140
{
137
141
mChangedFeaturesIterator .close ();
138
- mProviderIterator = L-> dataProvider () ->getFeatures ( mProviderRequest );
142
+ mProviderIterator = mProvider ->getFeatures ( mProviderRequest );
139
143
}
140
144
141
145
while ( mProviderIterator .nextFeature ( f ) )
@@ -144,7 +148,7 @@ bool QgsVectorLayerFeatureIterator::fetchFeature( QgsFeature& f )
144
148
continue ;
145
149
146
150
// TODO[MD]: just one resize of attributes
147
- f.setFields ( &L-> mUpdatedFields );
151
+ f.setFields ( &mFields );
148
152
149
153
// update attributes
150
154
updateChangedAttributes ( f );
@@ -227,7 +231,7 @@ void QgsVectorLayerFeatureIterator::useAddedFeature( const QgsFeature& src, QgsF
227
231
{
228
232
f.setFeatureId ( src.id () );
229
233
f.setValid ( true );
230
- f.setFields ( &L-> mUpdatedFields );
234
+ f.setFields ( &mFields );
231
235
232
236
if ( src.geometry () && !( mRequest .flags () & QgsFeatureRequest::NoGeometry ) )
233
237
f.setGeometry ( *src.geometry () );
@@ -298,7 +302,7 @@ void QgsVectorLayerFeatureIterator::useChangedAttributeFeature( QgsFeatureId fid
298
302
{
299
303
f.setFeatureId ( fid );
300
304
f.setValid ( true );
301
- f.setFields ( &L-> mUpdatedFields );
305
+ f.setFields ( &mFields );
302
306
303
307
if ( !( mRequest .flags () & QgsFeatureRequest::NoGeometry ) )
304
308
f.setGeometry ( geom );
@@ -315,7 +319,7 @@ void QgsVectorLayerFeatureIterator::useChangedAttributeFeature( QgsFeatureId fid
315
319
{
316
320
request.setSubsetOfAttributes ( mProviderRequest .subsetOfAttributes () );
317
321
}
318
- QgsFeatureIterator fi = L-> dataProvider () ->getFeatures ( request );
322
+ QgsFeatureIterator fi = mProvider ->getFeatures ( request );
319
323
if ( fi.nextFeature ( tmp ) )
320
324
{
321
325
updateChangedAttributes ( tmp );
@@ -341,21 +345,18 @@ void QgsVectorLayerFeatureIterator::rewindEditBuffer()
341
345
342
346
void QgsVectorLayerFeatureIterator::prepareJoins ()
343
347
{
344
- QgsAttributeList fetchAttributes = ( mRequest .flags () & QgsFeatureRequest::SubsetOfAttributes ) ? mRequest .subsetOfAttributes () : L-> pendingAllAttributesList () ;
348
+ QgsAttributeList fetchAttributes = ( mRequest .flags () & QgsFeatureRequest::SubsetOfAttributes ) ? mRequest .subsetOfAttributes () : mAllAttributesList ;
345
349
QgsAttributeList sourceJoinFields; // attributes that also need to be fetched from this layer in order to have joins working
346
350
347
351
mFetchJoinInfo .clear ();
348
352
349
- QgsVectorLayerJoinBuffer* joinBuffer = L->mJoinBuffer ;
350
- const QgsFields& fields = L->pendingFields ();
351
-
352
353
for ( QgsAttributeList::const_iterator attIt = fetchAttributes.constBegin (); attIt != fetchAttributes.constEnd (); ++attIt )
353
354
{
354
- if ( fields .fieldOrigin ( *attIt ) != QgsFields::OriginJoin )
355
+ if ( mFields .fieldOrigin ( *attIt ) != QgsFields::OriginJoin )
355
356
continue ;
356
357
357
358
int sourceLayerIndex;
358
- const QgsVectorJoinInfo* joinInfo = joinBuffer ->joinForFieldIndex ( *attIt, fields , sourceLayerIndex );
359
+ const QgsVectorJoinInfo* joinInfo = mJoinBuffer ->joinForFieldIndex ( *attIt, mFields , sourceLayerIndex );
359
360
Q_ASSERT ( joinInfo );
360
361
361
362
QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance ()->mapLayer ( joinInfo->joinLayerId ) );
@@ -370,7 +371,7 @@ void QgsVectorLayerFeatureIterator::prepareJoins()
370
371
if ( joinInfo->targetFieldName .isEmpty () )
371
372
info.targetField = joinInfo->targetFieldIndex ; // for compatibility with 1.x
372
373
else
373
- info.targetField = fields .indexFromName ( joinInfo->targetFieldName );
374
+ info.targetField = mFields .indexFromName ( joinInfo->targetFieldName );
374
375
375
376
if ( joinInfo->joinFieldName .isEmpty () )
376
377
info.joinField = joinInfo->joinFieldIndex ; // for compatibility with 1.x
@@ -401,7 +402,7 @@ void QgsVectorLayerFeatureIterator::prepareJoins()
401
402
void QgsVectorLayerFeatureIterator::addJoinedAttributes ( QgsFeature &f )
402
403
{
403
404
// make sure we have space for newly added attributes
404
- f.attributes ().resize ( L-> pendingFields () .count () ); // f.attributes().count() + mJoinedAttributesCount );
405
+ f.attributes ().resize ( mFields .count () ); // f.attributes().count() + mJoinedAttributesCount );
405
406
406
407
QMap<QgsVectorLayer*, FetchJoinInfo>::const_iterator joinIt = mFetchJoinInfo .constBegin ();
407
408
for ( ; joinIt != mFetchJoinInfo .constEnd (); ++joinIt )
@@ -545,7 +546,7 @@ bool QgsVectorLayerFeatureIterator::nextFeatureFid( QgsFeature& f )
545
546
}
546
547
547
548
// regular features
548
- QgsFeatureIterator fi = L-> dataProvider () ->getFeatures ( mProviderRequest );
549
+ QgsFeatureIterator fi = mProvider ->getFeatures ( mProviderRequest );
549
550
if ( fi.nextFeature ( f ) )
550
551
{
551
552
updateChangedAttributes ( f );
0 commit comments