Skip to content

Commit

Permalink
Add some more expression compilation tests, fix <> string for OGR
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 18, 2015
1 parent 35d0dd3 commit 982490f
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/core/qgssqlexpressioncompiler.cpp
Expand Up @@ -94,6 +94,7 @@ QgsSqlExpressionCompiler::Result QgsSqlExpressionCompiler::compileNode( const Qg

QString op;
bool partialCompilation = false;
bool failOnPartialNode = false;
switch ( n->op() )
{
case QgsExpression::boEQ:
Expand Down Expand Up @@ -129,6 +130,7 @@ QgsSqlExpressionCompiler::Result QgsSqlExpressionCompiler::compileNode( const Qg

case QgsExpression::boIsNot:
op = "IS NOT";
failOnPartialNode = mFlags.testFlag( CaseInsensitiveStringMatch );
break;

case QgsExpression::boLike:
Expand All @@ -146,9 +148,11 @@ QgsSqlExpressionCompiler::Result QgsSqlExpressionCompiler::compileNode( const Qg
case QgsExpression::boNotLike:
op = "NOT LIKE";
partialCompilation = mFlags.testFlag( LikeIsCaseInsensitive );
failOnPartialNode = mFlags.testFlag( CaseInsensitiveStringMatch );
break;

case QgsExpression::boNotILike:
failOnPartialNode = mFlags.testFlag( CaseInsensitiveStringMatch );
if ( mFlags.testFlag( LikeIsCaseInsensitive ) )
op = "NOT LIKE";
else
Expand All @@ -164,6 +168,7 @@ QgsSqlExpressionCompiler::Result QgsSqlExpressionCompiler::compileNode( const Qg
break;

case QgsExpression::boNE:
failOnPartialNode = mFlags.testFlag( CaseInsensitiveStringMatch );
op = "<>";
break;

Expand Down Expand Up @@ -211,6 +216,9 @@ QgsSqlExpressionCompiler::Result QgsSqlExpressionCompiler::compileNode( const Qg
QString right;
Result rr( compileNode( n->opRight(), right ) );

if ( failOnPartialNode && ( lr == Partial || rr == Partial ) )
return Fail;

result = left + ' ' + op + ' ' + right;
if ( lr == Complete && rr == Complete )
return ( partialCompilation ? Partial : Complete );
Expand Down
11 changes: 11 additions & 0 deletions tests/src/python/providertestbase.py
Expand Up @@ -41,7 +41,10 @@ def runGetFeatureTests(self, provider):
self.assert_query(provider, '"name" NOT ILIKE \'QGIS\'', [1, 2, 3, 4])
self.assert_query(provider, '"name" NOT ILIKE \'pEAR\'', [1, 2, 4])
self.assert_query(provider, 'name = \'Apple\'', [2])
self.assert_query(provider, 'name <> \'Apple\'', [1, 3, 4])
self.assert_query(provider, 'name = \'apple\'', [])
self.assert_query(provider, '"name" <> \'apple\'', [1, 2, 3, 4])
self.assert_query(provider, '(name = \'Apple\') is not null', [1, 2, 3, 4])
self.assert_query(provider, 'name LIKE \'Apple\'', [2])
self.assert_query(provider, 'name LIKE \'aPple\'', [])
self.assert_query(provider, 'name ILIKE \'aPple\'', [2])
Expand Down Expand Up @@ -84,6 +87,14 @@ def runGetFeatureTests(self, provider):
self.assert_query(provider, 'not true', [])
self.assert_query(provider, 'not false', [1, 2, 3, 4, 5])
self.assert_query(provider, 'not null', [])
#not
self.assert_query(provider, 'not name = \'Apple\'', [1, 3, 4])
self.assert_query(provider, 'not name IS NULL', [1, 2, 3, 4])
self.assert_query(provider, 'not name = \'Apple\' or name = \'Apple\'', [1, 2, 3, 4])
self.assert_query(provider, 'not name = \'Apple\' or not name = \'Apple\'', [1, 3, 4])
self.assert_query(provider, 'not name = \'Apple\' and pk = 4', [4])
self.assert_query(provider, 'not name = \'Apple\' and not pk = 4', [1, 3])
self.assert_query(provider, 'not pk IN (1, 2, 4, 8)', [3, 5])

def testGetFeaturesUncompiled(self):
try:
Expand Down

0 comments on commit 982490f

Please sign in to comment.