QGIS API Documentation  2.99.0-Master (0a63d1f)
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 <QCache>
24 
25 #include "qgsvectorlayer.h"
26 
29 
39 class CORE_EXPORT QgsVectorLayerCache : public QObject
40 {
41  Q_OBJECT
42 
43  private:
44 
50  class QgsCachedFeature
51  {
52  public:
53 
60  QgsCachedFeature( const QgsFeature& feat, QgsVectorLayerCache* vlCache )
61  : mCache( vlCache )
62  {
63  mFeature = new QgsFeature( feat );
64  }
65 
66  ~QgsCachedFeature()
67  {
68  // That's the reason we need this wrapper:
69  // Inform the cache that this feature has been removed
70  mCache->featureRemoved( mFeature->id() );
71  delete mFeature;
72  }
73 
74  inline const QgsFeature* feature() { return mFeature; }
75 
76  private:
77  QgsFeature* mFeature;
78  QgsVectorLayerCache* mCache;
79 
80  friend class QgsVectorLayerCache;
81  Q_DISABLE_COPY( QgsCachedFeature )
82  };
83 
84  public:
85  QgsVectorLayerCache( QgsVectorLayer* layer, int cacheSize, QObject* parent = nullptr );
87 
94  void setCacheSize( int cacheSize );
95 
103  int cacheSize();
104 
110  void setCacheGeometry( bool cacheGeometry );
111 
112 
118  void setCacheSubsetOfAttributes( const QgsAttributeList& attributes );
119 
126  void setCacheAddedAttributes( bool cacheAddedAttributes );
127 
139  void setFullCache( bool fullCache );
140 
147  bool hasFullCache() const { return mFullCache; }
148 
157  void addCacheIndex( QgsAbstractCacheIndex *cacheIndex );
158 
169 
173  inline QgsFeatureIterator getFeatures( const QString& expression )
174  {
175  return getFeatures( QgsFeatureRequest( expression ) );
176  }
177 
183  {
184  QgsFeature feature;
185  getFeatures( QgsFeatureRequest( fid ) ).nextFeature( feature );
186  return feature;
187  }
188 
193  {
194  return getFeatures( QgsFeatureRequest( fids ) );
195  }
196 
200  inline QgsFeatureIterator getFeatures( const QgsRectangle& rectangle )
201  {
202  return getFeatures( QgsFeatureRequest( rectangle ) );
203  }
204 
211  bool isFidCached( const QgsFeatureId fid ) const;
212 
217  QgsFeatureIds cachedFeatureIds() const { return mCache.keys().toSet(); }
218 
226  bool featureAtId( QgsFeatureId featureId, QgsFeature &feature, bool skipCache = false );
227 
233  bool removeCachedFeature( QgsFeatureId fid );
234 
239 
240  protected:
241 
250  void requestCompleted( const QgsFeatureRequest& featureRequest, const QgsFeatureIds& fids );
251 
259  void featureRemoved( QgsFeatureId fid );
260 
271  bool checkInformationCovered( const QgsFeatureRequest& featureRequest );
272 
273 
274  signals:
275 
285  void progress( int i, bool& cancel );
286 
290  void finished();
291 
297  void cachedLayerDeleted();
298 
303  void attributeValueChanged( QgsFeatureId fid, int field, const QVariant &value );
304 
312  void featureAdded( QgsFeatureId fid );
313 
317  void invalidated();
318 
319  private slots:
320  void onAttributeValueChanged( QgsFeatureId fid, int field, const QVariant& value );
321  void featureDeleted( QgsFeatureId fid );
322  void onFeatureAdded( QgsFeatureId fid );
323  void attributeAdded( int field );
324  void attributeDeleted( int field );
325  void geometryChanged( QgsFeatureId fid, const QgsGeometry& geom );
326  void layerDeleted();
327  void invalidate();
328 
329  private:
330 
331  inline void cacheFeature( QgsFeature& feat )
332  {
333  QgsCachedFeature* cachedFeature = new QgsCachedFeature( feat, this );
334  mCache.insert( feat.id(), cachedFeature );
335  }
336 
337  QgsVectorLayer* mLayer;
338  QCache< QgsFeatureId, QgsCachedFeature > mCache;
339 
340  bool mCacheGeometry;
341  bool mFullCache;
342  QList<QgsAbstractCacheIndex*> mCacheIndices;
343 
344  QgsAttributeList mCachedAttributes;
345 
348  friend class QgsCachedFeature;
349 
357  bool canUseCacheForRequest( const QgsFeatureRequest& featureRequest, QgsFeatureIterator& it );
358 
359  friend class TestVectorLayerCache;
360 };
361 #endif // QgsVectorLayerCache_H
QgsFeatureIterator getFeatures(const QString &expression)
Query the layer for features matching a given expression.
QgsFeatureId id
Definition: qgsfeature.h:140
Wrapper for iterator of features from vector data provider or vector layer.
A rectangle specified with double values.
Definition: qgsrectangle.h:36
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:348
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:79
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:136
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: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.
qint64 QgsFeatureId
Definition: qgsfeature.h:33
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...