[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