QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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 
80 
86  QString id() const;
87 
88  protected:
89 
90  QgsAbstractFeatureSource *mProviderFeatureSource = nullptr;
91 
92  QgsVectorLayerJoinBuffer *mJoinBuffer = nullptr;
93 
94  QgsExpressionFieldBuffer *mExpressionFieldBuffer = nullptr;
95 
97 
98  QString mId;
99 
101 
103 
104  // A deep-copy is only performed, if the original maps change
105  // see here https://github.com/qgis/Quantum-GIS/pull/673
106  // for explanation
110  QList<QgsField> mAddedAttributes;
113 
115 };
116 
120 class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsVectorLayerFeatureSource>
121 {
122  public:
123  QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
124 
125  ~QgsVectorLayerFeatureIterator() override;
126 
128  bool rewind() override;
129 
131  bool close() override;
132 
133  void setInterruptionChecker( QgsFeedback *interruptionChecker ) override SIP_SKIP;
134 
139  struct CORE_EXPORT FetchJoinInfo
140  {
146  int joinField;
147 
148  void addJoinedAttributesCached( QgsFeature &f, const QVariant &joinValue ) const;
149  void addJoinedAttributesDirect( QgsFeature &f, const QVariant &joinValue ) const;
150  };
151 
152 
153  bool isValid() const override;
154 
155  protected:
157  bool fetchFeature( QgsFeature &feature ) override;
158 
163  bool nextFeatureFilterExpression( QgsFeature &f ) override { return fetchFeature( f ); }
164 
166  bool prepareSimplification( const QgsSimplifyMethod &simplifyMethod ) override;
167 
169  void rewindEditBuffer() SIP_SKIP;
170 
172  void prepareJoin( int fieldIdx ) SIP_SKIP;
173 
175  void prepareExpression( int fieldIdx ) SIP_SKIP;
176 
178  void prepareFields() SIP_SKIP;
179 
181  void prepareField( int fieldIdx ) SIP_SKIP;
182 
184  bool fetchNextAddedFeature( QgsFeature &f ) SIP_SKIP;
186  bool fetchNextChangedGeomFeature( QgsFeature &f ) SIP_SKIP;
188  bool fetchNextChangedAttributeFeature( QgsFeature &f ) SIP_SKIP;
190  void useAddedFeature( const QgsFeature &src, QgsFeature &f ) SIP_SKIP;
192  void useChangedAttributeFeature( QgsFeatureId fid, const QgsGeometry &geom, QgsFeature &f ) SIP_SKIP;
194  bool nextFeatureFid( QgsFeature &f ) SIP_SKIP;
196  void addJoinedAttributes( QgsFeature &f ) SIP_SKIP;
197 
207  void addVirtualAttributes( QgsFeature &f ) SIP_SKIP;
208 
216  void addExpressionAttribute( QgsFeature &f, int attrIndex ) SIP_SKIP;
217 
222  void updateChangedAttributes( QgsFeature &f ) SIP_SKIP;
223 
228  void updateFeatureGeometry( QgsFeature &f ) SIP_SKIP;
229 
234 
237 
238  // only related to editing
239  QSet<QgsFeatureId> mFetchConsidered;
240  QgsGeometryMap::ConstIterator mFetchChangedGeomIt;
241  QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt;
242 
243  bool mFetchedFid; // when iterating by FID: indicator whether it has been fetched yet or not
244 
248  QMap<const QgsVectorLayerJoinInfo *, QgsVectorLayerFeatureIterator::FetchJoinInfo> mFetchJoinInfo;
249 
250  QMap<int, QgsExpression *> mExpressionFieldInfo;
251 
253 
254  private:
255 #ifdef SIP_RUN
257 #endif
258 
259  void createExpressionContext();
260  std::unique_ptr<QgsExpressionContext> mExpressionContext;
261 
262  QgsFeedback *mInterruptionChecker = nullptr;
263 
264  QList< int > mPreparedFields;
265  QList< int > mFieldsToPrepare;
266 
268  QList< FetchJoinInfo > mOrderedJoinInfoList;
269 
274  bool prepareOrderBy( const QList<QgsFeatureRequest::OrderByClause> &orderBys ) override;
275 
277  bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
278 
279  void createOrderedJoinList();
280 
284  bool postProcessFeature( QgsFeature &feature );
285 
289  bool checkGeometryValidity( const QgsFeature &feature );
290 };
291 
292 
293 
301 {
302  public:
303 
310 
311  QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
312  QgsCoordinateReferenceSystem sourceCrs() const override;
313  QgsFields fields() const override;
314  QgsWkbTypes::Type wkbType() const override;
315  long featureCount() const override;
316  QString sourceName() const override;
318 
319 
320  private:
321 
322  // ideally this wouldn't be mutable, but QgsVectorLayerFeatureSource has non-const getFeatures()
323  mutable QgsVectorLayerFeatureSource mSource;
324  QgsFeatureIds mSelectedFeatureIds;
326  QString mName;
327  QPointer< QgsVectorLayer > mLayer;
328 
329 };
330 
332 
333 #ifndef SIP_RUN
334 class QgsVectorLayerSelectedFeatureIterator : public QgsAbstractFeatureIterator
335 {
336  public:
337 
338  QgsVectorLayerSelectedFeatureIterator( const QgsFeatureIds &selectedFeatureIds,
339  const QgsFeatureRequest &request,
340  QgsVectorLayerFeatureSource &source );
341 
342  bool rewind() override;
343  bool close() override;
344 
345  protected:
346  bool fetchFeature( QgsFeature &f ) override;
347 
348  private:
349  QgsFeatureIds mSelectedFeatureIds;
350  QgsFeatureIterator mIterator;
351 
352 };
353 
354 #endif
355 
357 
358 #endif // QGSVECTORLAYERFEATUREITERATOR_H
Wrapper for iterator of features from vector data provider or vector layer.
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
Definition: qgsfeature.h:566
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:41
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:34
virtual QgsFields fields() const =0
Returns the fields associated with features in the source.
QMap< int, QgsExpression * > mExpressionFieldInfo
QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt
QgsGeometryMap::ConstIterator mFetchChangedGeomIt
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.
qint64 QgsFeatureId
Definition: qgsfeatureid.h:25
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:122
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
const QgsCoordinateReferenceSystem & crs
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 cancellation 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:68
#define SIP_SKIP
Definition: qgis_sip.h:126
Internal feature iterator to be implemented within data providers.
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:557
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...
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...