[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