Skip to content

Commit 5ed41e3

Browse files
committedApr 26, 2016
Move QgsSpatiaLiteExpressionCompiler class to core as QgsSQLiteExpressionCompiler so it can be reused by the OGR provider as well
1 parent 847e416 commit 5ed41e3

File tree

5 files changed

+38
-25
lines changed

5 files changed

+38
-25
lines changed
 

‎src/core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ SET(QGIS_CORE_SRCS
188188
qgssnappingutils.cpp
189189
qgsspatialindex.cpp
190190
qgssqlexpressioncompiler.cpp
191+
qgssqliteexpressioncompiler.cpp
191192
qgsstatisticalsummary.cpp
192193
qgsstringutils.cpp
193194
qgstextlabelfeature.cpp

‎src/providers/spatialite/qgsspatialiteexpressioncompiler.cpp renamed to ‎src/core/qgssqliteexpressioncompiler.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/***************************************************************************
2-
qgsspatialiteexpressioncompiler.cpp
2+
qgssqliteexpressioncompiler.cpp
33
-----------------------------------
44
begin : November 2015
55
copyright : (C) 2015 Nyall Dawson
@@ -13,16 +13,15 @@
1313
* *
1414
***************************************************************************/
1515

16-
#include "qgsspatialiteexpressioncompiler.h"
16+
#include "qgssqliteexpressioncompiler.h"
1717
#include "qgssqlexpressioncompiler.h"
18-
#include "qgsspatialiteprovider.h"
1918

20-
QgsSpatiaLiteExpressionCompiler::QgsSpatiaLiteExpressionCompiler( QgsSpatiaLiteFeatureSource* source )
21-
: QgsSqlExpressionCompiler( source->mFields, QgsSqlExpressionCompiler::LikeIsCaseInsensitive )
19+
QgsSQLiteExpressionCompiler::QgsSQLiteExpressionCompiler( const QgsFields& fields )
20+
: QgsSqlExpressionCompiler( fields, QgsSqlExpressionCompiler::LikeIsCaseInsensitive )
2221
{
2322
}
2423

25-
QgsSqlExpressionCompiler::Result QgsSpatiaLiteExpressionCompiler::compileNode( const QgsExpression::Node* node, QString& result )
24+
QgsSqlExpressionCompiler::Result QgsSQLiteExpressionCompiler::compileNode( const QgsExpression::Node* node, QString& result )
2625
{
2726
switch ( node->nodeType() )
2827
{
@@ -47,12 +46,14 @@ QgsSqlExpressionCompiler::Result QgsSpatiaLiteExpressionCompiler::compileNode( c
4746
return QgsSqlExpressionCompiler::compileNode( node, result );
4847
}
4948

50-
QString QgsSpatiaLiteExpressionCompiler::quotedIdentifier( const QString& identifier )
49+
QString QgsSQLiteExpressionCompiler::quotedIdentifier( const QString& identifier )
5150
{
52-
return QgsSpatiaLiteProvider::quotedIdentifier( identifier );
51+
QString id( identifier );
52+
id.replace( '\"', "\"\"" );
53+
return id.prepend( '\"' ).append( '\"' );
5354
}
5455

55-
QString QgsSpatiaLiteExpressionCompiler::quotedValue( const QVariant& value, bool& ok )
56+
QString QgsSQLiteExpressionCompiler::quotedValue( const QVariant& value, bool& ok )
5657
{
5758
ok = true;
5859

@@ -73,10 +74,10 @@ QString QgsSpatiaLiteExpressionCompiler::quotedValue( const QVariant& value, boo
7374
default:
7475
case QVariant::String:
7576
QString v = value.toString();
76-
v.replace( '\'', "''" );
77-
if ( v.contains( '\\' ) )
78-
return v.replace( '\\', "\\\\" ).prepend( "E'" ).append( '\'' );
79-
else
80-
return v.prepend( '\'' ).append( '\'' );
77+
// https://www.sqlite.org/lang_expr.html :
78+
// """A string constant is formed by enclosing the string in single quotes (').
79+
// A single quote within the string can be encoded by putting two single quotes
80+
// in a row - as in Pascal. C-style escapes using the backslash character are not supported because they are not standard SQL. """
81+
return v.replace( '\'', "''" ).prepend( '\'' ).append( '\'' );
8182
}
8283
}

‎src/providers/spatialite/qgsspatialiteexpressioncompiler.h renamed to ‎src/core/qgssqliteexpressioncompiler.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/***************************************************************************
2-
qgsspatialiteexpressioncompiler.h
2+
qgssqliteexpressioncompiler.h
33
---------------------------------
44
begin : November 2015
55
copyright : (C) 2015 Nyall Dawson
@@ -13,18 +13,30 @@
1313
* *
1414
***************************************************************************/
1515

16-
#ifndef QGSSPATIALITEEXPRESSIONCOMPILER_H
17-
#define QGSSPATIALITEEXPRESSIONCOMPILER_H
16+
#ifndef QGSSQLITEEXPRESSIONCOMPILER_H
17+
#define QGSSQLITEEXPRESSIONCOMPILER_H
1818

1919
#include "qgssqlexpressioncompiler.h"
2020
#include "qgsexpression.h"
21-
#include "qgsspatialitefeatureiterator.h"
2221

23-
class QgsSpatiaLiteExpressionCompiler : public QgsSqlExpressionCompiler
22+
/** \ingroup core
23+
* \class QgsSQLiteExpressionCompiler
24+
* \brief Expression compiler for translation to SQlite SQL WHERE clauses.
25+
*
26+
* This class is designed to be used by spatialite and OGR providers.
27+
* \note Added in version 2.16
28+
* \note Not part of stable API, may change in future versions of QGIS
29+
* \note Not available in Python bindings
30+
*/
31+
32+
class CORE_EXPORT QgsSQLiteExpressionCompiler : public QgsSqlExpressionCompiler
2433
{
2534
public:
2635

27-
explicit QgsSpatiaLiteExpressionCompiler( QgsSpatiaLiteFeatureSource* source );
36+
/** Constructor for expression compiler.
37+
* @param fields fields from provider
38+
*/
39+
explicit QgsSQLiteExpressionCompiler( const QgsFields& fields );
2840

2941
protected:
3042

@@ -34,4 +46,4 @@ class QgsSpatiaLiteExpressionCompiler : public QgsSqlExpressionCompiler
3446

3547
};
3648

37-
#endif // QGSSPATIALITEEXPRESSIONCOMPILER_H
49+
#endif // QGSSQLITEEXPRESSIONCOMPILER_H

‎src/providers/spatialite/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ SET(SPATIALITE_SRCS
1010
qgsspatialitedataitems.cpp
1111
qgsspatialiteconnection.cpp
1212
qgsspatialiteconnpool.cpp
13-
qgsspatialiteexpressioncompiler.cpp
1413
qgsspatialitefeatureiterator.cpp
1514
qgsspatialitesourceselect.cpp
1615
qgsspatialitetablemodel.cpp

‎src/providers/spatialite/qgsspatialitefeatureiterator.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include "qgsspatialiteconnection.h"
1818
#include "qgsspatialiteconnpool.h"
1919
#include "qgsspatialiteprovider.h"
20-
#include "qgsspatialiteexpressioncompiler.h"
20+
#include "qgssqliteexpressioncompiler.h"
2121

2222
#include "qgsgeometry.h"
2323
#include "qgslogger.h"
@@ -98,7 +98,7 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
9898

9999
if ( QSettings().value( "/qgis/compileExpressions", true ).toBool() )
100100
{
101-
QgsSpatiaLiteExpressionCompiler compiler = QgsSpatiaLiteExpressionCompiler( source );
101+
QgsSQLiteExpressionCompiler compiler = QgsSQLiteExpressionCompiler( source->mFields );
102102

103103
QgsSqlExpressionCompiler::Result result = compiler.compile( request.filterExpression() );
104104

@@ -139,7 +139,7 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
139139
{
140140
Q_FOREACH ( const QgsFeatureRequest::OrderByClause& clause, request.orderBy() )
141141
{
142-
QgsSpatiaLiteExpressionCompiler compiler = QgsSpatiaLiteExpressionCompiler( source );
142+
QgsSQLiteExpressionCompiler compiler = QgsSQLiteExpressionCompiler( source->mFields );
143143
QgsExpression expression = clause.expression();
144144
if ( compiler.compile( &expression ) == QgsSqlExpressionCompiler::Complete )
145145
{

0 commit comments

Comments
 (0)
Please sign in to comment.