19 #include <QDomDocument> 56 #if QT_VERSION < 0x050000 57 #include <qtextdocument.h> 104 #define TVL_True QVariant(1) 105 #define TVL_False QVariant(0) 106 #define TVL_Unknown QVariant() 113 if ( v.
type() == QVariant::Int )
return true;
114 if ( v.
type() == QVariant::UInt )
return true;
115 if ( v.
type() == QVariant::LongLong )
return true;
116 if ( v.
type() == QVariant::ULongLong )
return true;
117 if ( v.
type() == QVariant::Double )
return false;
118 if ( v.
type() == QVariant::String ) {
bool ok; v.
toString().
toInt( &ok );
return ok; }
123 if ( v.
type() == QVariant::Double )
return true;
124 if ( v.
type() == QVariant::Int )
return true;
125 if ( v.
type() == QVariant::UInt )
return true;
126 if ( v.
type() == QVariant::LongLong )
return true;
127 if ( v.
type() == QVariant::ULongLong )
return true;
128 if ( v.
type() == QVariant::String )
132 ok = ok && qIsFinite( val ) && !qIsNaN( val );
140 return v.
type() == QVariant::DateTime || v.
type() == QVariant::Date ||
141 v.
type() == QVariant::Time;
151 if ( v.
type() == QVariant::String )
163 #define ENSURE_NO_EVAL_ERROR { if (parent->hasEvalError()) return QVariant(); } 164 #define SET_EVAL_ERROR(x) { parent->setEvalErrorString(x); return QVariant(); } 173 "=",
"<>",
"<=",
">=",
"<",
">",
"~",
"LIKE",
"NOT LIKE",
"ILIKE",
"NOT ILIKE",
"IS",
"IS NOT",
174 "+",
"-",
"*",
"/",
"//",
"%",
"^",
197 if ( !ok || qIsNaN( x ) || !qIsFinite( x ) )
274 if ( inter.isValid() )
303 #define FEAT_FROM_CONTEXT(c, f) if (!c || !c->hasVariable(QgsExpressionContext::EXPR_FEATURE)) return QVariant(); \ 304 QgsFeature f = qvariant_cast<QgsFeature>( c->variable( QgsExpressionContext::EXPR_FEATURE ) ); 353 if ( value.
type() == QVariant::Int )
384 return expression.evaluate( context );
402 return ( deg *
M_PI ) / 180;
407 return ( 180 * rad ) /
M_PI;
468 if ( x <= 0 || b <= 0 )
470 return QVariant( log( x ) / log( b ) );
480 double f =
static_cast< double >( qrand() ) / RAND_MAX;
481 return QVariant( min + f * ( max - min ) );
491 return QVariant( min + ( qrand() % static_cast< int >( max - min + 1 ) ) );
502 if ( domainMin >= domainMax )
509 if ( val >= domainMax )
513 else if ( val <= domainMin )
519 double m = ( rangeMax - rangeMin ) / ( domainMax - domainMin );
520 double c = rangeMin - ( domainMin * m );
535 if ( domainMin >= domainMax )
547 if ( val >= domainMax )
551 else if ( val <= domainMin )
557 return QVariant((( rangeMax - rangeMin ) / pow( domainMax - domainMin, exponent ) ) * pow( val - domainMin, exponent ) + rangeMin );
566 for (
int i = 1; i < values.length(); ++i )
569 if ( testVal > maxVal )
584 for (
int i = 1; i < values.length(); ++i )
587 if ( testVal < minVal )
613 node =
getNode( values.at( 1 ), parent );
615 value = node->
eval( parent, context );
626 node =
getNode( values.at( 2 ), parent );
632 if ( values.count() > 3 )
634 node =
getNode( values.at( 3 ), parent );
642 if ( values.count() > 4 )
644 node =
getNode( values.at( 4 ), parent );
646 value = node->
eval( parent, context );
659 result = vl->
aggregate( aggregate, subExpression, parameters, &subContext, &ok );
663 result = vl->
aggregate( aggregate, subExpression, parameters,
nullptr, &ok );
708 if ( relations.
isEmpty() || relations.
at( 0 ).referencedLayer() != vl )
715 relation = relations.
at( 0 );
722 node =
getNode( values.at( 1 ), parent );
724 value = node->
eval( parent, context );
735 node =
getNode( values.at( 2 ), parent );
741 if ( values.count() > 3 )
743 node =
getNode( values.at( 3 ), parent );
745 value = node->
eval( parent, context );
765 result = childLayer->
aggregate( aggregate, subExpression, parameters, &subContext, &ok );
806 if ( values.count() > 1 )
808 node =
getNode( values.at( 1 ), parent );
812 groupBy = node->
dump();
816 if ( values.count() > 2 )
818 node =
getNode( values.at( 2 ), parent );
849 result = vl->
aggregate( aggregate, subExpression, parameters, &subContext, &ok );
954 if ( values.count() > 3 )
973 if ( testValue <= minValue )
977 else if ( testValue >= maxValue )
1019 Q_FOREACH (
const QVariant &value, values )
1041 for (
int i = 0; i < elems.size(); i++ )
1043 if ( elems[i].size() > 1 )
1044 elems[i] = elems[i].at( 0 ).toUpper() + elems[i].
mid( 1 ).toLower();
1046 return QVariant( elems.join(
" " ) );
1091 if ( values.length() == 2 || values.length() == 3 )
1096 if ( !str.
isEmpty() && wrap != 0 )
1100 if ( values.length() == 3 ) delimiterstr =
getStringValue( values.at( 2 ), parent );
1101 if ( delimiterstr.
isEmpty() ) delimiterstr =
' ';
1102 int delimiterlength = delimiterstr.
length();
1105 int strlength, strcurrent, strhit, lasthit;
1107 for (
int i = 0; i < lines.
size(); i++ )
1109 strlength = lines[i].
length();
1114 while ( strcurrent < strlength )
1121 strhit = lines[i].
lastIndexOf( delimiterstr, strcurrent + wrap );
1122 if ( strhit == lasthit || strhit == -1 )
1125 strhit = lines[i].
indexOf( delimiterstr, strcurrent + qAbs( wrap ) );
1131 strhit = lines[i].
indexOf( delimiterstr, strcurrent + qAbs( wrap ) );
1135 newstr.
append( lines[i].midRef( strcurrent, strhit - strcurrent ) );
1137 strcurrent = strhit + delimiterlength;
1141 newstr.
append( lines[i].midRef( strcurrent ) );
1142 strcurrent = strlength;
1145 if ( i < lines.
size() - 1 ) newstr.
append(
'\n' );
1187 if ( !re.isValid() )
1201 if ( !re.isValid() )
1215 if ( !re.isValid() )
1222 ( void )re.indexIn( str );
1223 if ( re.captureCount() > 0 )
1226 return QVariant( re.capturedTexts().at( 1 ) );
1249 if ( context && context->
hasVariable(
"row_number" ) )
1250 return context->
variable(
"row_number" );
1260 if ( context && context->
hasVariable(
"map_id" ) )
1261 return context->
variable(
"map_id" );
1270 if ( context && context->
hasVariable(
"layout_numpages" ) )
1271 return context->
variable(
"layout_numpages" );
1280 if ( context && context->
hasVariable(
"layout_page" ) )
1281 return context->
variable(
"layout_page" );
1290 if ( context && context->
hasVariable(
"atlas_featurenumber" ) )
1291 return context->
variable(
"atlas_featurenumber" );
1300 if ( context && context->
hasVariable(
"atlas_featureid" ) )
1301 return context->
variable(
"atlas_featureid" );
1311 if ( context && context->
hasVariable(
"atlas_feature" ) )
1312 return context->
variable(
"atlas_feature" );
1321 if ( context && context->
hasVariable(
"atlas_geometry" ) )
1322 return context->
variable(
"atlas_geometry" );
1331 if ( context && context->
hasVariable(
"atlas_totalfeatures" ) )
1332 return context->
variable(
"atlas_totalfeatures" );
1343 return QVariant( static_cast< int >( f.id() ) );
1363 Q_FOREACH (
const QVariant &value, values )
1380 return string.right( pos );
1387 return string.left( pos );
1393 int length =
getIntValue( values.at( 1 ), parent );
1401 int length =
getIntValue( values.at( 1 ), parent );
1409 for (
int n = 1; n < values.length(); n++ )
1441 int seconds = d2.
secsTo( d1 );
1447 if ( !values.at( 0 ).canConvert<
QDate>() )
1565 #define ENSURE_GEOM_TYPE(f, g, geomtype) const QgsGeometry* g = f.constGeometry(); \ 1566 if (!g || g->type() != geomtype) return QVariant(); 1572 if ( g->isMultipart() )
1574 return g->asMultiPoint().at( 0 ).x();
1578 return g->asPoint().x();
1586 if ( g->isMultipart() )
1588 return g->asMultiPoint().at( 0 ).y();
1592 return g->asPoint().y();
1676 int idx =
getIntValue( values.at( 1 ), parent ) - 1;
1730 bool ignoreClosing =
false;
1731 if ( values.length() > 1 )
1733 ignoreClosing =
getIntValue( values.at( 1 ), parent );
1742 bool skipLast =
false;
1743 if ( ignoreClosing && ring.
count() > 2 && ring.
first() == ring.
last() )
1748 for (
int i = 0; i < ( skipLast ? ring.
count() - 1 : ring.
count() ); ++ i )
1750 mp->addGeometry( ring.
at( i ).clone() );
1771 for (
int i = 0; i < line->
numPoints() - 1; ++i )
1776 << line->
pointN( i + 1 ) );
1777 ml->addGeometry( segment );
1793 if ( !curvePolygon )
1797 int idx =
getIntValue( values.at( 1 ), parent ) - 1;
1819 int idx =
getIntValue( values.at( 1 ), parent ) - 1;
1859 if ( values.count() < 2 || values.count() > 4 )
1867 double z = values.count() >= 3 ?
getDoubleValue( values.at( 2 ), parent ) : 0.0;
1868 double m = values.count() >= 4 ?
getDoubleValue( values.at( 3 ), parent ) : 0.0;
1869 switch ( values.count() )
1891 if ( values.count() < 2 )
1897 lineString->
clear();
1899 Q_FOREACH (
const QVariant& value, values )
1920 if ( values.count() < 1 )
1933 for (
int i = 1; i < values.count(); ++i )
1953 if ( !g || g->isEmpty() )
1958 idx += g->geometry()->nCoordinates();
1960 if ( idx < 0 || idx >= g->geometry()->nCoordinates() )
1973 if ( v.
type() == QVariant::PointF )
1981 if ( v.
type() == QVariant::PointF )
2019 double area = calc->
measureArea( f.constGeometry() );
2025 return QVariant( f.constGeometry()->area() );
2052 return QVariant( f.constGeometry()->length() );
2069 return f.constGeometry()->isEmpty() ?
QVariant( 0 ) :
QVariant( f.constGeometry()->geometry()->perimeter() );
2114 for (
int i = 0; i < collection->numGeometries(); ++i )
2117 if ( !curvePolygon )
2138 bool foundPoly =
false;
2147 if ( !curvePolygon )
2221 if ( values.length() < 2 || values.length() > 3 )
2227 if ( fGeom.
isEmpty() || sGeom.isEmpty() )
2232 if ( values.length() == 2 )
2235 QString result = engine->relate( *sGeom.geometry() );
2242 bool result = engine->relatePattern( *sGeom.geometry(), pattern );
2297 if ( values.length() < 2 || values.length() > 3 )
2303 if ( values.length() == 3 )
2418 if ( values.length() < 1 || values.length() > 2 )
2423 if ( values.length() == 2 )
2431 if ( values.length() != 2 )
2450 if ( pt1->x() == pt2->
x() )
2452 if ( pt1->y() < pt2->
y() )
2454 else if ( pt1->y() > pt2->
y() )
2460 if ( pt1->y() == pt2->
y() )
2462 if ( pt1->x() < pt2->
x() )
2464 else if ( pt1->x() > pt2->
x() )
2470 if ( pt1->x() < pt2->
x() )
2472 if ( pt1->y() < pt2->
y() )
2474 return atan( fabs( pt1->x() - pt2->
x() ) / fabs( pt1->y() - pt2->
y() ) );
2478 return atan( fabs( pt1->y() - pt2->
y() ) / fabs( pt1->x() - pt2->
x() ) )
2485 if ( pt1->y() > pt2->
y() )
2487 return atan( fabs( pt1->x() - pt2->
x() ) / fabs( pt1->y() - pt2->
y() ) )
2492 return atan( fabs( pt1->y() - pt2->
y() ) / fabs( pt1->x() - pt2->
x() ) )
2519 if ( values.length() != 3 )
2534 if ( values.length() < 2 )
2540 return values.at( 0 );
2543 bool asc = values.value( 2 ).toBool();
2561 Q_ASSERT( collection );
2565 QgsExpressionSorter sorter( orderBy );
2568 for (
int i = 0; i < collection->
partCount(); ++i )
2574 sorter.sortFeatures( partFeatures, unconstedContext );
2578 Q_ASSERT( orderedGeom );
2583 Q_FOREACH (
const QgsFeature& feature, partFeatures )
2591 delete unconstedContext;
2641 int vertex =
getIntValue( values.at( 1 ), parent );
2649 int vertex =
getIntValue( values.at( 1 ), parent );
2661 return distance >= 0 ? distance :
QVariant();
2666 if ( values.length() == 2 )
2669 double scaler = pow( 10.0,
getIntValue( values.at( 1 ), parent ) );
2670 return QVariant( qRound( number * scaler ) / scaler );
2673 if ( values.length() == 1 )
2675 double number =
getIntValue( values.at( 0 ), parent );
2697 int places =
getIntValue( values.at( 1 ), parent );
2703 return QString(
"%L1" ).
arg( value, 0,
'f', places );
2716 int green =
getIntValue( values.at( 1 ), parent );
2719 if ( ! color.isValid() )
2722 color =
QColor( 0, 0, 0 );
2725 return QString(
"%1,%2,%3" ).
arg( color.red() ).arg( color.green() ).arg( color.blue() );
2736 node =
getNode( values.at( 1 ), parent );
2738 value = node->
eval( parent, context );
2743 node =
getNode( values.at( 2 ), parent );
2745 value = node->
eval( parent, context );
2754 int green =
getIntValue( values.at( 1 ), parent );
2756 int alpha =
getIntValue( values.at( 3 ), parent );
2758 if ( ! color.isValid() )
2761 color =
QColor( 0, 0, 0 );
2776 QColor color = mRamp->color( value );
2783 double hue =
getIntValue( values.at( 0 ), parent ) / 360.0;
2785 double saturation =
getIntValue( values.at( 1 ), parent ) / 100.0;
2787 double lightness =
getIntValue( values.at( 2 ), parent ) / 100.0;
2791 if ( ! color.isValid() )
2794 color =
QColor( 0, 0, 0 );
2797 return QString(
"%1,%2,%3" ).
arg( color.red() ).arg( color.green() ).arg( color.blue() );
2803 double hue =
getIntValue( values.at( 0 ), parent ) / 360.0;
2805 double saturation =
getIntValue( values.at( 1 ), parent ) / 100.0;
2807 double lightness =
getIntValue( values.at( 2 ), parent ) / 100.0;
2809 double alpha =
getIntValue( values.at( 3 ), parent ) / 255.0;
2812 if ( ! color.isValid() )
2814 parent->
setEvalErrorString(
QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( hue ).arg( saturation ).arg( lightness ).arg( alpha ) );
2815 color =
QColor( 0, 0, 0 );
2823 double hue =
getIntValue( values.at( 0 ), parent ) / 360.0;
2825 double saturation =
getIntValue( values.at( 1 ), parent ) / 100.0;
2827 double value =
getIntValue( values.at( 2 ), parent ) / 100.0;
2831 if ( ! color.isValid() )
2834 color =
QColor( 0, 0, 0 );
2837 return QString(
"%1,%2,%3" ).
arg( color.red() ).arg( color.green() ).arg( color.blue() );
2843 double hue =
getIntValue( values.at( 0 ), parent ) / 360.0;
2845 double saturation =
getIntValue( values.at( 1 ), parent ) / 100.0;
2847 double value =
getIntValue( values.at( 2 ), parent ) / 100.0;
2849 double alpha =
getIntValue( values.at( 3 ), parent ) / 255.0;
2852 if ( ! color.isValid() )
2854 parent->
setEvalErrorString(
QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( hue ).arg( saturation ).arg( value ).arg( alpha ) );
2855 color =
QColor( 0, 0, 0 );
2863 double cyan =
getIntValue( values.at( 0 ), parent ) / 100.0;
2865 double magenta =
getIntValue( values.at( 1 ), parent ) / 100.0;
2867 double yellow =
getIntValue( values.at( 2 ), parent ) / 100.0;
2869 double black =
getIntValue( values.at( 3 ), parent ) / 100.0;
2873 if ( ! color.isValid() )
2876 color =
QColor( 0, 0, 0 );
2879 return QString(
"%1,%2,%3" ).
arg( color.red() ).arg( color.green() ).arg( color.blue() );
2885 double cyan =
getIntValue( values.at( 0 ), parent ) / 100.0;
2887 double magenta =
getIntValue( values.at( 1 ), parent ) / 100.0;
2889 double yellow =
getIntValue( values.at( 2 ), parent ) / 100.0;
2891 double black =
getIntValue( values.at( 3 ), parent ) / 100.0;
2893 double alpha =
getIntValue( values.at( 4 ), parent ) / 255.0;
2896 if ( ! color.isValid() )
2898 parent->
setEvalErrorString(
QObject::tr(
"Cannot convert '%1:%2:%3:%4:%5' to color" ).arg( cyan ).arg( magenta ).arg( yellow ).arg( black ).arg( alpha ) );
2899 color =
QColor( 0, 0, 0 );
2917 return color.
green();
2919 return color.
blue();
2921 return color.
alpha();
2927 return color.
valueF() * 100;
2935 return color.
cyanF() * 100;
2941 return color.
blackF() * 100;
2957 int value =
getIntValue( values.at( 2 ), parent );
3046 if ( ! s.isValid() )
3080 if ( attributeId == -1 )
3085 const QVariant& attVal = values.at( 2 );
3112 if ( !layersByName.
isEmpty() )
3114 layer = layersByName.
at( 0 );
3123 return layer->name();
3127 return layer->title();
3129 return layer->abstract();
3131 return layer->keywordList();
3133 return layer->dataUrl();
3135 return layer->attribution();
3137 return layer->attributionUrl();
3139 return layer->publicSource();
3141 return layer->minimumScale();
3143 return layer->maximumScale();
3145 return layer->crs().authid();
3147 return layer->crs().toProj4();
3157 switch ( layer->type() )
3193 if ( transferOwnership )
3227 <<
"abs" <<
"sqrt" <<
"cos" <<
"sin" <<
"tan" 3228 <<
"asin" <<
"acos" <<
"atan" <<
"atan2" 3229 <<
"exp" <<
"ln" <<
"log10" <<
"log" 3230 <<
"round" <<
"rand" <<
"randf" <<
"max" <<
"min" <<
"clamp" 3231 <<
"scale_linear" <<
"scale_exp" <<
"floor" <<
"ceil" <<
"$pi" 3232 <<
"toint" <<
"to_int" <<
"toreal" <<
"to_real" <<
"tostring" <<
"to_string" 3233 <<
"todatetime" <<
"to_datetime" <<
"todate" <<
"to_date" 3234 <<
"totime" <<
"to_time" <<
"tointerval" <<
"to_interval" 3235 <<
"coalesce" <<
"if" <<
"regexp_match" <<
"age" <<
"year" 3236 <<
"month" <<
"week" <<
"day" <<
"hour" <<
"day_of_week" 3237 <<
"minute" <<
"second" <<
"lower" <<
"upper" 3238 <<
"title" <<
"length" <<
"replace" <<
"trim" <<
"wordwrap" 3239 <<
"regexp_replace" <<
"regexp_substr" 3240 <<
"substr" <<
"concat" <<
"strpos" <<
"left" 3241 <<
"right" <<
"rpad" <<
"lpad" <<
"format" 3242 <<
"format_number" <<
"format_date" 3243 <<
"color_rgb" <<
"color_rgba" <<
"ramp_color" 3244 <<
"color_hsl" <<
"color_hsla" <<
"color_hsv" <<
"color_hsva" 3245 <<
"color_cmyk" <<
"color_cmyka" <<
"color_part" <<
"set_color_part" 3246 <<
"xat" <<
"yat" <<
"$area" <<
"area" <<
"perimeter" 3247 <<
"$length" <<
"$perimeter" <<
"x" <<
"y" <<
"$x" <<
"$y" <<
"z" <<
"m" <<
"num_points" 3248 <<
"num_interior_rings" <<
"num_rings" <<
"num_geometries" 3249 <<
"geometry_n" <<
"interior_ring_n" 3250 <<
"point_n" <<
"start_point" <<
"end_point" <<
"make_point" <<
"make_point_m" 3251 <<
"nodes_to_points" <<
"segments_to_lines" 3252 <<
"make_line" <<
"make_polygon" 3253 <<
"$x_at" <<
"x_at" <<
"xat" <<
"$y_at" <<
"y_at" <<
"yat" <<
"x_min" <<
"xmin" <<
"x_max" <<
"xmax" 3254 <<
"y_min" <<
"ymin" <<
"y_max" <<
"ymax" <<
"geom_from_wkt" <<
"geomFromWKT" 3255 <<
"geom_from_gml" <<
"geomFromGML" <<
"intersects_bbox" <<
"bbox" 3256 <<
"disjoint" <<
"intersects" <<
"touches" <<
"crosses" <<
"contains" 3258 <<
"overlaps" <<
"within" <<
"buffer" <<
"centroid" <<
"bounds" <<
"reverse" <<
"exterior_ring" 3259 <<
"boundary" <<
"line_merge" 3260 <<
"bounds_width" <<
"bounds_height" <<
"is_closed" <<
"convex_hull" <<
"difference" 3261 <<
"distance" <<
"intersection" <<
"sym_difference" <<
"combine" 3262 <<
"extrude" <<
"azimuth" <<
"project" <<
"closest_point" <<
"shortest_line" 3263 <<
"line_locate_point" <<
"line_interpolate_point" 3264 <<
"line_interpolate_angle" <<
"angle_at_vertex" <<
"distance_to_vertex" 3265 <<
"union" <<
"geom_to_wkt" <<
"geomToWKT" <<
"geometry" 3266 <<
"transform" <<
"get_feature" <<
"getFeature" 3267 <<
"levenshtein" <<
"longest_common_substring" <<
"hamming_distance" 3269 <<
"aggregate" <<
"relation_aggregate" <<
"count" <<
"count_distinct" 3270 <<
"count_missing" <<
"minimum" <<
"maximum" <<
"sum" <<
"mean" 3271 <<
"median" <<
"stdev" <<
"range" <<
"minority" <<
"majority" 3272 <<
"q1" <<
"q3" <<
"iqr" <<
"min_length" <<
"max_length" <<
"concatenate" 3273 <<
"attribute" <<
"var" <<
"layer_property" 3274 <<
"$id" <<
"$scale" <<
"_specialcol_";
3288 static QMutex sFunctionsMutex( QMutex::Recursive );
3573 return isValid( text, &context, errorMessage );
3598 if ( !
d->mExp.isNull() )
3643 case QVariant::LongLong:
3644 case QVariant::Double:
3647 case QVariant::Bool:
3648 return value.
toBool() ?
"TRUE" :
"FALSE";
3651 case QVariant::String:
3665 for (
int i = 0; i < count; i++ )
3685 :
d( new QgsExpressionPrivate )
3689 Q_ASSERT( !
d->mParserErrorString.isNull() ||
d->mRootNode );
3700 if ( !
d->ref.deref() )
3711 :
d( new QgsExpressionPrivate )
3718 if ( !
d->ref.deref() )
3724 if (
d == other.
d ||
d->mExp == other.
d->mExp )
3731 return d->mRootNode;
3740 if ( !
d->mRootNode )
3743 QStringList columns =
d->mRootNode->referencedColumns();
3746 for (
int i = 0; i < columns.
count(); i++ )
3749 for (
int j = i + 1; j < columns.
count(); j++ )
3764 if ( !
d->mRootNode )
3766 return d->mRootNode->needsGeometry();
3771 if (
d->mCalc.data() )
3776 d->mCalc->setEllipsoidalMode(
false );
3785 ( void )
d->ref.deref();
3787 d =
new QgsExpressionPrivate( *
d );
3807 if ( !
d->mRootNode )
3815 if ( !
d->mRootNode )
3817 d->mEvalErrorString = tr(
"No root node! Parsing failed?" );
3821 return d->mRootNode->prepare(
this, context );
3827 if ( !
d->mRootNode )
3829 d->mEvalErrorString = tr(
"No root node! Parsing failed?" );
3834 return d->mRootNode->eval(
this, &context );
3848 bool res =
prepare( &context );
3866 if ( !
d->mRootNode )
3868 d->mEvalErrorString = tr(
"No root node! Parsing failed?" );
3872 return d->mRootNode->eval(
this, static_cast<const QgsExpressionContext*>(
nullptr ) );
3878 if ( !
d->mRootNode )
3880 d->mEvalErrorString = tr(
"No root node! Parsing failed?" );
3884 return d->mRootNode->eval(
this, context );
3889 return !
d->mEvalErrorString.isNull();
3894 return d->mEvalErrorString;
3899 d->mEvalErrorString = str;
3904 d->mRowNumber = rowNumber;
3911 if ( !
d->mRootNode )
3914 return d->mRootNode->dump();
3919 return d->mCalc.data();
3924 return d->mDistanceUnit;
3929 d->mDistanceUnit = unit;
3934 return d->mAreaUnit;
3939 d->mAreaUnit = unit;
3945 d->mRootNode->accept( v );
3961 if ( substitutionMap )
3968 if ( !oldValue.isNull() )
3969 savedValues.
insert( sit.key(), oldValue );
3978 while ( index < action.
size() )
3982 int pos = rx.
indexIn( action, index );
3995 expr_action += action.
midRef( start, index - start );
4010 expr_action += action.
midRef( start, index - start );
4015 expr_action += action.
mid( start, pos - start ) + result.
toString();
4018 expr_action += action.
midRef( index );
4035 double convertedValue = text.
toDouble( &ok );
4038 return convertedValue;
4049 convertedValue = result.
toDouble( &ok );
4052 return fallbackValue;
4054 return convertedValue;
4064 Q_FOREACH (
Node* node, mList )
4077 Q_FOREACH (
Node* n, mList )
4079 if ( !first ) msg +=
", ";
4091 QVariant val = mOperand->eval( parent, context );
4111 Q_ASSERT( 0 &&
"unknown unary operation" );
4118 return mOperand->prepare( parent, context );
4135 QVariant vL = mOpLeft->eval( parent, context );
4137 QVariant vR = mOpRight->eval( parent, context );
4143 if ( vL.
type() == QVariant::String && vR.
type() == QVariant::String )
4168 if ( mOp ==
boMod && iR == 0 )