QGIS API Documentation  2.99.0-Master (7d4f81d)
qgsvectorlayercache.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectorlayercache.h
3  Cache features of a vector layer
4  -------------------
5  begin : January 2013
6  copyright : (C) Matthias Kuhn
7  email : matthias at opengis dot ch
8 
9  ***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 
19 #ifndef QgsVectorLayerCache_H
20 #define QgsVectorLayerCache_H
21 
22 #include "qgis_core.h"
23 #include "qgis_sip.h"
24 #include "qgis.h"
25 #include <QCache>
26 
27 #include "qgsvectorlayer.h"
28 
31 
41 class CORE_EXPORT QgsVectorLayerCache : public QObject
42 {
43  Q_OBJECT
44 
45  private:
46 
52  class QgsCachedFeature
53  {
54  public:
55 
62  QgsCachedFeature( const QgsFeature &feat, QgsVectorLayerCache *vlCache )
63  : mCache( vlCache )
64  {
65  mFeature = new QgsFeature( feat );
66  }
67 
68  ~QgsCachedFeature()
69  {
70  // That's the reason we need this wrapper:
71  // Inform the cache that this feature has been removed
72  mCache->featureRemoved( mFeature->id() );
73  delete mFeature;
74  }
75 
76  inline const QgsFeature *feature() { return mFeature; }
77 
78  private:
79  QgsFeature *mFeature = nullptr;
80  QgsVectorLayerCache *mCache = nullptr;
81 
82  friend class QgsVectorLayerCache;
83  Q_DISABLE_COPY( QgsCachedFeature )
84  };
85 
86  public:
87  QgsVectorLayerCache( QgsVectorLayer *layer, int cacheSize, QObject *parent SIP_TRANSFERTHIS = nullptr );
89 
96  void setCacheSize( int cacheSize );
97 
105  int cacheSize();
106 
113  void setCacheGeometry( bool cacheGeometry );
114 
120  bool cacheGeometry() const { return mCacheGeometry; }
121 
127  void setCacheSubsetOfAttributes( const QgsAttributeList &attributes );
128 
135  void setCacheAddedAttributes( bool cacheAddedAttributes );
136 
150  void setFullCache( bool fullCache );
151 
158  bool hasFullCache() const { return mFullCache; }
159 
169 
180 
184  inline QgsFeatureIterator getFeatures( const QString &expression )
185  {
186  return getFeatures( QgsFeatureRequest( expression ) );
187  }
188 
194  {
195  QgsFeature feature;
196  getFeatures( QgsFeatureRequest( fid ) ).nextFeature( feature );
197  return feature;
198  }
199 
204  {
205  return getFeatures( QgsFeatureRequest( fids ) );
206  }
207 
211  inline QgsFeatureIterator getFeatures( const QgsRectangle &rectangle )
212  {
213  return getFeatures( QgsFeatureRequest( rectangle ) );
214  }
215 
222  bool isFidCached( const QgsFeatureId fid ) const;
223 
228  QgsFeatureIds cachedFeatureIds() const { return mCache.keys().toSet(); }
229 
237  bool featureAtId( QgsFeatureId featureId, QgsFeature &feature, bool skipCache = false );
238 
244  bool removeCachedFeature( QgsFeatureId fid );
245 
250 
255 
259  QgsFields fields() const;
260 
264  QgsWkbTypes::Type wkbType() const;
265 
266 #ifdef SIP_RUN
267 
272  int __len__() const;
273  % MethodCode
274  sipRes = sipCpp->featureCount();
275  % End
276 #endif
277 
282  long featureCount() const;
283 
284  protected:
285 
294  void requestCompleted( const QgsFeatureRequest &featureRequest, const QgsFeatureIds &fids );
295 
303  void featureRemoved( QgsFeatureId fid );
304 
315  bool checkInformationCovered( const QgsFeatureRequest &featureRequest );
316 
317 
318  signals:
319 
329  void progress( int i, bool &cancel ) SIP_SKIP;
330 
334  void finished();
335 
341  void cachedLayerDeleted();
342 
347  void attributeValueChanged( QgsFeatureId fid, int field, const QVariant &value );
348 
356  void featureAdded( QgsFeatureId fid );
357 
363  void invalidated();
364 
365  private slots:
366  void onAttributeValueChanged( QgsFeatureId fid, int field, const QVariant &value );
367  void featureDeleted( QgsFeatureId fid );
368  void onFeatureAdded( QgsFeatureId fid );
369  void attributeAdded( int field );
370  void attributeDeleted( int field );
371  void geometryChanged( QgsFeatureId fid, const QgsGeometry &geom );
372  void layerDeleted();
373  void invalidate();
374 
375  private:
376 
377  inline void cacheFeature( QgsFeature &feat )
378  {
379  QgsCachedFeature *cachedFeature = new QgsCachedFeature( feat, this );
380  mCache.insert( feat.id(), cachedFeature );
381  }
382 
383  QgsVectorLayer *mLayer = nullptr;
384  QCache< QgsFeatureId, QgsCachedFeature > mCache;
385 
386  bool mCacheGeometry = true;
387  bool mFullCache = false;
388  QList<QgsAbstractCacheIndex *> mCacheIndices;
389 
390  QgsAttributeList mCachedAttributes;
391 
394  friend class QgsCachedFeature;
395 
403  bool canUseCacheForRequest( const QgsFeatureRequest &featureRequest, QgsFeatureIterator &it );
404 
405  friend class TestVectorLayerCache;
406 };
407 #endif // QgsVectorLayerCache_H
QgsFeatureIterator getFeatures(const QString &expression)
Query the layer for features matching a given expression.
QgsFeatureId id
Definition: qgsfeature.h:70
Wrapper for iterator of features from vector data provider or vector layer.
A rectangle specified with double values.
Definition: qgsrectangle.h:38
QgsVectorLayerCache(QgsVectorLayer *layer, int cacheSize, QObject *parent=nullptr)
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:46
QgsFeatureIterator getFeatures(const QgsFeatureIds &fids)
Query the layer for the features with the given ids.
void invalidated()
The cache has been invalidated and cleared.
bool cacheGeometry() const
Returns true if the cache will fetch and cache feature geometries.
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeature.h:519
bool removeCachedFeature(QgsFeatureId fid)
Removes the feature identified by fid from the cache if present.
Container of fields for a vector layer.
Definition: qgsfields.h:41
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:96
void requestCompleted(const QgsFeatureRequest &featureRequest, const QgsFeatureIds &fids)
Gets called, whenever the full list of feature ids for a certain request is known.
QgsVectorLayer * layer()
Returns the layer to which this cache belongs.
bool isFidCached(const QgsFeatureId fid) const
Check if a certain feature id is cached.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:61
void attributeValueChanged(QgsFeatureId fid, int field, const QVariant &value)
Is emitted when an attribute is changed.
void setCacheSubsetOfAttributes(const QgsAttributeList &attributes)
Set the subset of attributes to be cached.
void featureAdded(QgsFeatureId fid)
Is emitted, when a new feature has been added to the layer and this cache.
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:66
Uses another iterator as backend and writes features to the cache.
QgsCoordinateReferenceSystem sourceCrs() const
Returns the coordinate reference system for features in the cache.
#define SIP_SKIP
Definition: qgis_sip.h:119
QgsFeatureIds cachedFeatureIds() const
Returns the set of feature IDs for features which are cached.
void progress(int i, bool &cancel)
When filling the cache, this signal gets emitted periodically to notify about the progress and to be ...
#define SIP_TRANSFER
Definition: qgis_sip.h:36
This class wraps a request for features to a vector layer (or directly its vector data provider)...
QgsFields fields() const
Returns the fields associated with features in the cache.
void cachedLayerDeleted()
Is emitted when the cached layer is deleted.
bool checkInformationCovered(const QgsFeatureRequest &featureRequest)
Checks if the information required to complete the request is cached.
This class caches features of a given QgsVectorLayer.
long featureCount() const
Returns the number of features contained in the source, or -1 if the feature count is unknown...
Abstract base class for cache indices.
Definition: qgscacheindex.h:30
void setCacheGeometry(bool cacheGeometry)
Enable or disable the caching of geometries.
void setFullCache(bool fullCache)
This enables or disables full caching.
bool featureAtId(QgsFeatureId featureId, QgsFeature &feature, bool skipCache=false)
Gets the feature at the given feature id.
void setCacheSize(int cacheSize)
Sets the maximum number of features to keep in the cache.
This class represents a coordinate reference system (CRS).
QgsWkbTypes::Type wkbType() const
Returns the geometry type for features in the cache.
qint64 QgsFeatureId
Definition: qgsfeature.h:37
QgsFeatureIterator getFeatures(const QgsRectangle &rectangle)
Query the layer for the features which intersect the specified rectangle.
Delivers features from the cache.
void featureRemoved(QgsFeatureId fid)
Gets called, whenever a feature has been removed.
int cacheSize()
Returns the maximum number of features this cache will hold.
QgsFeature getFeature(QgsFeatureId fid)
Query the layer for the feature with the given id.
QList< int > QgsAttributeList
Definition: qgsfield.h:27
bool nextFeature(QgsFeature &f)
void addCacheIndex(QgsAbstractCacheIndex *cacheIndex)
Adds a QgsAbstractCacheIndex to this cache.
Represents a vector layer which manages a vector based data sets.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &featureRequest=QgsFeatureRequest())
Query this VectorLayerCache for features.
void finished()
When filling the cache, this signal gets emitted once the cache is fully initialized.
bool hasFullCache() const
Returns true if the cache is complete, ie it contains all features.
void setCacheAddedAttributes(bool cacheAddedAttributes)
If this is enabled, the subset of cached attributes will automatically be extended to also include ne...