25#include <QElapsedTimer> 
   35  connect( mLayer, &QgsVectorLayer::destroyed, 
this, &QgsVectorLayerCache::layerDeleted );
 
   46  connectJoinedLayers();
 
   51  qDeleteAll( mCacheIndices );
 
   52  mCacheIndices.clear();
 
   62  return mCache.maxCost();
 
   68  bool mustInvalidate = shouldCacheGeometry && !mCacheGeometry; 
 
   69  mCacheGeometry = shouldCacheGeometry;
 
   86  if ( ! mCache.isEmpty() && ! QSet<int>( mCachedAttributes.cbegin(), mCachedAttributes.cend() )
 
   87       .contains( QSet<int>( attributes.cbegin(), attributes.cend( ) ) ) )
 
   89  mCachedAttributes = attributes;
 
   94  return mCachedAttributes;
 
   99  mFullCache = fullCache;
 
  108                           .setSubsetOfAttributes( mCachedAttributes )
 
  121      if ( t.elapsed() > 1000 )
 
  140  mCacheIndices.append( cacheIndex );
 
  145  if ( cacheAddedAttributes )
 
  157  bool featureFound = 
false;
 
  163    cachedFeature = mCache[ featureId ];
 
  168    feature = 
QgsFeature( *cachedFeature->feature() );
 
  174    const bool allAttrsFetched { mCachedAttributes.count( ) == mLayer->
fields().
count() };
 
  175    if ( ! allAttrsFetched )
 
  177      request.setSubsetOfAttributes( mCachedAttributes );
 
  179    if ( !mCacheGeometry )
 
  185      cacheFeature( feature, allAttrsFetched );
 
  196  bool featureFound = 
false;
 
  202    cachedFeature = mCache[ featureId ];
 
  205  if ( cachedFeature && cachedFeature->allAttributesFetched() )
 
  207    feature = 
QgsFeature( *cachedFeature->feature() );
 
  211                                 .setFilterFid( featureId )
 
  213            .nextFeature( feature ) )
 
  215    cacheFeature( feature, 
true );
 
  224  bool removed = mCache.remove( fid );
 
  227    if ( 
auto unorderedIt = std::find( mCacheUnorderedKeys.begin(), mCacheUnorderedKeys.end(), fid ); unorderedIt != mCacheUnorderedKeys.end() )
 
  229      mCacheUnorderedKeys.erase( unorderedIt );
 
  231      if ( 
auto orderedIt = std::find( mCacheOrderedKeys.begin(), mCacheOrderedKeys.end(), fid ); orderedIt != mCacheOrderedKeys.end() )
 
  232        mCacheOrderedKeys.erase( orderedIt );
 
  245  return mLayer->
crs();
 
  266  if ( fids.count() <= mCache.size() )
 
  268    for ( 
const auto &idx : std::as_const( mCacheIndices ) )
 
  270      idx->requestCompleted( featureRequest, fids );
 
  282  const auto constMCacheIndices = mCacheIndices;
 
  285    idx->flushFeature( fid );
 
  289void QgsVectorLayerCache::onAttributeValueChanged( 
QgsFeatureId fid, 
int field, 
const QVariant &value )
 
  295    cachedFeat->mFeature->setAttribute( 
field, value );
 
  301void QgsVectorLayerCache::onJoinAttributeValueChanged( 
QgsFeatureId fid, 
int field, 
const QVariant &value )
 
  303  const QgsVectorLayer *joinLayer = qobject_cast<const QgsVectorLayer *>( sender() );
 
  305  const auto constVectorJoins = mLayer->
vectorJoins();
 
  308    if ( joinLayer == info.joinLayer() )
 
  312      const QString fieldName = info.prefixedFieldName( joinLayer->
fields().
field( 
field ) );
 
  315      if ( feature.
isValid() && fieldIndex != -1 )
 
  317        onAttributeValueChanged( feature.
id(), fieldIndex, value );
 
  324void QgsVectorLayerCache::featureDeleted( 
QgsFeatureId fid )
 
  326  mCache.remove( fid );
 
  328  if ( 
auto it = mCacheUnorderedKeys.find( fid ); it != mCacheUnorderedKeys.end() )
 
  330    mCacheUnorderedKeys.erase( it );
 
  331    if ( 
auto orderedIt = std::find( mCacheOrderedKeys.begin(), mCacheOrderedKeys.end(), fid ); orderedIt != mCacheOrderedKeys.end() )
 
  332      mCacheOrderedKeys.erase( orderedIt );
 
  336void QgsVectorLayerCache::onFeatureAdded( 
QgsFeatureId fid )
 
  351void QgsVectorLayerCache::attributeAdded( 
int field )
 
  354  mCachedAttributes.append( 
field );
 
  358void QgsVectorLayerCache::attributeDeleted( 
int field )
 
  361  mCachedAttributes.clear();
 
  363  const auto constAttrs = attrs;
 
  364  for ( 
int attr : constAttrs )
 
  367      mCachedAttributes << attr;
 
  368    else if ( attr > 
field )
 
  369      mCachedAttributes << attr - 1;
 
  379    cachedFeat->mFeature->setGeometry( geom );
 
  383void QgsVectorLayerCache::layerDeleted()
 
  389void QgsVectorLayerCache::invalidate()
 
  391  if ( ! mCache.isEmpty() )
 
  394    mCacheOrderedKeys.clear();
 
  395    mCacheUnorderedKeys.clear();
 
  404  const auto constMCacheIndices = mCacheIndices;
 
  407    if ( idx->getCacheIterator( it, featureRequest ) )
 
  418      if ( mCache.contains( featureRequest.
filterFid() ) )
 
  452  bool requiresWriterIt = 
true; 
 
  460      requiresWriterIt = 
false;
 
  465      requiresWriterIt = !canUseCacheForRequest( featureRequest, it );
 
  472    requiresWriterIt = 
false;
 
  482    if ( mCacheGeometry && mLayer->
isSpatial() )
 
  488      if ( mCachedAttributes.count( ) != mLayer->
fields().
count() )
 
  491        QSet<int> attrs( requestSubset.begin(), requestSubset.end() );
 
  492        for ( 
int attr : std::as_const( mCachedAttributes ) )
 
  493          attrs.insert( attr );
 
  499        myRequest.
setFlags( myRequest.
flags().setFlag( QgsFeatureRequest::Flag::SubsetOfAttributes, 
false ) );
 
  511  return mCache.contains( fid );
 
  516  const QList< QgsFeatureId > keys = mCache.keys();
 
  534  const auto constRequestedAttributes = requestedAttributes;
 
  535  for ( 
int attr : constRequestedAttributes )
 
  537    if ( !mCachedAttributes.contains( attr ) )
 
  545            && !mCacheGeometry );
 
  548void QgsVectorLayerCache::connectJoinedLayers()
 const 
  550  const auto constVectorJoins = mLayer->
vectorJoins();
 
  559bool QgsVectorLayerCache::QgsCachedFeature::allAttributesFetched()
 const 
  561  return mAllAttributesFetched;
 
@ NoFilter
No spatial filtering of features.
 
WkbType
The WKB type describes the number of dimensions a geometry has.
 
Abstract base class for cache indices.
 
This class represents a coordinate reference system (CRS).
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
 
This class wraps a request for features to a vector layer (or directly its vector data provider).
 
QgsRectangle filterRect() const
Returns the rectangle from which features will be taken.
 
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
 
Flags flags() const
Returns the flags which affect how features are fetched.
 
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
 
@ SubsetOfAttributes
Fetch only a subset of attributes (setSubsetOfAttributes sets this flag)
 
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
 
Qgis::SpatialFilterType spatialFilterType() const
Returns the spatial filter type which is currently set on this request.
 
QgsAttributeList subsetOfAttributes() const
Returns the subset of attributes which at least need to be fetched.
 
FilterType filterType() const
Returns the attribute/ID filter type which is currently set on this request.
 
@ FilterFid
Filter using feature ID.
 
@ FilterFids
Filter using feature IDs.
 
@ FilterNone
No filter is applied.
 
@ FilterExpression
Filter using expression.
 
const QgsFeatureIds & filterFids() const
Returns the feature IDs that should be fetched.
 
QgsFeatureId filterFid() const
Returns the feature ID that should be fetched.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
bool isValid() const
Returns the validity of this feature.
 
Container of fields for a vector layer.
 
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
 
int count() const
Returns number of items.
 
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
 
A geometry is the spatial representation of a feature.
 
QgsCoordinateReferenceSystem crs
 
void dataChanged()
Data of layer changed.
 
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other rectangle.
 
bool isFidCached(QgsFeatureId fid) const
Check if a certain feature id is cached.
 
void setFullCache(bool fullCache)
This enables or disables full caching.
 
void finished()
When filling the cache, this signal gets emitted once the cache is fully initialized.
 
void featureRemoved(QgsFeatureId fid)
Gets called, whenever a feature has been removed.
 
void setCacheAddedAttributes(bool cacheAddedAttributes)
If this is enabled, the subset of cached attributes will automatically be extended to also include ne...
 
friend class QgsCachedFeature
 
void invalidated()
The cache has been invalidated and cleared.
 
void setCacheSize(int cacheSize)
Sets the maximum number of features to keep in the cache.
 
void setCacheSubsetOfAttributes(const QgsAttributeList &attributes)
Set the list (possibly a subset) of attributes to be cached.
 
void featureAdded(QgsFeatureId fid)
Emitted when a new feature has been added to the layer and this cache.
 
QgsFields fields() const
Returns the fields associated with features in the cache.
 
void cachedLayerDeleted()
Is emitted when the cached layer is deleted.
 
friend class QgsCachedFeatureWriterIterator
 
void requestCompleted(const QgsFeatureRequest &featureRequest, const QgsFeatureIds &fids)
Gets called, whenever the full list of feature ids for a certain request is known.
 
void attributeValueChanged(QgsFeatureId fid, int field, const QVariant &value)
Emitted when an attribute is changed.
 
bool removeCachedFeature(QgsFeatureId fid)
Removes the feature identified by fid from the cache if present.
 
void progress(int i, bool &cancel)
When filling the cache, this signal gets emitted periodically to notify about the progress and to be ...
 
QgsVectorLayer * layer()
Returns the layer to which this cache belongs.
 
long long featureCount() const
Returns the number of features contained in the source, or -1 if the feature count is unknown.
 
QgsCoordinateReferenceSystem sourceCrs() const
Returns the coordinate reference system for features in the cache.
 
bool checkInformationCovered(const QgsFeatureRequest &featureRequest)
Checks if the information required to complete the request is cached.
 
QgsFeatureIds cachedFeatureIds() const
Returns the set of feature IDs for features which are cached.
 
bool featureAtIdWithAllAttributes(QgsFeatureId featureId, QgsFeature &feature, bool skipCache=false)
Gets the feature at the given feature id with all attributes, if the cached feature already contains ...
 
bool cacheGeometry() const
Returns true if the cache will fetch and cache feature geometries.
 
Qgis::WkbType wkbType() const
Returns the geometry type for features in the cache.
 
int cacheSize()
Returns the maximum number of features this cache will hold.
 
friend class QgsCachedFeatureIterator
 
QgsAttributeList cacheSubsetOfAttributes() const
Returns the list (possibly a subset) of cached attributes.
 
void addCacheIndex(QgsAbstractCacheIndex *cacheIndex)
Adds a QgsAbstractCacheIndex to this cache.
 
QgsVectorLayerCache(QgsVectorLayer *layer, int cacheSize, QObject *parent=nullptr)
 
void setCacheGeometry(bool cacheGeometry)
Enable or disable the caching of geometries.
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &featureRequest=QgsFeatureRequest())
Query this VectorLayerCache for features.
 
~QgsVectorLayerCache() override
 
bool featureAtId(QgsFeatureId featureId, QgsFeature &feature, bool skipCache=false)
Gets the feature at the given feature id.
 
QgsFeature targetedFeatureOf(const QgsVectorLayerJoinInfo *info, const QgsFeature &feature) const
Returns the targeted feature corresponding to the joined feature.
 
Defines left outer join from our vector layer to some other vector layer.
 
Represents a vector layer which manages a vector based data sets.
 
void attributeAdded(int idx)
Will be emitted, when a new attribute has been added to this vector layer.
 
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
 
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
QgsFields fields() const FINAL
Returns the list of fields of this layer.
 
QgsAttributeList attributeList() const
Returns list of attribute indexes.
 
Q_INVOKABLE Qgis::WkbType wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
 
void attributeDeleted(int idx)
Will be emitted, when an attribute has been deleted from this vector layer.
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
QgsVectorLayerJoinBuffer * joinBuffer()
Returns the join buffer object.
 
QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
 
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &value)
Emitted whenever an attribute value change is done in the edit buffer.
 
QgsRectangle extent() const FINAL
Returns the extent of the layer.
 
void updatedFields()
Emitted whenever the fields available from this layer have been changed.
 
void featureAdded(QgsFeatureId fid)
Emitted when a new feature has been added to the layer.
 
void featureDeleted(QgsFeatureId fid)
Emitted when a feature has been deleted.
 
const QList< QgsVectorLayerJoinInfo > vectorJoins() const
 
void geometryChanged(QgsFeatureId fid, const QgsGeometry &geometry)
Emitted whenever a geometry change is done in the edit buffer.
 
QSet< QgsFeatureId > QgsFeatureIds
 
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
 
QList< int > QgsAttributeList