Skip to content

Commit

Permalink
Move QgsSpatiaLiteExpressionCompiler class to core as QgsSQLiteExpres…
Browse files Browse the repository at this point in the history
…sionCompiler so it can be reused by the OGR provider as well
  • Loading branch information
rouault committed Apr 26, 2016
1 parent 847e416 commit 5ed41e3
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 25 deletions.
1 change: 1 addition & 0 deletions src/core/CMakeLists.txt
Expand Up @@ -188,6 +188,7 @@ SET(QGIS_CORE_SRCS
qgssnappingutils.cpp
qgsspatialindex.cpp
qgssqlexpressioncompiler.cpp
qgssqliteexpressioncompiler.cpp
qgsstatisticalsummary.cpp
qgsstringutils.cpp
qgstextlabelfeature.cpp
Expand Down
@@ -1,5 +1,5 @@
/***************************************************************************
qgsspatialiteexpressioncompiler.cpp
qgssqliteexpressioncompiler.cpp
-----------------------------------
begin : November 2015
copyright : (C) 2015 Nyall Dawson
Expand All @@ -13,16 +13,15 @@
* *
***************************************************************************/

#include "qgsspatialiteexpressioncompiler.h"
#include "qgssqliteexpressioncompiler.h"
#include "qgssqlexpressioncompiler.h"
#include "qgsspatialiteprovider.h"

QgsSpatiaLiteExpressionCompiler::QgsSpatiaLiteExpressionCompiler( QgsSpatiaLiteFeatureSource* source )
: QgsSqlExpressionCompiler( source->mFields, QgsSqlExpressionCompiler::LikeIsCaseInsensitive )
QgsSQLiteExpressionCompiler::QgsSQLiteExpressionCompiler( const QgsFields& fields )
: QgsSqlExpressionCompiler( fields, QgsSqlExpressionCompiler::LikeIsCaseInsensitive )
{
}

QgsSqlExpressionCompiler::Result QgsSpatiaLiteExpressionCompiler::compileNode( const QgsExpression::Node* node, QString& result )
QgsSqlExpressionCompiler::Result QgsSQLiteExpressionCompiler::compileNode( const QgsExpression::Node* node, QString& result )
{
switch ( node->nodeType() )
{
Expand All @@ -47,12 +46,14 @@ QgsSqlExpressionCompiler::Result QgsSpatiaLiteExpressionCompiler::compileNode( c
return QgsSqlExpressionCompiler::compileNode( node, result );
}

QString QgsSpatiaLiteExpressionCompiler::quotedIdentifier( const QString& identifier )
QString QgsSQLiteExpressionCompiler::quotedIdentifier( const QString& identifier )
{
return QgsSpatiaLiteProvider::quotedIdentifier( identifier );
QString id( identifier );
id.replace( '\"', "\"\"" );
return id.prepend( '\"' ).append( '\"' );
}

QString QgsSpatiaLiteExpressionCompiler::quotedValue( const QVariant& value, bool& ok )
QString QgsSQLiteExpressionCompiler::quotedValue( const QVariant& value, bool& ok )
{
ok = true;

Expand All @@ -73,10 +74,10 @@ QString QgsSpatiaLiteExpressionCompiler::quotedValue( const QVariant& value, boo
default:
case QVariant::String:
QString v = value.toString();
v.replace( '\'', "''" );
if ( v.contains( '\\' ) )
return v.replace( '\\', "\\\\" ).prepend( "E'" ).append( '\'' );
else
return v.prepend( '\'' ).append( '\'' );
// https://www.sqlite.org/lang_expr.html :
// """A string constant is formed by enclosing the string in single quotes (').
// A single quote within the string can be encoded by putting two single quotes
// in a row - as in Pascal. C-style escapes using the backslash character are not supported because they are not standard SQL. """
return v.replace( '\'', "''" ).prepend( '\'' ).append( '\'' );
}
}
@@ -1,5 +1,5 @@
/***************************************************************************
qgsspatialiteexpressioncompiler.h
qgssqliteexpressioncompiler.h
---------------------------------
begin : November 2015
copyright : (C) 2015 Nyall Dawson
Expand All @@ -13,18 +13,30 @@
* *
***************************************************************************/

#ifndef QGSSPATIALITEEXPRESSIONCOMPILER_H
#define QGSSPATIALITEEXPRESSIONCOMPILER_H
#ifndef QGSSQLITEEXPRESSIONCOMPILER_H
#define QGSSQLITEEXPRESSIONCOMPILER_H

#include "qgssqlexpressioncompiler.h"
#include "qgsexpression.h"
#include "qgsspatialitefeatureiterator.h"

class QgsSpatiaLiteExpressionCompiler : public QgsSqlExpressionCompiler
/** \ingroup core
* \class QgsSQLiteExpressionCompiler
* \brief Expression compiler for translation to SQlite SQL WHERE clauses.
*
* This class is designed to be used by spatialite and OGR providers.
* \note Added in version 2.16
* \note Not part of stable API, may change in future versions of QGIS
* \note Not available in Python bindings
*/

class CORE_EXPORT QgsSQLiteExpressionCompiler : public QgsSqlExpressionCompiler
{
public:

explicit QgsSpatiaLiteExpressionCompiler( QgsSpatiaLiteFeatureSource* source );
/** Constructor for expression compiler.
* @param fields fields from provider
*/
explicit QgsSQLiteExpressionCompiler( const QgsFields& fields );

protected:

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

};

#endif // QGSSPATIALITEEXPRESSIONCOMPILER_H
#endif // QGSSQLITEEXPRESSIONCOMPILER_H
1 change: 0 additions & 1 deletion src/providers/spatialite/CMakeLists.txt
Expand Up @@ -10,7 +10,6 @@ SET(SPATIALITE_SRCS
qgsspatialitedataitems.cpp
qgsspatialiteconnection.cpp
qgsspatialiteconnpool.cpp
qgsspatialiteexpressioncompiler.cpp
qgsspatialitefeatureiterator.cpp
qgsspatialitesourceselect.cpp
qgsspatialitetablemodel.cpp
Expand Down
6 changes: 3 additions & 3 deletions src/providers/spatialite/qgsspatialitefeatureiterator.cpp
Expand Up @@ -17,7 +17,7 @@
#include "qgsspatialiteconnection.h"
#include "qgsspatialiteconnpool.h"
#include "qgsspatialiteprovider.h"
#include "qgsspatialiteexpressioncompiler.h"
#include "qgssqliteexpressioncompiler.h"

#include "qgsgeometry.h"
#include "qgslogger.h"
Expand Down Expand Up @@ -98,7 +98,7 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature

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

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

Expand Down Expand Up @@ -139,7 +139,7 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
{
Q_FOREACH ( const QgsFeatureRequest::OrderByClause& clause, request.orderBy() )
{
QgsSpatiaLiteExpressionCompiler compiler = QgsSpatiaLiteExpressionCompiler( source );
QgsSQLiteExpressionCompiler compiler = QgsSQLiteExpressionCompiler( source->mFields );
QgsExpression expression = clause.expression();
if ( compiler.compile( &expression ) == QgsSqlExpressionCompiler::Complete )
{
Expand Down

0 comments on commit 5ed41e3

Please sign in to comment.