QGIS API Documentation  3.2.0-Bonn (bc43194)
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"
25 
26 #include <QPointer>
27 #include <QSet>
28 #include <memory>
29 
30 typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap SIP_SKIP;
31 
33 class QgsVectorLayer;
38 
40 
41 #ifdef SIP_RUN
42 % ModuleHeaderCode
43 #include "qgsfeatureiterator.h"
44 % End
45 #endif
46 
52 {
53  public:
54 
59  explicit QgsVectorLayerFeatureSource( const QgsVectorLayer *layer );
60 
61  ~QgsVectorLayerFeatureSource() override;
62 
64 
66 
73  QgsFields fields() const;
74 
79  QgsCoordinateReferenceSystem crs() const;
80 
81  protected:
82 
83  QgsAbstractFeatureSource *mProviderFeatureSource = nullptr;
84 
85  QgsVectorLayerJoinBuffer *mJoinBuffer = nullptr;
86 
87  QgsExpressionFieldBuffer *mExpressionFieldBuffer = nullptr;
88 
90 
92 
94 
95  // A deep-copy is only performed, if the original maps change
96  // see here https://github.com/qgis/Quantum-GIS/pull/673
97  // for explanation
101  QList<QgsField> mAddedAttributes;
104 
106 };
107 
111 class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsVectorLayerFeatureSource>
112 {
113  public:
114  QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
115 
116  ~QgsVectorLayerFeatureIterator() override;
117 
119  bool rewind() override;
120 
122  bool close() override;
123 
124  void setInterruptionChecker( QgsFeedback *interruptionChecker ) override SIP_SKIP;
125 
130  struct CORE_EXPORT FetchJoinInfo
131  {
137  int joinField;
138 
139  void addJoinedAttributesCached( QgsFeature &f, const QVariant &joinValue ) const;
140  void addJoinedAttributesDirect( QgsFeature &f, const QVariant &joinValue ) const;
141  };
142 
143 
144  bool isValid() const override;
145 
146  protected:
148  bool fetchFeature( QgsFeature &feature ) override;
149 
154  bool nextFeatureFilterExpression( QgsFeature &f ) override { return fetchFeature( f ); }
155 
157  bool prepareSimplification( const QgsSimplifyMethod &simplifyMethod ) override;
158 
160  void rewindEditBuffer() SIP_SKIP;
161 
163  void prepareJoin( int fieldIdx ) SIP_SKIP;
164 
166  void prepareExpression( int fieldIdx ) SIP_SKIP;
167 
169  void prepareFields() SIP_SKIP;
170 
172  void prepareField( int fieldIdx ) SIP_SKIP;
173 
175  bool fetchNextAddedFeature( QgsFeature &f ) SIP_SKIP;
177  bool fetchNextChangedGeomFeature( QgsFeature &f ) SIP_SKIP;
179  bool fetchNextChangedAttributeFeature( QgsFeature &f ) SIP_SKIP;
181  void useAddedFeature( const QgsFeature &src, QgsFeature &f ) SIP_SKIP;
183  void useChangedAttributeFeature( QgsFeatureId fid, const QgsGeometry &geom, QgsFeature &f ) SIP_SKIP;
185  bool nextFeatureFid( QgsFeature &f ) SIP_SKIP;
187  void addJoinedAttributes( QgsFeature &f ) SIP_SKIP;
188 
198  void addVirtualAttributes( QgsFeature &f ) SIP_SKIP;
199 
207  void addExpressionAttribute( QgsFeature &f, int attrIndex ) SIP_SKIP;
208 
213  void updateChangedAttributes( QgsFeature &f ) SIP_SKIP;
214 
219  void updateFeatureGeometry( QgsFeature &f ) SIP_SKIP;
220 
225 
228 
229  // only related to editing
230  QSet<QgsFeatureId> mFetchConsidered;
231  QgsGeometryMap::ConstIterator mFetchChangedGeomIt;
232  QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt;
233 
234  bool mFetchedFid; // when iterating by FID: indicator whether it has been fetched yet or not
235 
239  QMap<const QgsVectorLayerJoinInfo *, QgsVectorLayerFeatureIterator::FetchJoinInfo> mFetchJoinInfo;
240 
241  QMap<int, QgsExpression *> mExpressionFieldInfo;
242 
244 
245  private:
246 #ifdef SIP_RUN
248 #endif
249 
250  std::unique_ptr<QgsExpressionContext> mExpressionContext;
251 
252  QgsFeedback *mInterruptionChecker = nullptr;
253 
254  QList< int > mPreparedFields;
255  QList< int > mFieldsToPrepare;
256 
258  QList< FetchJoinInfo > mOrderedJoinInfoList;
259 
264  bool prepareOrderBy( const QList<QgsFeatureRequest::OrderByClause> &orderBys ) override;
265 
267  bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
268 
269  void createOrderedJoinList();
270 
274  bool postProcessFeature( QgsFeature &feature );
275 
279  bool checkGeometryValidity( const QgsFeature &feature );
280 };
281 
282 
283 
291 {
292  public:
293 
300 
301  QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
302  QgsCoordinateReferenceSystem sourceCrs() const override;
303  QgsFields fields() const override;
304  QgsWkbTypes::Type wkbType() const override;
305  long featureCount() const override;
306  QString sourceName() const override;
308 
309 
310  private:
311 
312  // ideally this wouldn't be mutable, but QgsVectorLayerFeatureSource has non-const getFeatures()
313  mutable QgsVectorLayerFeatureSource mSource;
314  QgsFeatureIds mSelectedFeatureIds;
316  QString mName;
317  QPointer< QgsVectorLayer > mLayer;
318 
319 };
320 
321 #endif // QGSVECTORLAYERFEATUREITERATOR_H
Wrapper for iterator of features from vector data provider or vector layer.
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
Definition: qgsfeature.h:537
const QgsVectorLayerJoinInfo * joinInfo
Canonical source of information about the join.
virtual bool close()=0
end of iterating: free the resources / lock
A rectangle specified with double values.
Definition: qgsrectangle.h:40
virtual QgsFields fields() const =0
Returns the fields associated with features in the source.
QMap< int, QgsExpression * > mExpressionFieldInfo
QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt
QgsGeometryMap::ConstIterator mFetchChangedGeomIt
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeature.h:544
virtual bool rewind()=0
reset the iterator to the starting position
virtual QgsWkbTypes::Type wkbType() const =0
Returns the geometry type for features returned by this source.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest())=0
Gets an iterator for features matching the specified request.
Container of fields for a vector layer.
Definition: qgsfields.h:42
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:104
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:62
QgsVectorLayer * joinLayer
Resolved pointer to the joined layer.
Manages joined fields for a vector layer.
int joinField
Index of field (of the joined layer) must have equal value.
Base class for feedback objects to be used for cancelation of something running in a worker thread...
Definition: qgsfeedback.h:44
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:67
#define SIP_SKIP
Definition: qgis_sip.h:119
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Defines left outer join from our vector layer to some other vector layer.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
Single scope for storing variables and functions for use within a QgsExpressionContext.
Base class that can be used for any class that is capable of returning features.
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
Partial snapshot of vector layer&#39;s state (only the members necessary for access to features) ...
int indexOffset
At what position the joined fields start.
QMap< QgsFeatureId, QgsFeature > QgsFeatureMap
int targetField
Index of field (of this layer) that drives the join.
virtual QgsExpressionContextScope * createExpressionContextScope() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Buffers information about expression fields for a vector layer.
QgsFeatureSource subclass for the selected features from a QgsVectorLayer.
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:528
Abstract interface for generating an expression context scope.
An interface for objects which provide features via a getFeatures method.
QMap< const QgsVectorLayerJoinInfo *, QgsVectorLayerFeatureIterator::FetchJoinInfo > mFetchJoinInfo
Information about joins used in the current select() statement.
This class represents a coordinate reference system (CRS).
Class for doing transforms between two map coordinate systems.
Join information prepared for fast attribute id mapping in QgsVectorLayerJoinBuffer::updateFeatureAtt...
virtual void setInterruptionChecker(QgsFeedback *interruptionChecker)
Attach an object that can be queried regularly by the iterator to check if it must stopped...
qint64 QgsFeatureId
Definition: qgsfeature.h:37
This class contains information about how to simplify geometries fetched from a QgsFeatureIterator.
QList< int > QgsAttributeList
Definition: qgsfield.h:27
QgsChangedAttributesMap mChangedAttributeValues
virtual QString sourceName() const =0
Returns a friendly display name for the source.
Represents a vector layer which manages a vector based data sets.
bool nextFeatureFilterExpression(QgsFeature &f) override
Overrides default method as we only need to filter features in the edit buffer while for others filte...
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
Helper template that cares of two things: 1.
virtual long featureCount() const =0
Returns the number of features contained in the source, or -1 if the feature count is unknown...