QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsvectorlayerfeatureiterator.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsvectorlayerfeatureiterator.h
3 ---------------------
4 begin : Dezember 2012
5 copyright : (C) 2012 by Martin Dobias
6 email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15#ifndef QGSVECTORLAYERFEATUREITERATOR_H
16#define QGSVECTORLAYERFEATUREITERATOR_H
17
18#include "qgis_core.h"
19#include "qgis_sip.h"
20#include "qgsfeatureiterator.h"
21#include "qgsfields.h"
23#include "qgsfeaturesource.h"
26
27#include <QPointer>
28#include <QSet>
29#include <memory>
30
31typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap SIP_SKIP;
32
34class QgsVectorLayer;
39
41
42#ifdef SIP_RUN
43% ModuleHeaderCode
44#include "qgsfeatureiterator.h"
45% End
46#endif
47
53{
54 public:
55
60 explicit QgsVectorLayerFeatureSource( const QgsVectorLayer *layer );
61
66
68
70
72
78 QgsFields fields() const;
79
84
90 QString id() const;
91
92 protected:
93
94 std::unique_ptr< QgsAbstractFeatureSource > mProviderFeatureSource;
95
96 std::unique_ptr< QgsVectorLayerJoinBuffer > mJoinBuffer;
97
98#ifndef SIP_RUN
99
107 {
108
112 std::shared_ptr< QgsVectorLayerFeatureSource > joinSource;
113
118 };
119
121 QMap< QString, JoinLayerSource > mJoinSources;
122#endif
123
124 std::unique_ptr< QgsExpressionFieldBuffer > mExpressionFieldBuffer;
125
127
128 QString mId;
129
131
133
134 // A deep-copy is only performed, if the original maps change
135 // see here https://github.com/qgis/Quantum-GIS/pull/673
136 // for explanation
140 QList<QgsField> mAddedAttributes;
143
145
146 private:
147#ifdef SIP_RUN
149#endif
150};
151
155class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsVectorLayerFeatureSource>
156{
157 public:
158 QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
159
161
163 bool rewind() override;
164
166 bool close() override;
167
168 void setInterruptionChecker( QgsFeedback *interruptionChecker ) override SIP_SKIP;
169
174 struct CORE_EXPORT FetchJoinInfo
175 {
181 QMap<int, int> attributesSourceToDestLayerMap SIP_SKIP;
184
185#ifndef SIP_RUN
186
193 std::shared_ptr< QgsVectorLayerFeatureSource > joinSource;
194
202#endif
203
206
209
210 void addJoinedAttributesCached( QgsFeature &f, const QVariant &joinValue ) const;
211 void addJoinedAttributesDirect( QgsFeature &f, const QVariant &joinValue ) const;
212 };
213
214 bool isValid() const override;
215
216 protected:
218 bool fetchFeature( QgsFeature &feature ) override;
219
224 bool nextFeatureFilterExpression( QgsFeature &f ) override { return fetchFeature( f ); }
225
227 bool prepareSimplification( const QgsSimplifyMethod &simplifyMethod ) override;
228
230 void rewindEditBuffer() SIP_SKIP;
231
233 void prepareJoin( int fieldIdx ) SIP_SKIP;
234
236 void prepareExpression( int fieldIdx ) SIP_SKIP;
237
239 void prepareFields() SIP_SKIP;
240
242 void prepareField( int fieldIdx ) SIP_SKIP;
243
245 bool fetchNextAddedFeature( QgsFeature &f ) SIP_SKIP;
247 bool fetchNextChangedGeomFeature( QgsFeature &f ) SIP_SKIP;
249 bool fetchNextChangedAttributeFeature( QgsFeature &f ) SIP_SKIP;
251 void useAddedFeature( const QgsFeature &src, QgsFeature &f ) SIP_SKIP;
253 void useChangedAttributeFeature( QgsFeatureId fid, const QgsGeometry &geom, QgsFeature &f ) SIP_SKIP;
255 bool nextFeatureFid( QgsFeature &f ) SIP_SKIP;
257 void addJoinedAttributes( QgsFeature &f ) SIP_SKIP;
258
269 void addVirtualAttributes( QgsFeature &f ) SIP_SKIP;
270
277 void addExpressionAttribute( QgsFeature &f, int attrIndex ) SIP_SKIP;
278
283 void updateChangedAttributes( QgsFeature &f ) SIP_SKIP;
284
289 void updateFeatureGeometry( QgsFeature &f ) SIP_SKIP;
290
291 QgsFeatureRequest mProviderRequest;
292 QgsFeatureIterator mProviderIterator;
293 QgsFeatureRequest mChangedFeaturesRequest;
294 QgsFeatureIterator mChangedFeaturesIterator;
295
296 // filter bounding box constraint, in SOURCE CRS
297 QgsRectangle mFilterRect;
298 bool mHasValidTransform = false;
300
301 // distance within constraint reference geometry and distance IN DESTINATION CRS
302 QgsGeometry mDistanceWithinGeom;
303 std::shared_ptr< QgsGeometryEngine > mDistanceWithinEngine;
304 double mDistanceWithin = 0;
305
306 // only related to editing
307 QSet<QgsFeatureId> mFetchConsidered;
308 QgsGeometryMap::ConstIterator mFetchChangedGeomIt;
309 QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt;
310
311 bool mFetchedFid; // when iterating by FID: indicator whether it has been fetched yet or not
312
318
319 QMap<int, QgsExpression *> mExpressionFieldInfo;
320
321 bool mHasVirtualAttributes;
322
323 private:
324#ifdef SIP_RUN
326#endif
327
328 void createExpressionContext();
329 std::unique_ptr<QgsExpressionContext> mExpressionContext;
330
331 QgsFeedback *mInterruptionChecker = nullptr;
332
333 QList< int > mPreparedFields;
334 QList< int > mFieldsToPrepare;
335
337 QList< FetchJoinInfo > mOrderedJoinInfoList;
338
343 bool prepareOrderBy( const QList<QgsFeatureRequest::OrderByClause> &orderBys ) override;
344
346 bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
347
348 void createOrderedJoinList();
349
353 bool postProcessFeature( QgsFeature &feature );
354
358 bool checkGeometryValidity( const QgsFeature &feature );
359
360 bool mDelegatedOrderByToProvider = false;
361};
362
363
364
371{
372 public:
373
380
385
386 QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
387 QgsCoordinateReferenceSystem sourceCrs() const override;
388 QgsFields fields() const override;
389 Qgis::WkbType wkbType() const override;
390 long long featureCount() const override;
391 QString sourceName() const override;
392 QgsExpressionContextScope *createExpressionContextScope() const override;
393 Qgis::SpatialIndexPresence hasSpatialIndex() const override;
394
395 private:
396
397#ifdef SIP_RUN
399#endif
400
401 // ideally this wouldn't be mutable, but QgsVectorLayerFeatureSource has non-const getFeatures()
402 mutable QgsVectorLayerFeatureSource mSource;
403 QgsFeatureIds mSelectedFeatureIds;
405 QString mName;
406 QPointer< QgsVectorLayer > mLayer;
407
408};
409
411
412#ifndef SIP_RUN
413class QgsVectorLayerSelectedFeatureIterator : public QgsAbstractFeatureIterator
414{
415 public:
416
417 QgsVectorLayerSelectedFeatureIterator( const QgsFeatureIds &selectedFeatureIds,
418 const QgsFeatureRequest &request,
420
421 bool rewind() override;
422 bool close() override;
423
424 protected:
425 bool fetchFeature( QgsFeature &f ) override;
426
427 private:
428 QgsFeatureIds mSelectedFeatureIds;
429 QgsFeatureIterator mIterator;
430
431};
432
433#endif
434
436
437#endif // QGSVECTORLAYERFEATUREITERATOR_H
SpatialIndexPresence
Enumeration of spatial index presence states.
Definition: qgis.h:349
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition: qgis.h:182
@ Unknown
Unknown.
Helper template that cares of two things: 1.
Internal feature iterator to be implemented within data providers.
virtual bool rewind()=0
Resets the iterator to the starting position.
virtual bool fetchFeature(QgsFeature &f)=0
If you write a feature iterator for your provider, this is the method you need to implement!...
virtual bool close()=0
Call to end the iteration.
Base class that can be used for any class that is capable of returning features.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest())=0
Gets an iterator for features matching the specified request.
This class represents a coordinate reference system (CRS).
Class for doing transforms between two map coordinate systems.
Abstract interface for generating an expression context scope.
Single scope for storing variables and functions for use within a QgsExpressionContext.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Buffers information about expression fields for a vector layer.
Class for parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
This class wraps a request for features to a vector layer (or directly its vector data provider).
An interface for objects which provide features via a getFeatures method.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
Container of fields for a vector layer.
Definition: qgsfields.h:45
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:162
A rectangle specified with double values.
Definition: qgsrectangle.h:42
This class contains information about how to simplify geometries fetched from a QgsFeatureIterator.
bool nextFeatureFilterExpression(QgsFeature &f) override
Overrides default method as we only need to filter features in the edit buffer while for others filte...
Partial snapshot of vector layer's state (only the members necessary for access to features)
QgsChangedAttributesMap mChangedAttributeValues
std::unique_ptr< QgsAbstractFeatureSource > mProviderFeatureSource
~QgsVectorLayerFeatureSource() override
QgsVectorLayerFeatureSource(const QgsVectorLayerFeatureSource &other)=delete
QgsVectorLayerFeatureSource cannot be copied.
std::unique_ptr< QgsVectorLayerJoinBuffer > mJoinBuffer
std::unique_ptr< QgsExpressionFieldBuffer > mExpressionFieldBuffer
QMap< QString, JoinLayerSource > mJoinSources
Contains prepared join sources by layer ID.
QgsVectorLayerFeatureSource & operator==(const QgsVectorLayerFeatureSource &other)=delete
QgsVectorLayerFeatureSource cannot be copied.
Manages joined fields for a vector layer.
Defines left outer join from our vector layer to some other vector layer.
QgsFeatureSource subclass for the selected features from a QgsVectorLayer.
QgsVectorLayerSelectedFeatureSource(const QgsVectorLayerSelectedFeatureSource &other)=delete
QgsVectorLayerSelectedFeatureSource cannot be copied.
QgsVectorLayerSelectedFeatureSource & operator==(const QgsVectorLayerSelectedFeatureSource &other)=delete
QgsVectorLayerSelectedFeatureSource cannot be copied.
Represents a vector layer which manages a vector based data sets.
#define SIP_SKIP
Definition: qgis_sip.h:126
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
Definition: qgsfeature.h:912
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:903
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:37
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28
QList< int > QgsAttributeList
Definition: qgsfield.h:27
QMap< QgsFeatureId, QgsFeature > QgsFeatureMap
const QgsCoordinateReferenceSystem & crs
Join information prepared for fast attribute id mapping in QgsVectorLayerJoinBuffer::updateFeatureAtt...
std::shared_ptr< QgsVectorLayerFeatureSource > joinSource
Feature source for join.
int targetField
Index of field (of this layer) that drives the join.
const QgsVectorLayerJoinInfo * joinInfo
Canonical source of information about the join.
int indexOffset
At what position the joined fields start.
Contains join layer source information prepared in a thread-safe way, ready for vector layer feature ...
std::shared_ptr< QgsVectorLayerFeatureSource > joinSource
Feature source for join.