3838
3939#define EVAL_STR (x ) (x.length() ? x : " (empty)" )
4040
41+ QgsSearchTreeNode::QgsSearchTreeNode ( QgsSearchTreeNode::Type t )
42+ {
43+ Q_ASSERT ( t == tNodeList );
44+ mType = t;
45+ mLeft = NULL ;
46+ mRight = NULL ;
47+
48+ init ();
49+ }
50+
4151QgsSearchTreeNode::QgsSearchTreeNode ( double number )
4252{
4353 mType = tNumber;
@@ -49,7 +59,8 @@ QgsSearchTreeNode::QgsSearchTreeNode( double number )
4959}
5060
5161
52- QgsSearchTreeNode::QgsSearchTreeNode ( Operator op, QgsSearchTreeNode* left,
62+ QgsSearchTreeNode::QgsSearchTreeNode ( Operator op,
63+ QgsSearchTreeNode* left,
5364 QgsSearchTreeNode* right )
5465{
5566 mType = tOperator;
@@ -86,7 +97,6 @@ QgsSearchTreeNode::QgsSearchTreeNode( QString text, bool isColumnRef )
8697 init ();
8798}
8899
89-
90100QgsSearchTreeNode::QgsSearchTreeNode ( const QgsSearchTreeNode& node )
91101{
92102 mType = node.mType ;
@@ -105,6 +115,9 @@ QgsSearchTreeNode::QgsSearchTreeNode( const QgsSearchTreeNode& node )
105115 else
106116 mRight = NULL ;
107117
118+ foreach ( QgsSearchTreeNode *lnode, node.mNodeList )
119+ mNodeList .append ( new QgsSearchTreeNode ( *lnode ) );
120+
108121 init ();
109122}
110123
@@ -119,6 +132,9 @@ QgsSearchTreeNode::~QgsSearchTreeNode()
119132 if ( mRight )
120133 delete mRight ;
121134
135+ while ( !mNodeList .isEmpty () )
136+ delete mNodeList .takeFirst ();
137+
122138 delete mCalc ;
123139}
124140
@@ -262,6 +278,9 @@ QString QgsSearchTreeNode::makeSearchString()
262278
263279 case opRegexp: str += " ~ " ; break ;
264280 case opLike: str += " LIKE " ; break ;
281+ case opILike: str += " ILIKE " ; break ;
282+ case opIN: str += " IN " ; break ;
283+ case opNOTIN: str += " NOT IN " ; break ;
265284
266285 case opCONCAT: str += " || " ; break ;
267286
@@ -283,6 +302,16 @@ QString QgsSearchTreeNode::makeSearchString()
283302 {
284303 str += mText ;
285304 }
305+ else if ( mType == tNodeList )
306+ {
307+ QStringList items;
308+ foreach ( QgsSearchTreeNode *node, mNodeList )
309+ {
310+ items << node->makeSearchString ();
311+ }
312+
313+ str += " (" + items.join ( " ," ) + " )" ;
314+ }
286315 else // unknown type
287316 {
288317 str += " unknown_node_type:" ;
@@ -422,8 +451,39 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttrib
422451 return false ;
423452 }
424453
454+ case opIN:
455+ case opNOTIN:
456+ {
457+ if ( !getValue ( value1, mLeft , fields, attributes, geom ) ||
458+ !mRight || mRight ->type () != tNodeList )
459+ {
460+ return false ;
461+ }
462+
463+ foreach ( QgsSearchTreeNode *node, mRight ->mNodeList )
464+ {
465+ if ( !getValue ( value2, node, fields, attributes, geom ) )
466+ {
467+ mError = QObject::tr ( " Could not retrieve value of list value" );
468+ return false ;
469+ }
470+
471+ res = QgsSearchTreeValue::compare ( value1, value2 );
472+
473+ if ( res == 0 )
474+ {
475+ // found
476+ return mOp == opIN;
477+ }
478+ }
479+
480+ return mOp == opNOTIN;
481+ }
482+ break ;
483+
425484 case opRegexp:
426485 case opLike:
486+ case opILike:
427487 {
428488 if ( !getValue ( value1, mLeft , fields, attributes, geom ) ||
429489 !getValue ( value2, mRight , fields, attributes, geom ) )
@@ -443,12 +503,12 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttrib
443503 // TODO: reuse QRegExp
444504
445505 QString str = value2.string ();
446- if ( mOp == opLike ) // change from LIKE syntax to regexp
506+ if ( mOp == opLike || mOp == opILike ) // change from LIKE syntax to regexp
447507 {
448508 // XXX escape % and _ ???
449509 str.replace ( " %" , " .*" );
450510 str.replace ( " _" , " ." );
451- return QRegExp ( str ).exactMatch ( value1.string () );
511+ return QRegExp ( str, mOp == opLike ? Qt::CaseSensitive : Qt::CaseInsensitive ).exactMatch ( value1.string () );
452512 }
453513 else
454514 {
@@ -705,7 +765,17 @@ void QgsSearchTreeNode::setCurrentRowNumber( int rownum )
705765 }
706766}
707767
768+ void QgsSearchTreeNode::append ( QgsSearchTreeNode *node )
769+ {
770+ Q_ASSERT ( mType == tNodeList );
771+ mNodeList .append ( node );
772+ }
708773
774+ void QgsSearchTreeNode::append ( QList<QgsSearchTreeNode *> nodes )
775+ {
776+ foreach ( QgsSearchTreeNode *node, nodes )
777+ mNodeList .append ( node );
778+ }
709779
710780int QgsSearchTreeValue::compare ( QgsSearchTreeValue& value1, QgsSearchTreeValue& value2, Qt::CaseSensitivity cs )
711781{
0 commit comments