38
38
39
39
#define EVAL_STR (x ) (x.length() ? x : " (empty)" )
40
40
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
+
41
51
QgsSearchTreeNode::QgsSearchTreeNode ( double number )
42
52
{
43
53
mType = tNumber;
@@ -49,7 +59,8 @@ QgsSearchTreeNode::QgsSearchTreeNode( double number )
49
59
}
50
60
51
61
52
- QgsSearchTreeNode::QgsSearchTreeNode ( Operator op, QgsSearchTreeNode* left,
62
+ QgsSearchTreeNode::QgsSearchTreeNode ( Operator op,
63
+ QgsSearchTreeNode* left,
53
64
QgsSearchTreeNode* right )
54
65
{
55
66
mType = tOperator;
@@ -86,7 +97,6 @@ QgsSearchTreeNode::QgsSearchTreeNode( QString text, bool isColumnRef )
86
97
init ();
87
98
}
88
99
89
-
90
100
QgsSearchTreeNode::QgsSearchTreeNode ( const QgsSearchTreeNode& node )
91
101
{
92
102
mType = node.mType ;
@@ -105,6 +115,9 @@ QgsSearchTreeNode::QgsSearchTreeNode( const QgsSearchTreeNode& node )
105
115
else
106
116
mRight = NULL ;
107
117
118
+ foreach ( QgsSearchTreeNode *lnode, node.mNodeList )
119
+ mNodeList .append ( new QgsSearchTreeNode ( *lnode ) );
120
+
108
121
init ();
109
122
}
110
123
@@ -119,6 +132,9 @@ QgsSearchTreeNode::~QgsSearchTreeNode()
119
132
if ( mRight )
120
133
delete mRight ;
121
134
135
+ while ( !mNodeList .isEmpty () )
136
+ delete mNodeList .takeFirst ();
137
+
122
138
delete mCalc ;
123
139
}
124
140
@@ -262,6 +278,9 @@ QString QgsSearchTreeNode::makeSearchString()
262
278
263
279
case opRegexp: str += " ~ " ; break ;
264
280
case opLike: str += " LIKE " ; break ;
281
+ case opILike: str += " ILIKE " ; break ;
282
+ case opIN: str += " IN " ; break ;
283
+ case opNOTIN: str += " NOT IN " ; break ;
265
284
266
285
case opCONCAT: str += " || " ; break ;
267
286
@@ -283,6 +302,16 @@ QString QgsSearchTreeNode::makeSearchString()
283
302
{
284
303
str += mText ;
285
304
}
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
+ }
286
315
else // unknown type
287
316
{
288
317
str += " unknown_node_type:" ;
@@ -422,8 +451,39 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttrib
422
451
return false ;
423
452
}
424
453
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
+
425
484
case opRegexp:
426
485
case opLike:
486
+ case opILike:
427
487
{
428
488
if ( !getValue ( value1, mLeft , fields, attributes, geom ) ||
429
489
!getValue ( value2, mRight , fields, attributes, geom ) )
@@ -443,12 +503,12 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttrib
443
503
// TODO: reuse QRegExp
444
504
445
505
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
447
507
{
448
508
// XXX escape % and _ ???
449
509
str.replace ( " %" , " .*" );
450
510
str.replace ( " _" , " ." );
451
- return QRegExp ( str ).exactMatch ( value1.string () );
511
+ return QRegExp ( str, mOp == opLike ? Qt::CaseSensitive : Qt::CaseInsensitive ).exactMatch ( value1.string () );
452
512
}
453
513
else
454
514
{
@@ -705,7 +765,17 @@ void QgsSearchTreeNode::setCurrentRowNumber( int rownum )
705
765
}
706
766
}
707
767
768
+ void QgsSearchTreeNode::append ( QgsSearchTreeNode *node )
769
+ {
770
+ Q_ASSERT ( mType == tNodeList );
771
+ mNodeList .append ( node );
772
+ }
708
773
774
+ void QgsSearchTreeNode::append ( QList<QgsSearchTreeNode *> nodes )
775
+ {
776
+ foreach ( QgsSearchTreeNode *node, nodes )
777
+ mNodeList .append ( node );
778
+ }
709
779
710
780
int QgsSearchTreeValue::compare ( QgsSearchTreeValue& value1, QgsSearchTreeValue& value2, Qt::CaseSensitivity cs )
711
781
{
0 commit comments