[QGIS Commit] r14156 - in trunk/qgis/src: app core

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Aug 27 11:08:15 EDT 2010


Author: jef
Date: 2010-08-27 15:08:15 +0000 (Fri, 27 Aug 2010)
New Revision: 14156

Modified:
   trunk/qgis/src/app/qgsquerybuilder.h
   trunk/qgis/src/app/qgssearchquerybuilder.cpp
   trunk/qgis/src/app/qgssearchquerybuilder.h
   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:
add ilike, in and not in to search string

Modified: trunk/qgis/src/app/qgsquerybuilder.h
===================================================================
--- trunk/qgis/src/app/qgsquerybuilder.h	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/app/qgsquerybuilder.h	2010-08-27 15:08:15 UTC (rev 14156)
@@ -112,6 +112,7 @@
      */
     void on_btnSampleValues_clicked();
     void setDatasourceDescription( QString uri );
+
   private:
     /*!
      * Populate the field list for the selected table

Modified: trunk/qgis/src/app/qgssearchquerybuilder.cpp
===================================================================
--- trunk/qgis/src/app/qgssearchquerybuilder.cpp	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/app/qgssearchquerybuilder.cpp	2010-08-27 15:08:15 UTC (rev 14156)
@@ -60,14 +60,6 @@
   pbn->setToolTip( tr( "Load query from xml file" ) );
   connect( pbn, SIGNAL( clicked() ), this, SLOT( loadQuery() ) );
 
-  // disable unsupported operators
-  btnIn->setHidden( true );
-  btnNotIn->setHidden( true );
-  btnPct->setHidden( true );
-
-  // change to ~
-  btnILike->setText( "~" );
-
   lblDataUri->setText( layer->name() );
   populateFields();
 }
@@ -281,6 +273,21 @@
   txtSQL->insertPlainText( " > " );
 }
 
+void QgsSearchQueryBuilder::on_btnPct_clicked()
+{
+  txtSQL->insertPlainText( "%" );
+}
+
+void QgsSearchQueryBuilder::on_btnIn_clicked()
+{
+  txtSQL->insertPlainText( " IN " );
+}
+
+void QgsSearchQueryBuilder::on_btnNotIn_clicked()
+{
+  txtSQL->insertPlainText( " NOT IN " );
+}
+
 void QgsSearchQueryBuilder::on_btnLike_clicked()
 {
   txtSQL->insertPlainText( " LIKE " );
@@ -343,8 +350,7 @@
 
 void QgsSearchQueryBuilder::on_btnILike_clicked()
 {
-  //txtSQL->insertPlainText(" ILIKE ");
-  txtSQL->insertPlainText( " ~ " );
+  txtSQL->insertPlainText( " ILIKE " );
 }
 
 void QgsSearchQueryBuilder::saveQuery()

Modified: trunk/qgis/src/app/qgssearchquerybuilder.h
===================================================================
--- trunk/qgis/src/app/qgssearchquerybuilder.h	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/app/qgssearchquerybuilder.h	2010-08-27 15:08:15 UTC (rev 14156)
@@ -57,6 +57,9 @@
     void on_btnGreaterThan_clicked();
     void on_btnLike_clicked();
     void on_btnILike_clicked();
+    void on_btnPct_clicked();
+    void on_btnIn_clicked();
+    void on_btnNotIn_clicked();
 
     void on_lstFields_doubleClicked( const QModelIndex &index );
     void on_lstValues_doubleClicked( const QModelIndex &index );

Modified: trunk/qgis/src/core/qgssearchstringlexer.ll
===================================================================
--- trunk/qgis/src/core/qgssearchstringlexer.ll	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/core/qgssearchstringlexer.ll	2010-08-27 15:08:15 UTC (rev 14156)
@@ -70,6 +70,7 @@
 "NULL"	{ return NULLVALUE; }
 
 "IS"  {  return IS; }
+"IN"  {  return IN; }
 
 "="   {  yylval.op = QgsSearchTreeNode::opEQ; return COMPARISON; }
 "!="  {  yylval.op = QgsSearchTreeNode::opNE; return COMPARISON; }
@@ -80,6 +81,7 @@
 ">"   {  yylval.op = QgsSearchTreeNode::opGT; return COMPARISON; }
 "~"   {  yylval.op = QgsSearchTreeNode::opRegexp; return COMPARISON; }
 "LIKE" { yylval.op = QgsSearchTreeNode::opLike; return COMPARISON; }
+"ILIKE" { yylval.op = QgsSearchTreeNode::opILike; return COMPARISON; }
 
 "sqrt" { yylval.op = QgsSearchTreeNode::opSQRT; return FUNCTION;}
 "sin"  { yylval.op = QgsSearchTreeNode::opSIN; return FUNCTION;}

Modified: trunk/qgis/src/core/qgssearchstringparser.yy
===================================================================
--- trunk/qgis/src/core/qgssearchstringparser.yy	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/core/qgssearchstringparser.yy	2010-08-27 15:08:15 UTC (rev 14156)
@@ -64,6 +64,7 @@
 %token <op> FUNCTION
 %token CONCAT
 %token IS
+%token IN
 %token ROWNUM
 %token AREA
 %token LENGTH
@@ -83,6 +84,7 @@
 %type <node> predicate
 %type <node> comp_predicate
 %type <node> scalar_exp
+%type <node> scalar_exp_list
 
 // debugging
 //%error-verbose
@@ -130,9 +132,14 @@
     | scalar_exp COMPARISON scalar_exp  { $$ = new QgsSearchTreeNode($2, $1, $3); joinTmpNodes($$,$1,$3); }
     ;
 
+scalar_exp_list:
+    | scalar_exp_list ',' scalar_exp { $$ = $1; $1->append($3); joinTmpNodes($1,$1,$3); }
+    | scalar_exp                     { $$ = new QgsSearchTreeNode( QgsSearchTreeNode::tNodeList ); $$->append($1); joinTmpNodes($$,$$,$1); }
+    ;
+
 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); }
+    | 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); }
@@ -147,6 +154,8 @@
     | NUMBER                      { $$ = new QgsSearchTreeNode($1); addToTmpNodes($$); }
     | STRING                      { $$ = new QgsSearchTreeNode(QString::fromUtf8(yytext), 0); addToTmpNodes($$); }
     | COLUMN_REF                  { $$ = new QgsSearchTreeNode(QString::fromUtf8(yytext), 1); addToTmpNodes($$); }
+    | scalar_exp IN '(' scalar_exp_list ')' { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opIN, $1, $4); joinTmpNodes($$,$1,$4); }
+    | scalar_exp NOT IN '(' scalar_exp_list ')' { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opNOTIN, $1, $5); joinTmpNodes($$,$1,$5); }
 ;
 
 %%

Modified: trunk/qgis/src/core/qgssearchtreenode.cpp
===================================================================
--- trunk/qgis/src/core/qgssearchtreenode.cpp	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/core/qgssearchtreenode.cpp	2010-08-27 15:08:15 UTC (rev 14156)
@@ -38,6 +38,16 @@
 
 #define EVAL_STR(x) (x.length() ? x : "(empty)")
 
+QgsSearchTreeNode::QgsSearchTreeNode( QgsSearchTreeNode::Type t )
+{
+  Q_ASSERT( t == tNodeList );
+  mType  = t;
+  mLeft  = NULL;
+  mRight = NULL;
+
+  init();
+}
+
 QgsSearchTreeNode::QgsSearchTreeNode( double number )
 {
   mType   = tNumber;
@@ -49,7 +59,8 @@
 }
 
 
-QgsSearchTreeNode::QgsSearchTreeNode( Operator op, QgsSearchTreeNode* left,
+QgsSearchTreeNode::QgsSearchTreeNode( Operator op,
+                                      QgsSearchTreeNode* left,
                                       QgsSearchTreeNode* right )
 {
   mType  = tOperator;
@@ -86,7 +97,6 @@
   init();
 }
 
-
 QgsSearchTreeNode::QgsSearchTreeNode( const QgsSearchTreeNode& node )
 {
   mType = node.mType;
@@ -105,6 +115,9 @@
   else
     mRight = NULL;
 
+  foreach( QgsSearchTreeNode *lnode, node.mNodeList )
+  mNodeList.append( new QgsSearchTreeNode( *lnode ) );
+
   init();
 }
 
@@ -119,6 +132,9 @@
   if ( mRight )
     delete mRight;
 
+  while ( !mNodeList.isEmpty() )
+    delete mNodeList.takeFirst();
+
   delete mCalc;
 }
 
@@ -262,6 +278,9 @@
 
         case opRegexp: str += " ~ "; break;
         case opLike: str += " LIKE "; break;
+        case opILike: str += " ILIKE "; break;
+        case opIN: str += " IN "; break;
+        case opNOTIN: str += " NOT IN "; break;
 
         case opCONCAT: str += " || "; break;
 
@@ -283,6 +302,16 @@
   {
     str += mText;
   }
+  else if ( mType == tNodeList )
+  {
+    QStringList items;
+    foreach( QgsSearchTreeNode *node, mNodeList )
+    {
+      items << node->makeSearchString();
+    }
+
+    str += "(" + items.join( "," ) + ")";
+  }
   else // unknown type
   {
     str += "unknown_node_type:";
@@ -422,8 +451,39 @@
           return false;
       }
 
+    case opIN:
+    case opNOTIN:
+    {
+      if ( !getValue( value1, mLeft, fields, attributes, geom ) ||
+           !mRight || mRight->type() != tNodeList )
+      {
+        return false;
+      }
+
+      foreach( QgsSearchTreeNode *node, mRight->mNodeList )
+      {
+        if ( !getValue( value2, node, fields, attributes, geom ) )
+        {
+          mError = QObject::tr( "Could not retrieve value of list value" );
+          return false;
+        }
+
+        res = QgsSearchTreeValue::compare( value1, value2 );
+
+        if ( res == 0 )
+        {
+          // found
+          return mOp == opIN;
+        }
+      }
+
+      return mOp == opNOTIN;
+    }
+    break;
+
     case opRegexp:
     case opLike:
+    case opILike:
     {
       if ( !getValue( value1, mLeft, fields, attributes, geom ) ||
            !getValue( value2, mRight, fields, attributes, geom ) )
@@ -443,12 +503,12 @@
       // TODO: reuse QRegExp
 
       QString str = value2.string();
-      if ( mOp == opLike ) // change from LIKE syntax to regexp
+      if ( mOp == opLike || mOp == opILike ) // change from LIKE syntax to regexp
       {
         // XXX escape % and _  ???
         str.replace( "%", ".*" );
         str.replace( "_", "." );
-        return QRegExp( str ).exactMatch( value1.string() );
+        return QRegExp( str, mOp == opLike ? Qt::CaseSensitive : Qt::CaseInsensitive ).exactMatch( value1.string() );
       }
       else
       {
@@ -705,7 +765,17 @@
   }
 }
 
+void QgsSearchTreeNode::append( QgsSearchTreeNode *node )
+{
+  Q_ASSERT( mType == tNodeList );
+  mNodeList.append( node );
+}
 
+void QgsSearchTreeNode::append( QList<QgsSearchTreeNode *> nodes )
+{
+  foreach( QgsSearchTreeNode *node, nodes )
+  mNodeList.append( node );
+}
 
 int QgsSearchTreeValue::compare( QgsSearchTreeValue& value1, QgsSearchTreeValue& value2, Qt::CaseSensitivity cs )
 {

Modified: trunk/qgis/src/core/qgssearchtreenode.h
===================================================================
--- trunk/qgis/src/core/qgssearchtreenode.h	2010-08-27 12:16:53 UTC (rev 14155)
+++ trunk/qgis/src/core/qgssearchtreenode.h	2010-08-27 15:08:15 UTC (rev 14156)
@@ -24,6 +24,7 @@
 #include <QString>
 #include <QStringList>
 #include <QVariant>
+#include <QList>
 
 #include <qgsfield.h>
 #include <qgsfeature.h>
@@ -48,7 +49,8 @@
       tOperator = 1,
       tNumber,
       tColumnRef,
-      tString
+      tString,
+      tNodeList,
     };
 
     //! possible operators
@@ -83,16 +85,19 @@
       opAREA,
 
       // comparison
-      opISNULL,  // IS NULL
+      opISNULL,     // IS NULL
       opISNOTNULL,  // IS NOT NULL
-      opEQ,   // =
-      opNE,   // != resp. <>
-      opGT,   // >
-      opLT,   // <
-      opGE,   // >=
-      opLE,   // <=
-      opRegexp, // ~
-      opLike,  // LIKE
+      opEQ,         // =
+      opNE,         // != resp. <>
+      opGT,         // >
+      opLT,         // <
+      opGE,         // >=
+      opLE,         // <=
+      opRegexp,     // ~
+      opLike,       // LIKE
+      opILike,      // ILIKE
+      opIN,         // IN
+      opNOTIN,      // NOT IN
 
       // string handling
       opCONCAT,
@@ -103,6 +108,7 @@
     };
 
     //! constructors
+    QgsSearchTreeNode( Type type );
     QgsSearchTreeNode( double number );
     QgsSearchTreeNode( Operator op, QgsSearchTreeNode* left, QgsSearchTreeNode* right );
     QgsSearchTreeNode( QString text, bool isColumnRef );
@@ -173,6 +179,14 @@
     //! @note added in 1.6
     void setCurrentRowNumber( int rownum );
 
+    //! append a node to the list
+    //! @note added in 1.6
+    void append( QgsSearchTreeNode * );
+
+    //! append nodelist to the list
+    //! @note added in 1.6
+    void append( QList<QgsSearchTreeNode*> );
+
   protected:
 
 
@@ -197,6 +211,7 @@
     Operator mOp;
     double mNumber;
     QString mText;
+    QList<QgsSearchTreeNode *> mNodeList;
 
     QString mError;
 



More information about the QGIS-commit mailing list