@@ -4708,7 +4708,7 @@ QString QgsExpression::NodeList::dump() const
4708
4708
4709
4709
//
4710
4710
4711
- QVariant QgsExpression::NodeUnaryOperator::eval ( QgsExpression *parent, const QgsExpressionContext *context )
4711
+ QVariant QgsExpression::NodeUnaryOperator::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
4712
4712
{
4713
4713
QVariant val = mOperand ->eval ( parent, context );
4714
4714
ENSURE_NO_EVAL_ERROR;
@@ -4735,7 +4735,7 @@ QVariant QgsExpression::NodeUnaryOperator::eval( QgsExpression *parent, const Qg
4735
4735
return QVariant ();
4736
4736
}
4737
4737
4738
- bool QgsExpression::NodeUnaryOperator::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
4738
+ bool QgsExpression::NodeUnaryOperator::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
4739
4739
{
4740
4740
return mOperand ->prepare ( parent, context );
4741
4741
}
@@ -4760,9 +4760,14 @@ QgsExpression::Node *QgsExpression::NodeUnaryOperator::clone() const
4760
4760
return new NodeUnaryOperator ( mOp , mOperand ->clone () );
4761
4761
}
4762
4762
4763
+ bool QgsExpression::NodeUnaryOperator::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
4764
+ {
4765
+ return mOperand ->isStatic ( parent, context );
4766
+ }
4767
+
4763
4768
//
4764
4769
4765
- QVariant QgsExpression::NodeBinaryOperator::eval ( QgsExpression *parent, const QgsExpressionContext *context )
4770
+ QVariant QgsExpression::NodeBinaryOperator::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
4766
4771
{
4767
4772
QVariant vL = mOpLeft ->eval ( parent, context );
4768
4773
ENSURE_NO_EVAL_ERROR;
@@ -4945,13 +4950,13 @@ QVariant QgsExpression::NodeBinaryOperator::eval( QgsExpression *parent, const Q
4945
4950
QgsExpression::NodeLiteral nL ( lL.at ( i ) );
4946
4951
QgsExpression::NodeLiteral nR ( lR.at ( i ) );
4947
4952
QgsExpression::NodeBinaryOperator eqNode ( boEQ, nL.clone (), nR.clone () );
4948
- QVariant eq = eqNode.eval ( parent, context );
4953
+ QVariant eq = eqNode.evalNode ( parent, context );
4949
4954
ENSURE_NO_EVAL_ERROR;
4950
4955
if ( eq == TVL_False )
4951
4956
{
4952
4957
// return the two items comparison
4953
4958
QgsExpression::NodeBinaryOperator node ( mOp , nL.clone (), nR.clone () );
4954
- QVariant v = node.eval ( parent, context );
4959
+ QVariant v = node.evalNode ( parent, context );
4955
4960
ENSURE_NO_EVAL_ERROR;
4956
4961
return v;
4957
4962
}
@@ -5186,7 +5191,7 @@ double QgsExpression::NodeBinaryOperator::computeDouble( double x, double y )
5186
5191
}
5187
5192
}
5188
5193
5189
- bool QgsExpression::NodeBinaryOperator::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
5194
+ bool QgsExpression::NodeBinaryOperator::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
5190
5195
{
5191
5196
bool resL = mOpLeft ->prepare ( parent, context );
5192
5197
bool resR = mOpRight ->prepare ( parent, context );
@@ -5326,9 +5331,14 @@ QgsExpression::Node *QgsExpression::NodeBinaryOperator::clone() const
5326
5331
return new NodeBinaryOperator ( mOp , mOpLeft ->clone (), mOpRight ->clone () );
5327
5332
}
5328
5333
5334
+ bool QgsExpression::NodeBinaryOperator::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
5335
+ {
5336
+ return mOpLeft ->isStatic ( parent, context ) && mOpRight ->isStatic ( parent, context );
5337
+ }
5338
+
5329
5339
//
5330
5340
5331
- QVariant QgsExpression::NodeInOperator::eval ( QgsExpression *parent, const QgsExpressionContext *context )
5341
+ QVariant QgsExpression::NodeInOperator::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
5332
5342
{
5333
5343
if ( mList ->count () == 0 )
5334
5344
return mNotIn ? TVL_True : TVL_False;
@@ -5378,7 +5388,7 @@ QVariant QgsExpression::NodeInOperator::eval( QgsExpression *parent, const QgsEx
5378
5388
return mNotIn ? TVL_True : TVL_False;
5379
5389
}
5380
5390
5381
- bool QgsExpression::NodeInOperator::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
5391
+ bool QgsExpression::NodeInOperator::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
5382
5392
{
5383
5393
bool res = mNode ->prepare ( parent, context );
5384
5394
Q_FOREACH ( Node *n, mList ->list () )
@@ -5398,9 +5408,23 @@ QgsExpression::Node *QgsExpression::NodeInOperator::clone() const
5398
5408
return new NodeInOperator ( mNode ->clone (), mList ->clone (), mNotIn );
5399
5409
}
5400
5410
5411
+ bool QgsExpression::NodeInOperator::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
5412
+ {
5413
+ if ( !mNode ->isStatic ( parent, context ) )
5414
+ return false ;
5415
+
5416
+ Q_FOREACH ( Node *n, mList ->list () )
5417
+ {
5418
+ if ( !n->isStatic ( parent, context ) )
5419
+ return false ;
5420
+ }
5421
+
5422
+ return true ;
5423
+ }
5424
+
5401
5425
//
5402
5426
5403
- QVariant QgsExpression::NodeFunction::eval ( QgsExpression *parent, const QgsExpressionContext *context )
5427
+ QVariant QgsExpression::NodeFunction::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
5404
5428
{
5405
5429
QString name = Functions ()[mFnIndex ]->name ();
5406
5430
Function *fd = context && context->hasFunction ( name ) ? context->function ( name ) : Functions ()[mFnIndex ];
@@ -5476,7 +5500,7 @@ QgsExpression::NodeFunction::NodeFunction( int fnIndex, QgsExpression::NodeList
5476
5500
}
5477
5501
}
5478
5502
5479
- bool QgsExpression::NodeFunction::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
5503
+ bool QgsExpression::NodeFunction::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
5480
5504
{
5481
5505
Function *fd = Functions ()[mFnIndex ];
5482
5506
@@ -5564,6 +5588,14 @@ QgsExpression::Node *QgsExpression::NodeFunction::clone() const
5564
5588
return new NodeFunction ( mFnIndex , mArgs ? mArgs ->clone () : nullptr );
5565
5589
}
5566
5590
5591
+ bool QgsExpression::NodeFunction::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
5592
+ {
5593
+ Q_UNUSED ( parent )
5594
+ Q_UNUSED ( context )
5595
+ // TODO some functions are static!
5596
+ return false ;
5597
+ }
5598
+
5567
5599
bool QgsExpression::NodeFunction::validateParams ( int fnIndex, QgsExpression::NodeList *args, QString &error )
5568
5600
{
5569
5601
if ( !args || !args->hasNamedNodes () )
@@ -5639,14 +5671,14 @@ bool QgsExpression::NodeFunction::validateParams( int fnIndex, QgsExpression::No
5639
5671
5640
5672
//
5641
5673
5642
- QVariant QgsExpression::NodeLiteral::eval ( QgsExpression *parent, const QgsExpressionContext *context )
5674
+ QVariant QgsExpression::NodeLiteral::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
5643
5675
{
5644
5676
Q_UNUSED ( context );
5645
5677
Q_UNUSED ( parent );
5646
5678
return mValue ;
5647
5679
}
5648
5680
5649
- bool QgsExpression::NodeLiteral::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
5681
+ bool QgsExpression::NodeLiteral::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
5650
5682
{
5651
5683
Q_UNUSED ( parent );
5652
5684
Q_UNUSED ( context );
@@ -5689,9 +5721,16 @@ QgsExpression::Node *QgsExpression::NodeLiteral::clone() const
5689
5721
return new NodeLiteral ( mValue );
5690
5722
}
5691
5723
5724
+ bool QgsExpression::NodeLiteral::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
5725
+ {
5726
+ Q_UNUSED ( context )
5727
+ Q_UNUSED ( parent )
5728
+ return true ;
5729
+ }
5730
+
5692
5731
//
5693
5732
5694
- QVariant QgsExpression::NodeColumnRef::eval ( QgsExpression *parent, const QgsExpressionContext *context )
5733
+ QVariant QgsExpression::NodeColumnRef::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
5695
5734
{
5696
5735
Q_UNUSED ( parent );
5697
5736
int index = mIndex ;
@@ -5717,7 +5756,7 @@ QVariant QgsExpression::NodeColumnRef::eval( QgsExpression *parent, const QgsExp
5717
5756
return QVariant ( ' [' + mName + ' ]' );
5718
5757
}
5719
5758
5720
- bool QgsExpression::NodeColumnRef::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
5759
+ bool QgsExpression::NodeColumnRef::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
5721
5760
{
5722
5761
if ( !context || !context->hasVariable ( QgsExpressionContext::EXPR_FIELDS ) )
5723
5762
return false ;
@@ -5739,7 +5778,7 @@ bool QgsExpression::NodeColumnRef::prepare( QgsExpression *parent, const QgsExpr
5739
5778
5740
5779
QString QgsExpression::NodeColumnRef::dump () const
5741
5780
{
5742
- return QRegExp ( " ^[A-Za-z_ \x80 - \xff ][A-Za-z0-9_ \x80 - \xff ]*$ " ). exactMatch ( mName ) ? mName : quotedColumnRef ( mName );
5781
+ return quotedColumnRef ( mName );
5743
5782
}
5744
5783
5745
5784
QSet<QString> QgsExpression::NodeColumnRef::referencedColumns () const
@@ -5757,9 +5796,16 @@ QgsExpression::Node *QgsExpression::NodeColumnRef::clone() const
5757
5796
return new NodeColumnRef ( mName );
5758
5797
}
5759
5798
5799
+ bool QgsExpression::NodeColumnRef::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
5800
+ {
5801
+ Q_UNUSED ( context )
5802
+ Q_UNUSED ( parent )
5803
+ return false ;
5804
+ }
5805
+
5760
5806
//
5761
5807
5762
- QVariant QgsExpression::NodeCondition::eval ( QgsExpression *parent, const QgsExpressionContext *context )
5808
+ QVariant QgsExpression::NodeCondition::evalNode ( QgsExpression *parent, const QgsExpressionContext *context )
5763
5809
{
5764
5810
Q_FOREACH ( WhenThen *cond, mConditions )
5765
5811
{
@@ -5785,7 +5831,7 @@ QVariant QgsExpression::NodeCondition::eval( QgsExpression *parent, const QgsExp
5785
5831
return QVariant ();
5786
5832
}
5787
5833
5788
- bool QgsExpression::NodeCondition::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
5834
+ bool QgsExpression::NodeCondition::prepareNode ( QgsExpression *parent, const QgsExpressionContext *context )
5789
5835
{
5790
5836
bool res;
5791
5837
Q_FOREACH ( WhenThen *cond, mConditions )
@@ -5865,6 +5911,17 @@ QgsExpression::Node *QgsExpression::NodeCondition::clone() const
5865
5911
return new NodeCondition ( conditions, mElseExp ? mElseExp ->clone () : nullptr );
5866
5912
}
5867
5913
5914
+ bool QgsExpression::NodeCondition::isStatic ( QgsExpression *parent, const QgsExpressionContext *context ) const
5915
+ {
5916
+ Q_FOREACH ( WhenThen *wt, mConditions )
5917
+ {
5918
+ if ( !wt->mWhenExp ->isStatic ( parent, context ) || !wt->mThenExp ->isStatic ( parent, context ) )
5919
+ return false ;
5920
+ }
5921
+
5922
+ return mElseExp ->isStatic ( parent, context );
5923
+ }
5924
+
5868
5925
5869
5926
QString QgsExpression::helpText ( QString name )
5870
5927
{
@@ -6269,3 +6326,29 @@ QSet<QString> QgsExpression::StaticFunction::referencedColumns( const NodeFuncti
6269
6326
else
6270
6327
return mReferencedColumns ;
6271
6328
}
6329
+
6330
+ QVariant QgsExpression::Node::eval ( QgsExpression *parent, const QgsExpressionContext *context )
6331
+ {
6332
+ if ( mStaticValue .isValid () )
6333
+ {
6334
+ return mStaticValue ;
6335
+ }
6336
+ else
6337
+ {
6338
+ QVariant res = evalNode ( parent, context );
6339
+ return res;
6340
+ }
6341
+ }
6342
+
6343
+ bool QgsExpression::Node::prepare ( QgsExpression *parent, const QgsExpressionContext *context )
6344
+ {
6345
+ if ( isStatic ( parent, context ) )
6346
+ {
6347
+ mStaticValue = evalNode ( parent, context );
6348
+ return true ;
6349
+ }
6350
+ else
6351
+ {
6352
+ return prepareNode ( parent, context );
6353
+ }
6354
+ }
0 commit comments