QGIS API Documentation  2.99.0-Master (e077efd)
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 <QCache>
23 
24 #include "qgsvectorlayer.h"
25 
28 
38 class CORE_EXPORT QgsVectorLayerCache : public QObject
39 {
40  Q_OBJECT
41 
42  private:
43 
49  class QgsCachedFeature
50  {
51  public:
52 
59  QgsCachedFeature( const QgsFeature& feat, QgsVectorLayerCache* vlCache )
60  : mCache( vlCache )
61  {
62  mFeature = new QgsFeature( feat );
63  }
64 
65  ~QgsCachedFeature()
66  {
67  // That's the reason we need this wrapper:
68  // Inform the cache that this feature has been removed
69  mCache->featureRemoved( mFeature->id() );
70  delete mFeature;
71  }
72 
73  inline const QgsFeature* feature() { return mFeature; }
74 
75  private:
76  QgsFeature* mFeature;
77  QgsVectorLayerCache* mCache;
78 
79  friend class QgsVectorLayerCache;
80  Q_DISABLE_COPY( QgsCachedFeature )
81  };
82 
83  public:
84  QgsVectorLayerCache( QgsVectorLayer* layer, int cacheSize, QObject* parent = nullptr );
86 
93  void setCacheSize( int cacheSize );
94 
102  int cacheSize();
103 
109  void setCacheGeometry( bool cacheGeometry );
110 
111 
117  void setCacheSubsetOfAttributes( const QgsAttributeList& attributes );
118 
125  void setCacheAddedAttributes( bool cacheAddedAttributes );
126 
138  void setFullCache( bool fullCache );
139 
146  bool hasFullCache() const { return mFullCache; }
147 
156  void addCacheIndex( QgsAbstractCacheIndex *cacheIndex );
157 
168 
172  inline QgsFeatureIterator getFeatures( const QString& expression )
173  {
174  return getFeatures( QgsFeatureRequest( expression ) );
175  }
176 
182  {
183  QgsFeature feature;
184  getFeatures( QgsFeatureRequest( fid ) ).nextFeature( feature );
185  return feature;
186  }
187 
192  {
193  return getFeatures( QgsFeatureRequest( fids ) );
194  }
195 
199  inline QgsFeatureIterator getFeatures( const QgsRectangle& rectangle )
200  {
201  return getFeatures( QgsFeatureRequest( rectangle ) );
202  }
203 
210  bool isFidCached( const QgsFeatureId fid ) const;
211 
216  QgsFeatureIds cachedFeatureIds() const { return mCache.keys().toSet(); }
217 
225  bool featureAtId( QgsFeatureId featureId, QgsFeature &feature, bool skipCache = false );
226 
232  bool removeCachedFeature( QgsFeatureId fid );
233 
238 
239  protected:
240 
249  void requestCompleted( const QgsFeatureRequest& featureRequest, const QgsFeatureIds& fids );
250 
258  void featureRemoved( QgsFeatureId fid );
259 
270  bool checkInformationCovered( const QgsFeatureRequest& featureRequest );
271 
272 
273  signals:
274 
284  void progress( int i, bool& cancel );
285 
289  void finished();
290 
296  void cachedLayerDeleted();
297 
302  void attributeValueChanged( QgsFeatureId fid, int field, const QVariant &value );
303 
311  void featureAdded( QgsFeatureId fid );
312 
316  void invalidated();
317 
318  private slots:
319  void onAttributeValueChanged( QgsFeatureId fid, int field, const QVariant& value );
320  void featureDeleted( QgsFeatureId fid );
321  void onFeatureAdded( QgsFeatureId fid );
322  void attributeAdded( int field );
323  void attributeDeleted( int field );
324  void geometryChanged( QgsFeatureId fid, const QgsGeometry& geom );
325  void layerDeleted();
326  void invalidate();
327 
328  private:
329 
330  inline void cacheFeature( QgsFeature& feat )
331  {
332  QgsCachedFeature* cachedFeature = new QgsCachedFeature( feat, this );
333  mCache.insert( feat.id(), cachedFeature );
334  }
335 
336  QgsVectorLayer* mLayer;
337  QCache< QgsFeatureId, QgsCachedFeature > mCache;
338 
339  bool mCacheGeometry;
340  bool mFullCache;
341  QList<QgsAbstractCacheIndex*> mCacheIndices;
342 
343  QgsAttributeList mCachedAttributes;
344 
347  friend class QgsCachedFeature;
348 
356  bool canUseCacheForRequest( const QgsFeatureRequest& featureRequest, QgsFeatureIterator& it );
357 
358  friend class TestVectorLayerCache;
359 };
360 #endif // QgsVectorLayerCache_H
QgsFeatureIterator getFeatures(const QString &expression)
Query the layer for features matching a given expression.
QgsFeatureId id
Definition: qgsfeature.h:139
Wrapper for iterator of features from vector data provider or vector layer.
A rectangle specified with double values.
Definition: qgsrectangle.h:35
QgsVectorLayerCache(QgsVectorLayer *layer, int cacheSize, QObject *parent=nullptr)
QgsFeatureIterator getFeatures(const QgsFeatureIds &fids)
Query the layer for the features with the given ids.
void invalidated()
The cache has been invalidated and cleared.
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeature.h:355
bool removeCachedFeature(QgsFeatureId fid)
Removes the feature identified by fid from the cache if present.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:78
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:135
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.
Uses another iterator as backend and writes features to the cache.
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 ...
This class wraps a request for features to a vector layer (or directly its vector data provider)...
QList< int > QgsAttributeList
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.
Abstract base class for cache indices.
Definition: qgscacheindex.h:29
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.
qint64 QgsFeatureId
Definition: qgsfeature.h:32
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.
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...