QGIS API Documentation  3.22.4-Białowieża (ce8e65e95e)
qgsexpressionutils.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsexpressionutils.cpp
3  -------------------
4  begin : May 2017
5  copyright : (C) 2017 Matthias Kuhn
6  email : [email protected]
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 
16 #include "qgsexpressionutils.h"
17 #include "qgsexpressionnode.h"
18 #include "qgsvectorlayer.h"
19 
21 
22 QgsExpressionUtils::TVL QgsExpressionUtils::AND[3][3] =
23 {
24  // false true unknown
25  { False, False, False }, // false
26  { False, True, Unknown }, // true
27  { False, Unknown, Unknown } // unknown
28 };
29 QgsExpressionUtils::TVL QgsExpressionUtils::OR[3][3] =
30 {
31  { False, True, Unknown }, // false
32  { True, True, True }, // true
33  { Unknown, True, Unknown } // unknown
34 };
35 
36 QgsExpressionUtils::TVL QgsExpressionUtils::NOT[3] = { True, False, Unknown };
37 
39 
40 std::tuple<QVariant::Type, int> QgsExpressionUtils::determineResultType( const QString &expression, const QgsVectorLayer *layer, QgsFeatureRequest request, QgsExpressionContext context, bool *foundFeatures )
41 {
42  QgsExpression exp( expression );
43  request.setFlags( ( exp.needsGeometry() ) ?
46  request.setLimit( 10 );
47  request.setExpressionContext( context );
48 
49  QVariant value;
50  QgsFeature f;
51  QgsFeatureIterator it = layer->getFeatures( request );
52  bool hasFeature = it.nextFeature( f );
53  if ( foundFeatures )
54  *foundFeatures = hasFeature;
55  while ( hasFeature )
56  {
57  context.setFeature( f );
58  const QVariant value = exp.evaluate( &context );
59  if ( !value.isNull() )
60  {
61  return std::make_tuple( value.type(), value.userType() );
62  }
63  hasFeature = it.nextFeature( f );
64  }
65  value = QVariant();
66  return std::make_tuple( value.type(), value.userType() );
67 }
68 
69 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
static std::tuple< QVariant::Type, int > determineResultType(const QString &expression, const QgsVectorLayer *layer, QgsFeatureRequest request=QgsFeatureRequest(), QgsExpressionContext context=QgsExpressionContext(), bool *foundFeatures=nullptr)
Returns a value type and user type for a given expression.
Class for parsing and evaluation of expressions (formerly called "search strings").
bool needsGeometry() const
Returns true if the expression uses feature geometry for some computation.
QVariant evaluate()
Evaluate the feature and return the result.
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).
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Represents a vector layer which manages a vector based data sets.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.