QGIS API Documentation  3.19.0-Master (c9e5875a2b)
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  EmbeddedSymbols = 16,
87  };
88  Q_DECLARE_FLAGS( Flags, Flag )
89 
90 
94  {
98  FilterFids
99  };
100 
103  {
104  GeometryNoCheck = 0,
105  GeometrySkipInvalid = 1,
106  GeometryAbortOnInvalid = 2,
107  };
108 
132  class CORE_EXPORT OrderByClause
133  {
134  public:
135 
144  OrderByClause( const QString &expression, bool ascending = true );
145 
153  OrderByClause( const QString &expression, bool ascending, bool nullsfirst );
154 
163  OrderByClause( const QgsExpression &expression, bool ascending = true );
164 
172  OrderByClause( const QgsExpression &expression, bool ascending, bool nullsfirst );
173 
178  QgsExpression expression() const;
179 
187  bool prepare( QgsExpressionContext *context );
188 
193  bool ascending() const;
194 
198  void setAscending( bool ascending );
199 
204  bool nullsFirst() const;
205 
209  void setNullsFirst( bool nullsFirst );
210 
214  QString dump() const;
215 
216  // friend inline int qHash(const OrderByClause &a) { return qHash(a.mExpression.expression()) ^ qHash(a.mAscending) ^ qHash( a.mNullsFirst); }
217 
218  private:
219  QgsExpression mExpression;
220  bool mAscending;
221  bool mNullsFirst;
222  };
223 
224 
232  class OrderBy : public QList<QgsFeatureRequest::OrderByClause>
233  {
234  public:
235 
239  CORE_EXPORT OrderBy();
240 
244  CORE_EXPORT OrderBy( const QList<QgsFeatureRequest::OrderByClause> &other );
245 
252  QList<QgsFeatureRequest::OrderByClause> CORE_EXPORT list() const;
253 
257  void CORE_EXPORT save( QDomElement &elem ) const;
258 
262  void CORE_EXPORT load( const QDomElement &elem );
263 
268  QSet<QString> CORE_EXPORT usedAttributes() const;
269 
274  QSet<int> CORE_EXPORT usedAttributeIndices( const QgsFields &fields ) const;
275 
279  QString CORE_EXPORT dump() const;
280  };
281 
285  static const QString ALL_ATTRIBUTES;
286 
290  explicit QgsFeatureRequest( QgsFeatureId fid );
292  explicit QgsFeatureRequest( const QgsFeatureIds &fids );
293 
301  explicit QgsFeatureRequest( const QgsRectangle &rectangle );
302 
304  explicit QgsFeatureRequest( const QgsExpression &expr, const QgsExpressionContext &context = QgsExpressionContext() );
308  QgsFeatureRequest &operator=( const QgsFeatureRequest &rh );
309 
315  FilterType filterType() const { return mFilter; }
316 
326  QgsFeatureRequest &setFilterRect( const QgsRectangle &rectangle );
327 
338  const QgsRectangle &filterRect() const { return mFilterRect; }
339 
341  QgsFeatureRequest &setFilterFid( QgsFeatureId fid );
343  QgsFeatureId filterFid() const { return mFilterFid; }
344 
346  QgsFeatureRequest &setFilterFids( const QgsFeatureIds &fids );
348  const QgsFeatureIds &filterFids() const { return mFilterFids; }
349 
357  QgsFeatureRequest &setInvalidGeometryCheck( InvalidGeometryCheck check );
358 
364  InvalidGeometryCheck invalidGeometryCheck() const { return mInvalidGeometryFilter; }
365 
373 #ifndef SIP_RUN
374  QgsFeatureRequest &setInvalidGeometryCallback( const std::function< void( const QgsFeature & )> &callback );
375 #else
376  QgsFeatureRequest &setInvalidGeometryCallback( SIP_PYCALLABLE / AllowNone / );
377  % MethodCode
378  Py_BEGIN_ALLOW_THREADS
379 
380  sipCpp->setInvalidGeometryCallback( [a0]( const QgsFeature &arg )
381  {
382  SIP_BLOCK_THREADS
383  Py_XDECREF( sipCallMethod( NULL, a0, "D", &arg, sipType_QgsFeature, NULL ) );
384  SIP_UNBLOCK_THREADS
385  } );
386 
387  sipRes = sipCpp;
388 
389  Py_END_ALLOW_THREADS
390  % End
391 #endif
392 
400  std::function< void( const QgsFeature & ) > invalidGeometryCallback() const { return mInvalidGeometryCallback; } SIP_SKIP
401 
408  QgsFeatureRequest &setFilterExpression( const QString &expression );
409 
415  QgsExpression *filterExpression() const { return mFilterExpression.get(); }
416 
423  QgsFeatureRequest &combineFilterExpression( const QString &expression );
424 
431  QgsExpressionContext *expressionContext() { return &mExpressionContext; }
432 
439  QgsFeatureRequest &setExpressionContext( const QgsExpressionContext &context );
440 
449  QgsFeatureRequest &disableFilter() { mFilter = FilterNone; mFilterExpression.reset(); return *this; }
450 
462  QgsFeatureRequest &addOrderBy( const QString &expression, bool ascending = true );
463 
473  QgsFeatureRequest &addOrderBy( const QString &expression, bool ascending, bool nullsfirst );
474 
480  OrderBy orderBy() const;
481 
487  QgsFeatureRequest &setOrderBy( const OrderBy &orderBy );
488 
495  QgsFeatureRequest &setLimit( long limit );
496 
502  long limit() const { return mLimit; }
503 
505  QgsFeatureRequest &setFlags( QgsFeatureRequest::Flags flags );
506  const Flags &flags() const { return mFlags; }
507 
515  QgsFeatureRequest &setSubsetOfAttributes( const QgsAttributeList &attrs );
516 
523  QgsFeatureRequest &setNoAttributes();
524 
529  QgsAttributeList subsetOfAttributes() const { return mAttrs; }
530 
532  QgsFeatureRequest &setSubsetOfAttributes( const QStringList &attrNames, const QgsFields &fields );
533 
535  QgsFeatureRequest &setSubsetOfAttributes( const QSet<QString> &attrNames, const QgsFields &fields );
536 
541  QgsFeatureRequest &setSimplifyMethod( const QgsSimplifyMethod &simplifyMethod );
542 
547  const QgsSimplifyMethod &simplifyMethod() const { return mSimplifyMethod; }
548 
557  QgsCoordinateReferenceSystem destinationCrs() const;
558 
566  QgsCoordinateTransformContext transformContext() const;
567 
591  QgsFeatureRequest &setDestinationCrs( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context );
592 
601 #ifndef SIP_RUN
602  QgsFeatureRequest &setTransformErrorCallback( const std::function< void( const QgsFeature & )> &callback );
603 #else
604  QgsFeatureRequest &setTransformErrorCallback( SIP_PYCALLABLE / AllowNone / );
605  % MethodCode
606  Py_BEGIN_ALLOW_THREADS
607 
608  sipCpp->setTransformErrorCallback( [a0]( const QgsFeature &arg )
609  {
610  SIP_BLOCK_THREADS
611  Py_XDECREF( sipCallMethod( NULL, a0, "D", &arg, sipType_QgsFeature, NULL ) );
612  SIP_UNBLOCK_THREADS
613  } );
614 
615  sipRes = sipCpp;
616 
617  Py_END_ALLOW_THREADS
618  % End
619 #endif
620 
629  std::function< void( const QgsFeature & ) > transformErrorCallback() const { return mTransformErrorCallback; } SIP_SKIP
630 
631 
641  bool acceptFeature( const QgsFeature &feature );
642 
652  Q_DECL_DEPRECATED int connectionTimeout() const SIP_DEPRECATED;
653 
663  Q_DECL_DEPRECATED QgsFeatureRequest &setConnectionTimeout( int connectionTimeout ) SIP_DEPRECATED;
664 
673  int timeout() const;
674 
683  QgsFeatureRequest &setTimeout( int timeout );
684 
697  bool requestMayBeNested() const;
698 
711  QgsFeatureRequest &setRequestMayBeNested( bool requestMayBeNested );
712 
713  protected:
714  FilterType mFilter = FilterNone;
715  QgsRectangle mFilterRect;
716  QgsFeatureId mFilterFid = -1;
717  QgsFeatureIds mFilterFids;
718  std::unique_ptr< QgsExpression > mFilterExpression;
719  QgsExpressionContext mExpressionContext;
720  Flags mFlags = Flags();
722  QgsSimplifyMethod mSimplifyMethod;
723  long mLimit = -1;
724  OrderBy mOrderBy;
725  InvalidGeometryCheck mInvalidGeometryFilter = GeometryNoCheck;
726  std::function< void( const QgsFeature & ) > mInvalidGeometryCallback;
727  std::function< void( const QgsFeature & ) > mTransformErrorCallback;
729  QgsCoordinateTransformContext mTransformContext;
730  int mTimeout = -1;
731  int mRequestMayBeNested = false;
732 };
733 
735 
736 
737 class QgsFeatureIterator;
739 
745 class CORE_EXPORT QgsAbstractFeatureSource
746 {
747  public:
748  virtual ~QgsAbstractFeatureSource();
749 
750 
751  // IMPORTANT -- do NOT remove the /TransferBack/ annotation here -- while it looks completely wrong, it's
752  // required for Python data providers to work correctly! Argh!
753 
760 
761  // IMPORTANT -- do NOT remove the /TransferBack/ annotation here -- while it looks completely wrong, it's
762  // required for Python data providers to work correctly! Argh!
763 
764  protected:
765  void iteratorOpened( QgsAbstractFeatureIterator *it );
766  void iteratorClosed( QgsAbstractFeatureIterator *it );
767 
768  QSet< QgsAbstractFeatureIterator * > mActiveIterators;
769 
770  template<typename> friend class QgsAbstractFeatureIteratorFromSource;
771 };
772 
773 #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