QGIS API Documentation  2.99.0-Master (19b062c)
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"
24 
25 #include <QSet>
26 #include <memory>
27 
28 typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap SIP_SKIP;
29 
31 class QgsVectorLayer;
36 
38 
39 #ifdef SIP_RUN
40 % ModuleHeaderCode
41 #include "qgsfeatureiterator.h"
42 % End
43 #endif
44 
50 {
51  public:
52 
57  explicit QgsVectorLayerFeatureSource( const QgsVectorLayer *layer );
58 
60 
61  virtual QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) override;
62 
64 
71  QgsFields fields() const;
72 
77  QgsCoordinateReferenceSystem crs() const;
78 
79  protected:
80 
81  QgsAbstractFeatureSource *mProviderFeatureSource = nullptr;
82 
83  QgsVectorLayerJoinBuffer *mJoinBuffer = nullptr;
84 
85  QgsExpressionFieldBuffer *mExpressionFieldBuffer = nullptr;
86 
88 
90 
92 
93  // A deep-copy is only performed, if the original maps change
94  // see here https://github.com/qgis/Quantum-GIS/pull/673
95  // for explanation
99  QList<QgsField> mAddedAttributes;
102 
104 };
105 
109 class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsVectorLayerFeatureSource>
110 {
111  public:
112  QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
113 
115 
117  virtual bool rewind() override;
118 
120  virtual bool close() override;
121 
122  virtual void setInterruptionChecker( QgsInterruptionChecker *interruptionChecker ) override SIP_SKIP;
123 
128  struct CORE_EXPORT FetchJoinInfo
129  {
135  int joinField;
136 
137  void addJoinedAttributesCached( QgsFeature &f, const QVariant &joinValue ) const;
138  void addJoinedAttributesDirect( QgsFeature &f, const QVariant &joinValue ) const;
139  };
140 
141 
142  virtual bool isValid() const override;
143 
144  protected:
146  virtual bool fetchFeature( QgsFeature &feature ) override;
147 
152  virtual bool nextFeatureFilterExpression( QgsFeature &f ) override { return fetchFeature( f ); }
153 
155  virtual bool prepareSimplification( const QgsSimplifyMethod &simplifyMethod ) override;
156 
158  void rewindEditBuffer() SIP_SKIP;
159 
161  void prepareJoin( int fieldIdx ) SIP_SKIP;
162 
164  void prepareExpression( int fieldIdx ) SIP_SKIP;
165 
167  void prepareFields() SIP_SKIP;
168 
170  void prepareField( int fieldIdx ) SIP_SKIP;
171 
173  bool fetchNextAddedFeature( QgsFeature &f ) SIP_SKIP;
175  bool fetchNextChangedGeomFeature( QgsFeature &f ) SIP_SKIP;
177  bool fetchNextChangedAttributeFeature( QgsFeature &f ) SIP_SKIP;
179  void useAddedFeature( const QgsFeature &src, QgsFeature &f ) SIP_SKIP;
181  void useChangedAttributeFeature( QgsFeatureId fid, const QgsGeometry &geom, QgsFeature &f ) SIP_SKIP;
183  bool nextFeatureFid( QgsFeature &f ) SIP_SKIP;
185  void addJoinedAttributes( QgsFeature &f ) SIP_SKIP;
186 
196  void addVirtualAttributes( QgsFeature &f ) SIP_SKIP;
197 
205  void addExpressionAttribute( QgsFeature &f, int attrIndex ) SIP_SKIP;
206 
211  void updateChangedAttributes( QgsFeature &f ) SIP_SKIP;
212 
217  void updateFeatureGeometry( QgsFeature &f ) SIP_SKIP;
218 
223 
226 
227  // only related to editing
228  QSet<QgsFeatureId> mFetchConsidered;
229  QgsGeometryMap::ConstIterator mFetchChangedGeomIt;
230  QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt;
231 
232  bool mFetchedFid; // when iterating by FID: indicator whether it has been fetched yet or not
233 
237  QMap<const QgsVectorLayerJoinInfo *, QgsVectorLayerFeatureIterator::FetchJoinInfo> mFetchJoinInfo;
238 
239  QMap<int, QgsExpression *> mExpressionFieldInfo;
240 
242 
243  private:
244 #ifdef SIP_RUN
246 #endif
247 
248  std::unique_ptr<QgsExpressionContext> mExpressionContext;
249 
250  QgsInterruptionChecker *mInterruptionChecker = nullptr;
251 
252  QList< int > mPreparedFields;
253  QList< int > mFieldsToPrepare;
254 
256  QList< FetchJoinInfo > mOrderedJoinInfoList;
257 
262  bool prepareOrderBy( const QList<QgsFeatureRequest::OrderByClause> &orderBys ) override;
263 
265  virtual bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
266 
267  void createOrderedJoinList();
268 
272  bool postProcessFeature( QgsFeature &feature );
273 
277  bool checkGeometryValidity( const QgsFeature &feature );
278 };
279 
280 
281 
289 {
290  public:
291 
298 
299  QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
300  QgsCoordinateReferenceSystem sourceCrs() const override;
301  QgsFields fields() const override;
302  QgsWkbTypes::Type wkbType() const override;
303  long featureCount() const override;
304  QString sourceName() const override;
305 
306 
307  private:
308 
309  // ideally this wouldn't be mutable, but QgsVectorLayerFeatureSource has non-const getFeatures()
310  mutable QgsVectorLayerFeatureSource mSource;
311  QgsFeatureIds mSelectedFeatureIds;
313  QString mName;
314 
315 };
316 
317 #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:39
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
Get 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:111
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.
Interface that can be optionally attached to an iterator so its nextFeature() implementaton can check...
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.
Buffers information about expression fields for a vector layer.
virtual void setInterruptionChecker(QgsInterruptionChecker *interruptionChecker)
Attach an object that can be queried regularly by the iterator to check if it must stopped...
QgsFeatureSource subclass for the selected features from a QgsVectorLayer.
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:528
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...
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
virtual bool nextFeatureFilterExpression(QgsFeature &f) override
Overrides default method as we only need to filter features in the edit buffer while for others filte...
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.
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...