@@ -115,8 +115,10 @@ QgsSearchTreeNode::QgsSearchTreeNode( const QgsSearchTreeNode& node )
115
115
else
116
116
mRight = NULL ;
117
117
118
- foreach ( QgsSearchTreeNode *lnode, node.mNodeList )
119
- mNodeList .append ( new QgsSearchTreeNode ( *lnode ) );
118
+ foreach ( QgsSearchTreeNode * lnode, node.mNodeList )
119
+ {
120
+ mNodeList .append ( new QgsSearchTreeNode ( *lnode ) );
121
+ }
120
122
121
123
init ();
122
124
}
@@ -209,7 +211,8 @@ QString QgsSearchTreeNode::makeSearchString()
209
211
if ( mOp == opSQRT || mOp == opSIN || mOp == opCOS || mOp == opTAN ||
210
212
mOp == opASIN || mOp == opACOS || mOp == opATAN ||
211
213
mOp == opTOINT || mOp == opTOREAL || mOp == opTOSTRING ||
212
- mOp == opLOWER || mOp == opUPPER )
214
+ mOp == opLOWER || mOp == opUPPER || mOp == opSTRLEN ||
215
+ mOp == opATAN2 || mOp == opREPLACE || mOp == opSUBSTR )
213
216
{
214
217
// functions
215
218
switch ( mOp )
@@ -226,6 +229,10 @@ QString QgsSearchTreeNode::makeSearchString()
226
229
case opTOSTRING: str += " to string" ; break ;
227
230
case opLOWER: str += " lower" ; break ;
228
231
case opUPPER: str += " upper" ; break ;
232
+ case opATAN2: str += " atan2" ; break ;
233
+ case opSTRLEN: str += " length" ; break ;
234
+ case opREPLACE: str += " replace" ; break ;
235
+ case opSUBSTR: str += " substr" ; break ;
229
236
default : str += " ?" ;
230
237
}
231
238
// currently all functions take one parameter
@@ -306,7 +313,7 @@ QString QgsSearchTreeNode::makeSearchString()
306
313
else if ( mType == tNodeList )
307
314
{
308
315
QStringList items;
309
- foreach ( QgsSearchTreeNode *node, mNodeList )
316
+ foreach ( QgsSearchTreeNode * node, mNodeList )
310
317
{
311
318
items << node->makeSearchString ();
312
319
}
@@ -461,7 +468,7 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, QgsFeature &f )
461
468
return false ;
462
469
}
463
470
464
- foreach ( QgsSearchTreeNode *node, mRight ->mNodeList )
471
+ foreach ( QgsSearchTreeNode * node, mRight ->mNodeList )
465
472
{
466
473
if ( !getValue ( value2, node, fields, f ) )
467
474
{
@@ -480,7 +487,6 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, QgsFeature &f )
480
487
481
488
return mOp == opNOTIN;
482
489
}
483
- break ;
484
490
485
491
case opRegexp:
486
492
case opLike:
@@ -545,7 +551,7 @@ bool QgsSearchTreeNode::getValue( QgsSearchTreeValue& value,
545
551
value = node->valueAgainst ( fields, f );
546
552
if ( value.isError () )
547
553
{
548
- switch (( int )value.number () )
554
+ switch (( int ) value.number () )
549
555
{
550
556
case 1 :
551
557
mError = QObject::tr ( " Referenced column wasn't found: %1" ).arg ( value.string () );
@@ -587,7 +593,6 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
587
593
588
594
switch ( mType )
589
595
{
590
-
591
596
case tNumber:
592
597
QgsDebugMsgLevel ( " number: " + QString::number ( mNumber ), 2 );
593
598
return QgsSearchTreeValue ( mNumber );
@@ -637,13 +642,23 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
637
642
// arithmetic operators
638
643
case tOperator:
639
644
{
640
- QgsSearchTreeValue value1, value2;
645
+ QgsSearchTreeValue value1, value2, value3 ;
641
646
if ( mLeft )
642
647
{
643
- if ( !getValue ( value1, mLeft , fields, f ) ) return value1;
648
+ if ( mLeft ->type () != tNodeList )
649
+ {
650
+ if ( !getValue ( value1, mLeft , fields, f ) ) return value1;
651
+ }
652
+ else
653
+ {
654
+ if ( mLeft ->mNodeList .size () > 0 && !getValue ( value1, mLeft ->mNodeList [0 ], fields, f ) ) return value1;
655
+ if ( mLeft ->mNodeList .size () > 1 && !getValue ( value2, mLeft ->mNodeList [1 ], fields, f ) ) return value2;
656
+ if ( mLeft ->mNodeList .size () > 2 && !getValue ( value3, mLeft ->mNodeList [2 ], fields, f ) ) return value3;
657
+ }
644
658
}
645
659
if ( mRight )
646
660
{
661
+ Q_ASSERT ( !mLeft || mLeft ->type () != tNodeList );
647
662
if ( !getValue ( value2, mRight , fields, f ) ) return value2;
648
663
}
649
664
@@ -716,6 +731,23 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
716
731
}
717
732
}
718
733
734
+ // string operations
735
+ switch ( mOp )
736
+ {
737
+ case opLOWER:
738
+ return QgsSearchTreeValue ( value1.string ().toLower () );
739
+ case opUPPER:
740
+ return QgsSearchTreeValue ( value1.string ().toUpper () );
741
+ case opSTRLEN:
742
+ return QgsSearchTreeValue ( value1.string ().length () );
743
+ case opREPLACE:
744
+ return QgsSearchTreeValue ( value1.string ().replace ( value2.string (), value3.string () ) );
745
+ case opSUBSTR:
746
+ return QgsSearchTreeValue ( value1.string ().mid ( value2.number () - 1 , value3.number () ) );
747
+ default :
748
+ break ;
749
+ }
750
+
719
751
// for other operators, convert strings to numbers if needed
720
752
double val1, val2;
721
753
if ( value1.isNumeric () )
@@ -740,8 +772,6 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
740
772
return QgsSearchTreeValue ( 2 , " " ); // division by zero
741
773
else
742
774
return QgsSearchTreeValue ( val1 / val2 );
743
- default :
744
- return QgsSearchTreeValue ( 3 , QString::number ( mOp ) ); // unknown operator
745
775
case opPOW:
746
776
if (( val1 == 0 && val2 < 0 ) || ( val2 < 0 && ( val2 - floor ( val2 ) ) > 0 ) )
747
777
{
@@ -762,16 +792,17 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
762
792
return QgsSearchTreeValue ( acos ( val1 ) );
763
793
case opATAN:
764
794
return QgsSearchTreeValue ( atan ( val1 ) );
795
+ case opATAN2:
796
+ return QgsSearchTreeValue ( atan2 ( val1, val2 ) );
765
797
case opTOINT:
766
798
return QgsSearchTreeValue ( int ( val1 ) );
767
799
case opTOREAL:
768
800
return QgsSearchTreeValue ( val1 );
769
801
case opTOSTRING:
770
802
return QgsSearchTreeValue ( QString::number ( val1 ) );
771
- case opLOWER:
772
- return QgsSearchTreeValue ( value1.string ().toLower () );
773
- case opUPPER:
774
- return QgsSearchTreeValue ( value1.string ().toUpper () );
803
+
804
+ default :
805
+ return QgsSearchTreeValue ( 3 , QString::number ( mOp ) ); // unknown operator
775
806
}
776
807
}
777
808
@@ -806,8 +837,10 @@ void QgsSearchTreeNode::append( QgsSearchTreeNode *node )
806
837
807
838
void QgsSearchTreeNode::append ( QList<QgsSearchTreeNode *> nodes )
808
839
{
809
- foreach ( QgsSearchTreeNode *node, nodes )
810
- mNodeList .append ( node );
840
+ foreach ( QgsSearchTreeNode * node, nodes )
841
+ {
842
+ mNodeList .append ( node );
843
+ }
811
844
}
812
845
813
846
int QgsSearchTreeValue::compare ( QgsSearchTreeValue& value1, QgsSearchTreeValue& value2, Qt::CaseSensitivity cs )
0 commit comments