33 #define EVAL_STR(x) (x.length() ? x : "(empty)")
78 if ( text.at( 0 ) ==
'\"' )
148 QString ellipsoid = settings.value(
"/qgis/measure/ellipsoid",
"WGS84" ).toString();
164 mText.replace( QRegExp(
"''" ),
"'" );
168 while (( index =
mText.indexOf(
'\\', index ) ) != -1 )
170 mText.remove( index, 1 );
172 switch (
mText[index].toLatin1() )
174 case 'n': chr =
'\n';
break;
175 case 't': chr =
'\t';
break;
176 case '\\': chr =
'\\';
break;
177 case '\'': chr =
'\'';
break;
178 default: chr =
'?';
break;
180 mText[index++] = chr;
191 mText.replace( QRegExp(
"\"\"" ),
"\"" );
196 return QString(
"\"%1\"" ).arg( name.replace(
"\"",
"\"\"" ) );
214 case opSQRT: str +=
"sqrt";
break;
215 case opSIN: str +=
"sin";
break;
216 case opCOS: str +=
"cos";
break;
217 case opTAN: str +=
"tan";
break;
218 case opASIN: str +=
"asin";
break;
219 case opACOS: str +=
"acos";
break;
220 case opATAN: str +=
"atan";
break;
221 case opTOINT: str +=
"to int";
break;
222 case opTOREAL: str +=
"to real";
break;
224 case opLOWER: str +=
"lower";
break;
225 case opUPPER: str +=
"upper";
break;
226 case opATAN2: str +=
"atan2";
break;
227 case opSTRLEN: str +=
"length";
break;
229 case opSUBSTR: str +=
"substr";
break;
240 case opLENGTH: str +=
"$length";
break;
241 case opAREA: str +=
"$area";
break;
243 case opROWNUM: str +=
"$rownum";
break;
244 case opX: str +=
"$x";
break;
245 case opY: str +=
"$y";
break;
246 case opID: str +=
"$id";
break;
265 case opAND: str +=
" AND ";
break;
266 case opOR: str +=
" OR ";
break;
268 case opPLUS: str +=
"+";
break;
269 case opMINUS: str +=
"-";
break;
270 case opMUL: str +=
"*";
break;
271 case opMOD: str +=
"%";
break;
272 case opDIV: str +=
"/";
break;
273 case opPOW: str +=
"^";
break;
275 case opEQ: str +=
" = ";
break;
276 case opNE: str +=
" != ";
break;
277 case opGT: str +=
" > ";
break;
278 case opLT: str +=
" < ";
break;
279 case opGE: str +=
" >= ";
break;
280 case opLE: str +=
" <= ";
break;
282 case opISNULL: str +=
" IS NULL";
break;
286 case opLike: str +=
" LIKE ";
break;
287 case opILike: str +=
" ILIKE ";
break;
288 case opIN: str +=
" IN ";
break;
289 case opNOTIN: str +=
" NOT IN ";
break;
291 case opCONCAT: str +=
" || ";
break;
293 default: str +=
" ? ";
319 str +=
"(" + items.join(
"," ) +
")";
323 str +=
"unknown_node_type:";
333 QSet<QString> columnStringSet;
335 QList<QgsSearchTreeNode*>::const_iterator nodeIt = columnNodeList.constBegin();
336 for ( ; nodeIt != columnNodeList.constEnd(); ++nodeIt )
338 columnStringSet.insert(( *nodeIt )->columnRef() );
340 return columnStringSet.toList();
345 QList<QgsSearchTreeNode*> nodeList;
359 nodeList.push_back(
this );
401 mError = QObject::tr(
"Expected operator, got scalar value!" );
449 case opEQ:
return res == 0;
450 case opNE:
return res != 0;
451 case opGT:
return res > 0;
452 case opLT:
return res < 0;
453 case opGE:
return res >= 0;
454 case opLE:
return res <= 0;
456 mError = QObject::tr(
"Unexpected state when evaluating operator!" );
471 if ( !
getValue( value2, node, fields, f ) )
473 mError = QObject::tr(
"Could not retrieve value of list value" );
504 mError = QObject::tr(
"Regular expressions on numeric values don't make sense. Use comparison instead." );
510 QString str = value2.
string();
514 str.replace(
"%",
".*" );
515 str.replace(
"_",
"." );
516 return QRegExp( str,
mOp ==
opLike ? Qt::CaseSensitive : Qt::CaseInsensitive ).exactMatch( value1.
string() );
520 return QRegExp( str ).indexIn( value1.
string() ) != -1;
525 mError = QObject::tr(
"Unknown operator: %1" ).arg(
mOp );
541 return getValue( value, node, fields, f );
552 switch ((
int ) value.
number() )
555 mError = QObject::tr(
"Referenced column wasn't found: %1" ).arg( value.
string() );
558 mError = QObject::tr(
"Division by zero." );
563 mError = QObject::tr(
"Unknown operator: %1" ).arg( value.
string() );
566 mError = QObject::tr(
"Unknown token: %1" ).arg( value.
string() );
569 mError = QObject::tr(
"Unknown error!" );
606 QgsFieldMap::const_iterator it;
607 for ( it = fields.begin(); it != fields.end(); it++ )
609 if ( QString::compare( it->name(),
mText, Qt::CaseInsensitive ) == 0 )
613 if ( it == fields.end() )
627 else if ( val.type() == QVariant::Bool || val.type() == QVariant::Int || val.type() == QVariant::Double )
766 val1 = value1.
string().toDouble();
770 val2 = value2.
string().toDouble();
790 if (( val1 == 0 && val2 < 0 ) || ( val2 < 0 && ( val2 - floor( val2 ) ) > 0 ) )
871 val1 = value1.
string().toDouble();
875 val2 = value2.
string().toDouble();
877 QgsDebugMsgLevel(
"NUM_COMP: " + QString::number( val1 ) +
" ~ " + QString::number( val2 ), 2 );
881 else if ( val1 > val2 )