[QGIS Commit] r13023 - trunk/qgis/src/core
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Mon Mar 8 12:51:25 EST 2010
Author: jef
Date: 2010-03-08 12:51:23 -0500 (Mon, 08 Mar 2010)
New Revision: 13023
Modified:
trunk/qgis/src/core/qgssearchstringlexer.ll
trunk/qgis/src/core/qgssearchstringparser.yy
trunk/qgis/src/core/qgssearchtreenode.cpp
trunk/qgis/src/core/qgssearchtreenode.h
Log:
[FEATURE] support NULL values in search strings (fixes #2533)
Modified: trunk/qgis/src/core/qgssearchstringlexer.ll
===================================================================
--- trunk/qgis/src/core/qgssearchstringlexer.ll 2010-03-08 02:20:27 UTC (rev 13022)
+++ trunk/qgis/src/core/qgssearchstringlexer.ll 2010-03-08 17:51:23 UTC (rev 13023)
@@ -59,6 +59,10 @@
"AND" { return AND; }
"OR" { return OR; }
+"NULL" { return NULLVALUE; }
+
+"IS" { return IS; }
+
"=" { yylval.op = QgsSearchTreeNode::opEQ; return COMPARISON; }
"!=" { yylval.op = QgsSearchTreeNode::opNE; return COMPARISON; }
"<=" { yylval.op = QgsSearchTreeNode::opLE; return COMPARISON; }
Modified: trunk/qgis/src/core/qgssearchstringparser.yy
===================================================================
--- trunk/qgis/src/core/qgssearchstringparser.yy 2010-03-08 02:20:27 UTC (rev 13022)
+++ trunk/qgis/src/core/qgssearchstringparser.yy 2010-03-08 17:51:23 UTC (rev 13023)
@@ -62,8 +62,10 @@
%token <number> NUMBER
%token <op> COMPARISON
%token <op> FUNCTION
+%token IS
%token AREA
%token LENGTH
+%token NULLVALUE
%token STRING
%token COLUMN_REF
@@ -119,12 +121,14 @@
;
comp_predicate:
- scalar_exp COMPARISON scalar_exp { $$ = new QgsSearchTreeNode($2, $1, $3); joinTmpNodes($$,$1,$3); }
+ scalar_exp IS NULLVALUE { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opISNULL, $1, 0); joinTmpNodes($$,$1,0); }
+ | scalar_exp IS NOT NULLVALUE { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opISNOTNULL, $1, 0); joinTmpNodes($$,$1,0); }
+ | scalar_exp COMPARISON scalar_exp { $$ = new QgsSearchTreeNode($2, $1, $3); joinTmpNodes($$,$1,$3); }
;
scalar_exp:
- FUNCTION '(' scalar_exp ')' {$$ = new QgsSearchTreeNode($1, $3, 0); joinTmpNodes($$, $3, 0);}
- | scalar_exp '^' scalar_exp { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opPOW, $1, $3); joinTmpNodes($$, $1, $3); }
+ FUNCTION '(' scalar_exp ')' { $$ = new QgsSearchTreeNode($1, $3, 0); joinTmpNodes($$, $3, 0);}
+ | scalar_exp '^' scalar_exp { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opPOW, $1, $3); joinTmpNodes($$, $1, $3); }
| scalar_exp '*' scalar_exp { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opMUL, $1, $3); joinTmpNodes($$,$1,$3); }
| scalar_exp '/' scalar_exp { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opDIV, $1, $3); joinTmpNodes($$,$1,$3); }
| scalar_exp '+' scalar_exp { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opPLUS, $1, $3); joinTmpNodes($$,$1,$3); }
@@ -134,7 +138,7 @@
| '-' scalar_exp %prec UMINUS { $$ = $2; if ($$->type() == QgsSearchTreeNode::tNumber) $$->setNumber(- $$->number()); }
| AREA { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opAREA, 0, 0); addToTmpNodes($$); }
| LENGTH { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opLENGTH, 0, 0); addToTmpNodes($$); }
- | NUMBER { $$ = new QgsSearchTreeNode($1); addToTmpNodes($$); }
+ | NUMBER { $$ = new QgsSearchTreeNode($1); addToTmpNodes($$); }
| STRING { $$ = new QgsSearchTreeNode(QString::fromUtf8(yytext), 0); addToTmpNodes($$); }
| COLUMN_REF { $$ = new QgsSearchTreeNode(QString::fromUtf8(yytext), 1); addToTmpNodes($$); }
;
Modified: trunk/qgis/src/core/qgssearchtreenode.cpp
===================================================================
--- trunk/qgis/src/core/qgssearchtreenode.cpp 2010-03-08 02:20:27 UTC (rev 13022)
+++ trunk/qgis/src/core/qgssearchtreenode.cpp 2010-03-08 17:51:23 UTC (rev 13023)
@@ -237,6 +237,20 @@
return true;
return mRight->checkAgainst( fields, attributes );
+ case opISNULL:
+ case opISNOTNULL:
+ if ( !getValue( value1, mLeft, fields, attributes ) )
+ return false;
+
+ if ( mOp == opISNULL )
+ {
+ return value1.isNull();
+ }
+ else if ( mOp == opISNOTNULL )
+ {
+ return !value1.isNull();
+ }
+
case opEQ:
case opNE:
case opGT:
@@ -247,6 +261,12 @@
if ( !getValue( value1, mLeft, fields, attributes ) || !getValue( value2, mRight, fields, attributes ) )
return false;
+ if ( value1.isNull() || value2.isNull() )
+ {
+ // NULL values never match
+ return false;
+ }
+
res = QgsSearchTreeValue::compare( value1, value2 );
switch ( mOp )
@@ -365,8 +385,13 @@
// get the value
QVariant val = attributes[it.key()];
- if ( val.type() == QVariant::Bool || val.type() == QVariant::Int || val.type() == QVariant::Double )
+ if ( val.isNull() )
{
+ QgsDebugMsgLevel( " NULL", 2 );
+ return QgsSearchTreeValue();
+ }
+ else if ( val.type() == QVariant::Bool || val.type() == QVariant::Int || val.type() == QVariant::Double )
+ {
QgsDebugMsgLevel( " number: " + QString::number( val.toDouble() ), 2 );
return QgsSearchTreeValue( val.toDouble() );
}
Modified: trunk/qgis/src/core/qgssearchtreenode.h
===================================================================
--- trunk/qgis/src/core/qgssearchtreenode.h 2010-03-08 02:20:27 UTC (rev 13022)
+++ trunk/qgis/src/core/qgssearchtreenode.h 2010-03-08 17:51:23 UTC (rev 13023)
@@ -78,6 +78,8 @@
opAREA,
// comparison
+ opISNULL, // IS NULL
+ opISNOTNULL, // IS NOT NULL
opEQ, // =
opNE, // != resp. <>
opGT, // >
@@ -174,11 +176,12 @@
{
valError,
valString,
- valNumber
+ valNumber,
+ valNull
};
- QgsSearchTreeValue() { }
- QgsSearchTreeValue( QString string ) { mType = valString; mString = string; }
+ QgsSearchTreeValue() { mType = valNull; }
+ QgsSearchTreeValue( QString string ) { mType = string.isNull() ? valNull : valString; mString = string; }
QgsSearchTreeValue( double number ) { mType = valNumber; mNumber = number; }
QgsSearchTreeValue( int error, QString errorMsg ) { mType = valError; mNumber = error; mString = errorMsg; }
@@ -187,6 +190,7 @@
bool isNumeric() { return mType == valNumber; }
bool isError() { return mType == valError; }
+ bool isNull() { return mType == valNull; }
QString& string() { return mString; }
double number() { return mNumber; }
More information about the QGIS-commit
mailing list