25 , mIgnoreStaticNodes( ignoreStaticNodes )
56 QString quoted = identifier;
57 quoted.replace(
'"', QLatin1String(
"\"\"" ) );
58 quoted = quoted.prepend(
'\"' ).append(
'\"' );
67 return QStringLiteral(
"NULL" );
69 switch ( value.type() )
72 case QVariant::LongLong:
73 case QVariant::Double:
74 return value.toString();
77 return value.toBool() ? QStringLiteral(
"TRUE" ) : QStringLiteral(
"FALSE" );
80 case QVariant::String:
81 QString v = value.toString();
82 v.replace(
'\'', QLatin1String(
"''" ) );
83 if ( v.contains(
'\\' ) )
84 return v.replace(
'\\', QLatin1String(
"\\\\" ) ).prepend(
"E'" ).append(
'\'' );
86 return v.prepend(
'\'' ).append(
'\'' );
93 if ( staticRes !=
Fail )
108 result =
"( NOT " + right +
')';
123 result =
"( - (" + right +
"))";
139 bool partialCompilation =
false;
140 bool failOnPartialNode =
false;
148 partialCompilation =
true;
151 op = QStringLiteral(
"=" );
155 op = QStringLiteral(
">=" );
159 op = QStringLiteral(
">" );
163 op = QStringLiteral(
"<=" );
167 op = QStringLiteral(
"<" );
171 op = QStringLiteral(
"IS" );
175 op = QStringLiteral(
"IS NOT" );
180 op = QStringLiteral(
"LIKE" );
186 op = QStringLiteral(
"LIKE" );
188 op = QStringLiteral(
"ILIKE" );
192 op = QStringLiteral(
"NOT LIKE" );
200 op = QStringLiteral(
"NOT LIKE" );
202 op = QStringLiteral(
"NOT ILIKE" );
208 if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
212 op = QStringLiteral(
"OR" );
218 if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
222 op = QStringLiteral(
"AND" );
227 op = QStringLiteral(
"<>" );
231 op = QStringLiteral(
"*" );
235 op = QStringLiteral(
"+" );
239 op = QStringLiteral(
"-" );
243 op = QStringLiteral(
"/" );
247 op = QStringLiteral(
"%" );
251 op = QStringLiteral(
"||" );
255 op = QStringLiteral(
"/" );
259 op = QStringLiteral(
"^" );
263 op = QStringLiteral(
"~" );
285 if ( right.isEmpty() )
292 result =
'(' + left +
' ' + op +
' ' + right +
')';
344 res.append( n->
negate() ? QStringLiteral(
" NOT BETWEEN %1" ).arg( s ) : QStringLiteral(
" BETWEEN %1" ).arg( s ) );
359 res.append( QStringLiteral(
" AND %1" ).arg( s ) );
361 return betweenResult;
389 if ( fieldIndex == -1 )
404 const auto constList = n->
list()->
list();
424 result = QStringLiteral(
"%1 %2IN (%3)" ).arg( nd, n->
isNotIn() ? QStringLiteral(
"NOT " ) : QString(), list.join(
',' ) );
442 const auto constList = n->
args()->
list();
461 result = !nd.isEmpty() ? QStringLiteral(
"%1(%2)" ).arg( nd, args.join(
',' ) ) : args.join(
',' );
484 return QStringList( fnArgs );
506 if ( mIgnoreStaticNodes )
528bool QgsSqlExpressionCompiler::nodeIsNullLiteral(
const QgsExpressionNode *node )
const
A abstract base class for defining QgsExpression functions.
QString name() const
The name of the function.
SQL-like BETWEEN and NOT BETWEEN predicates.
bool negate() const
Returns true if the predicate is an exclusion test (NOT BETWEEN).
QgsExpressionNode * lowerBound() const
Returns the lower bound expression node of the range.
QgsExpressionNode * higherBound() const
Returns the higher bound expression node of the range.
QgsExpressionNode * node() const
Returns the expression node.
A binary expression operator, which operates on two values.
QgsExpressionNode * opLeft() const
Returns the node to the left of the operator.
QgsExpressionNode * opRight() const
Returns the node to the right of the operator.
QgsExpressionNodeBinaryOperator::BinaryOperator op() const
Returns the binary operator.
BinaryOperator
list of binary operators
An expression node which takes it value from a feature's field.
QString name() const
The name of the column.
An expression node for expression functions.
int fnIndex() const
Returns the index of the node's function.
QgsExpressionNode::NodeList * args() const
Returns a list of arguments specified for the function.
An expression node for value IN or NOT IN clauses.
QgsExpressionNode * node() const
Returns the expression node.
QgsExpressionNode::NodeList * list() const
Returns the list of nodes to search for matching values within.
bool isNotIn() const
Returns true if this node is a "NOT IN" operator, or false if the node is a normal "IN" operator.
An expression node for literal values.
QVariant value() const
The value of the literal.
A unary node is either negative as in boolean (not) or as in numbers (minus).
QgsExpressionNodeUnaryOperator::UnaryOperator op() const
Returns the unary operator.
QgsExpressionNode * operand() const
Returns the node the operator will operate upon.
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
Abstract base class for all nodes that can appear in an expression.
bool hasCachedStaticValue() const
Returns true if the node can be replaced by a static cached value.
virtual QgsExpressionNode::NodeType nodeType() const =0
Gets the type of this node.
QVariant cachedStaticValue() const
Returns the node's static cached value.
@ ntBetweenOperator
Between operator.
@ ntIndexOperator
Index operator.
Class for parsing and evaluation of expressions (formerly called "search strings").
static const QList< QgsExpressionFunction * > & Functions()
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
Container of fields for a vector layer.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
virtual Result compileNode(const QgsExpressionNode *node, QString &str)
Compiles an expression node and returns the result of the compilation.
virtual Result compile(const QgsExpression *exp)
Compiles an expression and returns the result of the compilation.
Result
Possible results from expression compilation.
@ Fail
Provider cannot handle expression.
@ Complete
Expression was successfully compiled and can be completely delegated to provider.
@ Partial
Expression was partially compiled, but provider will return extra records and results must be double-...
virtual QStringList sqlArgumentsFromFunctionName(const QString &fnName, const QStringList &fnArgs) const
Returns the Arguments for SQL function for the expression function.
virtual Result replaceNodeByStaticCachedValueIfPossible(const QgsExpressionNode *node, QString &str)
Tries to replace a node by its static cached value where possible.
virtual QString result()
Returns the compiled expression string for use by the provider.
virtual QString quotedValue(const QVariant &value, bool &ok)
Returns a quoted attribute value, in the format expected by the provider.
virtual QString castToText(const QString &value) const
Casts a value to a text result.
virtual QString castToInt(const QString &value) const
Casts a value to a integer result.
virtual QString quotedIdentifier(const QString &identifier)
Returns a quoted column identifier, in the format expected by the provider.
virtual QString sqlFunctionFromFunctionName(const QString &fnName) const
Returns the SQL function for the expression function.
QgsSqlExpressionCompiler(const QgsFields &fields, QgsSqlExpressionCompiler::Flags flags=Flags(), bool ignoreStaticNodes=false)
Constructor for expression compiler.
virtual QString castToReal(const QString &value) const
Casts a value to a real result.
bool opIsStringComparison(QgsExpressionNodeBinaryOperator::BinaryOperator op)
Returns true if op is one of.
@ LikeIsCaseInsensitive
Provider treats LIKE as case-insensitive.
@ NoUnaryMinus
Provider does not unary minus, e.g., " -( 100 * 2 ) = ...".
@ CaseInsensitiveStringMatch
Provider performs case-insensitive string matching for all strings.
@ NoNullInBooleanLogic
Provider does not support using NULL with boolean logic, e.g., "(...) OR NULL".
@ IntegerDivisionResultsInInteger
Dividing int by int results in int on provider. Subclass must implement the castToReal() function to ...
static bool isNull(const QVariant &variant)
Returns true if the specified variant should be considered a NULL value.