QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgsfeaturerequest.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfeaturerequest.h
3  ---------------------
4  begin : Mai 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 QGSFEATUREREQUEST_H
16 #define QGSFEATUREREQUEST_H
17 
18 #include "qgis_core.h"
19 #include "qgis_sip.h"
20 #include <QFlags>
21 #include <QList>
22 #include <memory>
23 
24 #include "qgsfeature.h"
25 #include "qgsrectangle.h"
26 #include "qgsexpression.h"
27 #include "qgsexpressioncontext.h"
28 #include "qgssimplifymethod.h"
29 
30 
31 
76 class CORE_EXPORT QgsFeatureRequest
77 {
78  public:
79  enum Flag
80  {
81  NoFlags = 0,
82  NoGeometry = 1,
83  SubsetOfAttributes = 2,
84  ExactIntersect = 4,
85  IgnoreStaticNodesDuringExpressionCompilation = 8,
86  };
87  Q_DECLARE_FLAGS( Flags, Flag )
88 
89 
93  {
97  FilterFids
98  };
99 
102  {
103  GeometryNoCheck = 0,
104  GeometrySkipInvalid = 1,
105  GeometryAbortOnInvalid = 2,
106  };
107 
131  class CORE_EXPORT OrderByClause
132  {
133  public:
134 
143  OrderByClause( const QString &expression, bool ascending = true );
144 
152  OrderByClause( const QString &expression, bool ascending, bool nullsfirst );
153 
162  OrderByClause( const QgsExpression &expression, bool ascending = true );
163 
171  OrderByClause( const QgsExpression &expression, bool ascending, bool nullsfirst );
172 
177  QgsExpression expression() const;
178 
186  bool prepare( QgsExpressionContext *context );
187 
192  bool ascending() const;
193 
197  void setAscending( bool ascending );
198 
203  bool nullsFirst() const;
204 
208  void setNullsFirst( bool nullsFirst );
209 
213  QString dump() const;
214 
215  // friend inline int qHash(const OrderByClause &a) { return qHash(a.mExpression.expression()) ^ qHash(a.mAscending) ^ qHash( a.mNullsFirst); }
216 
217  private:
218  QgsExpression mExpression;
219  bool mAscending;
220  bool mNullsFirst;
221  };
222 
223 
231  class OrderBy : public QList<QgsFeatureRequest::OrderByClause>
232  {
233  public:
234 
238  CORE_EXPORT OrderBy();
239 
243  CORE_EXPORT OrderBy( const QList<QgsFeatureRequest::OrderByClause> &other );
244 
251  QList<QgsFeatureRequest::OrderByClause> CORE_EXPORT list() const;
252 
256  void CORE_EXPORT save( QDomElement &elem ) const;
257 
261  void CORE_EXPORT load( const QDomElement &elem );
262 
267  QSet<QString> CORE_EXPORT usedAttributes() const;
268 
273  QSet<int> CORE_EXPORT usedAttributeIndices( const QgsFields &fields ) const;
274 
278  QString CORE_EXPORT dump() const;
279  };
280 
284  static const QString ALL_ATTRIBUTES;
285 
289  explicit QgsFeatureRequest( QgsFeatureId fid );
291  explicit QgsFeatureRequest( const QgsFeatureIds &fids );
292 
300  explicit QgsFeatureRequest( const QgsRectangle &rectangle );
301 
303  explicit QgsFeatureRequest( const QgsExpression &expr, const QgsExpressionContext &context = QgsExpressionContext() );
307  QgsFeatureRequest &operator=( const QgsFeatureRequest &rh );
308 
314  FilterType filterType() const { return mFilter; }
315 
325  QgsFeatureRequest &setFilterRect( const QgsRectangle &rectangle );
326 
337  const QgsRectangle &filterRect() const { return mFilterRect; }
338 
340  QgsFeatureRequest &setFilterFid( QgsFeatureId fid );
342  QgsFeatureId filterFid() const { return mFilterFid; }
343 
345  QgsFeatureRequest &setFilterFids( const QgsFeatureIds &fids );
347  const QgsFeatureIds &filterFids() const { return mFilterFids; }
348 
356  QgsFeatureRequest &setInvalidGeometryCheck( InvalidGeometryCheck check );
357 
363  InvalidGeometryCheck invalidGeometryCheck() const { return mInvalidGeometryFilter; }
364 
372 #ifndef SIP_RUN
373  QgsFeatureRequest &setInvalidGeometryCallback( const std::function< void( const QgsFeature & )> &callback );
374 #else
375  QgsFeatureRequest &setInvalidGeometryCallback( SIP_PYCALLABLE / AllowNone / );
376  % MethodCode
377  Py_BEGIN_ALLOW_THREADS
378 
379  sipCpp->setInvalidGeometryCallback( [a0]( const QgsFeature &arg )
380  {
381  SIP_BLOCK_THREADS
382  Py_XDECREF( sipCallMethod( NULL, a0, "D", &arg, sipType_QgsFeature, NULL ) );
383  SIP_UNBLOCK_THREADS
384  } );
385 
386  sipRes = sipCpp;
387 
388  Py_END_ALLOW_THREADS
389  % End
390 #endif
391 
399  std::function< void( const QgsFeature & ) > invalidGeometryCallback() const { return mInvalidGeometryCallback; } SIP_SKIP
400 
407  QgsFeatureRequest &setFilterExpression( const QString &expression );
408 
414  QgsExpression *filterExpression() const { return mFilterExpression.get(); }
415 
422  QgsFeatureRequest &combineFilterExpression( const QString &expression );
423 
430  QgsExpressionContext *expressionContext() { return &mExpressionContext; }
431 
438  QgsFeatureRequest &setExpressionContext( const QgsExpressionContext &context );
439 
448  QgsFeatureRequest &disableFilter() { mFilter = FilterNone; mFilterExpression.reset(); return *this; }
449 
461  QgsFeatureRequest &addOrderBy( const QString &expression, bool ascending = true );
462 
472  QgsFeatureRequest &addOrderBy( const QString &expression, bool ascending, bool nullsfirst );
473 
479  OrderBy orderBy() const;
480 
486  QgsFeatureRequest &setOrderBy( const OrderBy &orderBy );
487 
494  QgsFeatureRequest &setLimit( long limit );
495 
501  long limit() const { return mLimit; }
502 
504  QgsFeatureRequest &setFlags( QgsFeatureRequest::Flags flags );
505  const Flags &flags() const { return mFlags; }
506 
514  QgsFeatureRequest &setSubsetOfAttributes( const QgsAttributeList &attrs );
515 
522  QgsFeatureRequest &setNoAttributes();
523 
528  QgsAttributeList subsetOfAttributes() const { return mAttrs; }
529 
531  QgsFeatureRequest &setSubsetOfAttributes( const QStringList &attrNames, const QgsFields &fields );
532 
534  QgsFeatureRequest &setSubsetOfAttributes( const QSet<QString> &attrNames, const QgsFields &fields );
535 
540  QgsFeatureRequest &setSimplifyMethod( const QgsSimplifyMethod &simplifyMethod );
541 
546  const QgsSimplifyMethod &simplifyMethod() const { return mSimplifyMethod; }
547 
556  QgsCoordinateReferenceSystem destinationCrs() const;
557 
565  QgsCoordinateTransformContext transformContext() const;
566 
590  QgsFeatureRequest &setDestinationCrs( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context );
591 
600 #ifndef SIP_RUN
601  QgsFeatureRequest &setTransformErrorCallback( const std::function< void( const QgsFeature & )> &callback );
602 #else
603  QgsFeatureRequest &setTransformErrorCallback( SIP_PYCALLABLE / AllowNone / );
604  % MethodCode
605  Py_BEGIN_ALLOW_THREADS
606 
607  sipCpp->setTransformErrorCallback( [a0]( const QgsFeature &arg )
608  {
609  SIP_BLOCK_THREADS
610  Py_XDECREF( sipCallMethod( NULL, a0, "D", &arg, sipType_QgsFeature, NULL ) );
611  SIP_UNBLOCK_THREADS
612  } );
613 
614  sipRes = sipCpp;
615 
616  Py_END_ALLOW_THREADS
617  % End
618 #endif
619 
628  std::function< void( const QgsFeature & ) > transformErrorCallback() const { return mTransformErrorCallback; } SIP_SKIP
629 
630 
640  bool acceptFeature( const QgsFeature &feature );
641 
651  Q_DECL_DEPRECATED int connectionTimeout() const SIP_DEPRECATED;
652 
662  Q_DECL_DEPRECATED QgsFeatureRequest &setConnectionTimeout( int connectionTimeout ) SIP_DEPRECATED;
663 
672  int timeout() const;
673 
682  QgsFeatureRequest &setTimeout( int timeout );
683 
696  bool requestMayBeNested() const;
697 
710  QgsFeatureRequest &setRequestMayBeNested( bool requestMayBeNested );
711 
712  protected:
713  FilterType mFilter = FilterNone;
714  QgsRectangle mFilterRect;
715  QgsFeatureId mFilterFid = -1;
716  QgsFeatureIds mFilterFids;
717  std::unique_ptr< QgsExpression > mFilterExpression;
718  QgsExpressionContext mExpressionContext;
719  Flags mFlags = Flags();
721  QgsSimplifyMethod mSimplifyMethod;
722  long mLimit = -1;
723  OrderBy mOrderBy;
724  InvalidGeometryCheck mInvalidGeometryFilter = GeometryNoCheck;
725  std::function< void( const QgsFeature & ) > mInvalidGeometryCallback;
726  std::function< void( const QgsFeature & ) > mTransformErrorCallback;
728  QgsCoordinateTransformContext mTransformContext;
729  int mTimeout = -1;
730  int mRequestMayBeNested = false;
731 };
732 
734 
735 
736 class QgsFeatureIterator;
738 
744 class CORE_EXPORT QgsAbstractFeatureSource
745 {
746  public:
747  virtual ~QgsAbstractFeatureSource();
748 
749 
750  // IMPORTANT -- do NOT remove the /TransferBack/ annotation here -- while it looks completely wrong, it's
751  // required for Python data providers to work correctly! Argh!
752 
759 
760  // IMPORTANT -- do NOT remove the /TransferBack/ annotation here -- while it looks completely wrong, it's
761  // required for Python data providers to work correctly! Argh!
762 
763  protected:
764  void iteratorOpened( QgsAbstractFeatureIterator *it );
765  void iteratorClosed( QgsAbstractFeatureIterator *it );
766 
767  QSet< QgsAbstractFeatureIterator * > mActiveIterators;
768 
769  template<typename> friend class QgsAbstractFeatureIteratorFromSource;
770 };
771 
772 #endif // QGSFEATUREREQUEST_H
Helper template that cares of two things: 1.
Internal feature iterator to be implemented within data providers.
Base class that can be used for any class that is capable of returning features.
QSet< QgsAbstractFeatureIterator * > mActiveIterators
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest())=0
Gets an iterator for features matching the specified request.
This class represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Class for parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
The OrderByClause class represents an order by clause for a QgsFeatureRequest.
Represents a list of OrderByClauses, with the most important first and the least important last.
CORE_EXPORT OrderBy()
Create a new empty order by.
This class wraps a request for features to a vector layer (or directly its vector data provider).
std::function< void(const QgsFeature &) > invalidGeometryCallback() const
Returns the callback function to use when encountering an invalid geometry and invalidGeometryCheck()...
const QgsSimplifyMethod & simplifyMethod() const
Gets simplification method for geometries that will be fetched.
InvalidGeometryCheck
Handling of features with invalid geometries.
InvalidGeometryCheck invalidGeometryCheck() const
Returns the invalid geometry checking behavior.
QgsExpression * filterExpression() const
Returns the filter expression if set.
static const QString ALL_ATTRIBUTES
A special attribute that if set matches all attributes.
QgsExpressionContext * expressionContext()
Returns the expression context used to evaluate filter expressions.
QgsAttributeList subsetOfAttributes() const
Returns the subset of attributes which at least need to be fetched.
QgsFeatureRequest & disableFilter()
Disables filter conditions.
const QgsRectangle & filterRect() const
Returns the rectangle from which features will be taken.
FilterType filterType() const
Returns the filter type which is currently set on this request.
const QgsFeatureIds & filterFids() const
Gets feature IDs that should be fetched.
long limit() const
Returns the maximum number of features to request, or -1 if no limit set.
FilterType
Types of filters.
@ FilterFid
Filter using feature ID.
@ FilterNone
No filter is applied.
@ FilterExpression
Filter using expression.
const Flags & flags() const
std::function< void(const QgsFeature &) > transformErrorCallback() const
Returns the callback function to use when encountering a transform error when iterating features and ...
QgsFeatureId filterFid() const
Gets the feature ID that should be fetched.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:56
Container of fields for a vector layer.
Definition: qgsfields.h:45
A rectangle specified with double values.
Definition: qgsrectangle.h:42
This class contains information about how to simplify geometries fetched from a QgsFeatureIterator.
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:79
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFERBACK
Definition: qgis_sip.h:48
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:37
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28
QList< int > QgsAttributeList
Definition: qgsfield.h:26
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsField::ConfigurationFlags) CORE_EXPORT QDataStream &operator<<(QDataStream &out
Writes the field to stream out. QGIS version compatibility is not guaranteed.
const QgsCoordinateReferenceSystem & crs