@@ -115,8 +115,10 @@ QgsSearchTreeNode::QgsSearchTreeNode( const QgsSearchTreeNode& node )
115115 else
116116 mRight = NULL ;
117117
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+ }
120122
121123 init ();
122124}
@@ -209,7 +211,8 @@ QString QgsSearchTreeNode::makeSearchString()
209211 if ( mOp == opSQRT || mOp == opSIN || mOp == opCOS || mOp == opTAN ||
210212 mOp == opASIN || mOp == opACOS || mOp == opATAN ||
211213 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 )
213216 {
214217 // functions
215218 switch ( mOp )
@@ -226,6 +229,10 @@ QString QgsSearchTreeNode::makeSearchString()
226229 case opTOSTRING: str += " to string" ; break ;
227230 case opLOWER: str += " lower" ; break ;
228231 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 ;
229236 default : str += " ?" ;
230237 }
231238 // currently all functions take one parameter
@@ -306,7 +313,7 @@ QString QgsSearchTreeNode::makeSearchString()
306313 else if ( mType == tNodeList )
307314 {
308315 QStringList items;
309- foreach ( QgsSearchTreeNode *node, mNodeList )
316+ foreach ( QgsSearchTreeNode * node, mNodeList )
310317 {
311318 items << node->makeSearchString ();
312319 }
@@ -461,7 +468,7 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, QgsFeature &f )
461468 return false ;
462469 }
463470
464- foreach ( QgsSearchTreeNode *node, mRight ->mNodeList )
471+ foreach ( QgsSearchTreeNode * node, mRight ->mNodeList )
465472 {
466473 if ( !getValue ( value2, node, fields, f ) )
467474 {
@@ -480,7 +487,6 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, QgsFeature &f )
480487
481488 return mOp == opNOTIN;
482489 }
483- break ;
484490
485491 case opRegexp:
486492 case opLike:
@@ -545,7 +551,7 @@ bool QgsSearchTreeNode::getValue( QgsSearchTreeValue& value,
545551 value = node->valueAgainst ( fields, f );
546552 if ( value.isError () )
547553 {
548- switch (( int )value.number () )
554+ switch (( int ) value.number () )
549555 {
550556 case 1 :
551557 mError = QObject::tr ( " Referenced column wasn't found: %1" ).arg ( value.string () );
@@ -587,7 +593,6 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
587593
588594 switch ( mType )
589595 {
590-
591596 case tNumber:
592597 QgsDebugMsgLevel ( " number: " + QString::number ( mNumber ), 2 );
593598 return QgsSearchTreeValue ( mNumber );
@@ -637,13 +642,23 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
637642 // arithmetic operators
638643 case tOperator:
639644 {
640- QgsSearchTreeValue value1, value2;
645+ QgsSearchTreeValue value1, value2, value3 ;
641646 if ( mLeft )
642647 {
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+ }
644658 }
645659 if ( mRight )
646660 {
661+ Q_ASSERT ( !mLeft || mLeft ->type () != tNodeList );
647662 if ( !getValue ( value2, mRight , fields, f ) ) return value2;
648663 }
649664
@@ -716,6 +731,23 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
716731 }
717732 }
718733
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+
719751 // for other operators, convert strings to numbers if needed
720752 double val1, val2;
721753 if ( value1.isNumeric () )
@@ -740,8 +772,6 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
740772 return QgsSearchTreeValue ( 2 , " " ); // division by zero
741773 else
742774 return QgsSearchTreeValue ( val1 / val2 );
743- default :
744- return QgsSearchTreeValue ( 3 , QString::number ( mOp ) ); // unknown operator
745775 case opPOW:
746776 if (( val1 == 0 && val2 < 0 ) || ( val2 < 0 && ( val2 - floor ( val2 ) ) > 0 ) )
747777 {
@@ -762,16 +792,17 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, Q
762792 return QgsSearchTreeValue ( acos ( val1 ) );
763793 case opATAN:
764794 return QgsSearchTreeValue ( atan ( val1 ) );
795+ case opATAN2:
796+ return QgsSearchTreeValue ( atan2 ( val1, val2 ) );
765797 case opTOINT:
766798 return QgsSearchTreeValue ( int ( val1 ) );
767799 case opTOREAL:
768800 return QgsSearchTreeValue ( val1 );
769801 case opTOSTRING:
770802 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
775806 }
776807 }
777808
@@ -806,8 +837,10 @@ void QgsSearchTreeNode::append( QgsSearchTreeNode *node )
806837
807838void QgsSearchTreeNode::append ( QList<QgsSearchTreeNode *> nodes )
808839{
809- foreach ( QgsSearchTreeNode *node, nodes )
810- mNodeList .append ( node );
840+ foreach ( QgsSearchTreeNode * node, nodes )
841+ {
842+ mNodeList .append ( node );
843+ }
811844}
812845
813846int QgsSearchTreeValue::compare ( QgsSearchTreeValue& value1, QgsSearchTreeValue& value2, Qt::CaseSensitivity cs )
0 commit comments