-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgsexpressionutils.cpp
69 lines (60 loc) · 2.46 KB
/
qgsexpressionutils.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/***************************************************************************
qgsexpressionutils.cpp
-------------------
begin : May 2017
copyright : (C) 2017 Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsexpressionutils.h"
#include "qgsexpressionnode.h"
#include "qgsvectorlayer.h"
///@cond PRIVATE
QgsExpressionUtils::TVL QgsExpressionUtils::AND[3][3] =
{
// false true unknown
{ False, False, False }, // false
{ False, True, Unknown }, // true
{ False, Unknown, Unknown } // unknown
};
QgsExpressionUtils::TVL QgsExpressionUtils::OR[3][3] =
{
{ False, True, Unknown }, // false
{ True, True, True }, // true
{ Unknown, True, Unknown } // unknown
};
QgsExpressionUtils::TVL QgsExpressionUtils::NOT[3] = { True, False, Unknown };
///@endcond
std::tuple<QVariant::Type, int> QgsExpressionUtils::determineResultType( const QString &expression, const QgsVectorLayer *layer, QgsFeatureRequest request, QgsExpressionContext context, bool *foundFeatures )
{
QgsExpression exp( expression );
request.setFlags( ( exp.needsGeometry() ) ?
QgsFeatureRequest::NoFlags :
QgsFeatureRequest::NoGeometry );
request.setLimit( 10 );
request.setExpressionContext( context );
QVariant value;
QgsFeature f;
QgsFeatureIterator it = layer->getFeatures( request );
bool hasFeature = it.nextFeature( f );
if ( foundFeatures )
*foundFeatures = hasFeature;
while ( hasFeature )
{
context.setFeature( f );
const QVariant value = exp.evaluate( &context );
if ( !value.isNull() )
{
return std::make_tuple( value.type(), value.userType() );
}
hasFeature = it.nextFeature( f );
}
value = QVariant();
return std::make_tuple( value.type(), value.userType() );
}