mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-28 00:17:30 -05:00
[FEATURE] support NULL values in search strings (fixes #2533)
git-svn-id: http://svn.osgeo.org/qgis/trunk@13023 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
parent
005205d04b
commit
0e72bcbbf0
@ -59,6 +59,10 @@ string "'"{str_char}*"'"
|
||||
"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; }
|
||||
|
@ -62,8 +62,10 @@ void addToTmpNodes(QgsSearchTreeNode* node);
|
||||
%token <number> NUMBER
|
||||
%token <op> COMPARISON
|
||||
%token <op> FUNCTION
|
||||
%token IS
|
||||
%token AREA
|
||||
%token LENGTH
|
||||
%token NULLVALUE
|
||||
|
||||
%token STRING
|
||||
%token COLUMN_REF
|
||||
@ -119,11 +121,13 @@ predicate:
|
||||
;
|
||||
|
||||
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);}
|
||||
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); }
|
||||
|
@ -237,6 +237,20 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttrib
|
||||
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 @@ bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttrib
|
||||
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,7 +385,12 @@ QgsSearchTreeValue QgsSearchTreeNode::valueAgainst( const QgsFieldMap& fields, c
|
||||
|
||||
// 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() );
|
||||
|
@ -78,6 +78,8 @@ class CORE_EXPORT QgsSearchTreeNode
|
||||
opAREA,
|
||||
|
||||
// comparison
|
||||
opISNULL, // IS NULL
|
||||
opISNOTNULL, // IS NOT NULL
|
||||
opEQ, // =
|
||||
opNE, // != resp. <>
|
||||
opGT, // >
|
||||
@ -174,11 +176,12 @@ class CORE_EXPORT QgsSearchTreeValue
|
||||
{
|
||||
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 @@ class CORE_EXPORT QgsSearchTreeValue
|
||||
|
||||
bool isNumeric() { return mType == valNumber; }
|
||||
bool isError() { return mType == valError; }
|
||||
bool isNull() { return mType == valNull; }
|
||||
|
||||
QString& string() { return mString; }
|
||||
double number() { return mNumber; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user