25 , mIgnoreStaticNodes( ignoreStaticNodes )
56 QString quoted = identifier;
57 quoted.replace(
'"', QLatin1String(
"\"\"" ) );
58 quoted = quoted.prepend(
'\"' ).append(
'\"' );
67 return QStringLiteral(
"NULL" );
69 switch ( value.userType() )
71 case QMetaType::Type::Int:
72 case QMetaType::Type::LongLong:
73 case QMetaType::Type::Double:
74 return value.toString();
76 case QMetaType::Type::Bool:
77 return value.toBool() ? QStringLiteral(
"TRUE" ) : QStringLiteral(
"FALSE" );
80 case QMetaType::Type::QString:
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 )
118 return nodeIsNumeric( op->
opLeft() ) && nodeIsNumeric( op->
opRight() );
123 return nodeIsNumeric( op->
operand() );
144 result =
"( NOT " + right +
')';
159 result =
"( - (" + right +
"))";
175 bool partialCompilation =
false;
176 bool failOnPartialNode =
false;
184 partialCompilation =
true;
187 op = QStringLiteral(
"=" );
191 op = QStringLiteral(
">=" );
195 op = QStringLiteral(
">" );
199 op = QStringLiteral(
"<=" );
203 op = QStringLiteral(
"<" );
207 op = QStringLiteral(
"IS" );
211 op = QStringLiteral(
"IS NOT" );
216 op = QStringLiteral(
"LIKE" );
222 op = QStringLiteral(
"LIKE" );
224 op = QStringLiteral(
"ILIKE" );
228 op = QStringLiteral(
"NOT LIKE" );
236 op = QStringLiteral(
"NOT LIKE" );
238 op = QStringLiteral(
"NOT ILIKE" );
244 if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
248 op = QStringLiteral(
"OR" );
254 if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
258 op = QStringLiteral(
"AND" );
263 op = QStringLiteral(
"<>" );
267 op = QStringLiteral(
"*" );
273 if ( nodeIsNumeric( nodeOp->
opLeft() ) && nodeIsNumeric( nodeOp->
opRight() ) )
275 op = QStringLiteral(
"+" );
281 op = QStringLiteral(
"-" );
285 op = QStringLiteral(
"/" );
289 op = QStringLiteral(
"%" );
293 op = QStringLiteral(
"||" );
297 op = QStringLiteral(
"/" );
301 op = QStringLiteral(
"^" );
305 op = QStringLiteral(
"~" );
327 if ( right.isEmpty() )
334 result =
'(' + left +
' ' + op +
' ' + right +
')';
386 res.append( n->
negate() ? QStringLiteral(
" NOT BETWEEN %1" ).arg( s ) : QStringLiteral(
" BETWEEN %1" ).arg( s ) );
401 res.append( QStringLiteral(
" AND %1" ).arg( s ) );
403 return betweenResult;
431 if ( fieldIndex == -1 )
446 const auto constList = n->
list()->
list();
466 result = QStringLiteral(
"%1 %2IN (%3)" ).arg( nd, n->
isNotIn() ? QStringLiteral(
"NOT " ) : QString(), list.join(
',' ) );
484 const auto constList = n->
args()->
list();
503 result = !nd.isEmpty() ? QStringLiteral(
"%1(%2)" ).arg( nd, args.join(
',' ) ) : args.join(
',' );
526 return QStringList( fnArgs );
548 if ( mIgnoreStaticNodes )
570bool 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.
NodeType
Known node types.
@ 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.
Q_INVOKABLE int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Q_INVOKABLE 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, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
static bool isNumericType(QMetaType::Type metaType)
Returns true if the specified metaType is a numeric type.