Skip to content

Commit

Permalink
clean up ogc filter and expression functions
Browse files Browse the repository at this point in the history
  • Loading branch information
signedav authored and nyalldawson committed Jul 20, 2022
1 parent e5c906d commit b601ce4
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 100 deletions.
130 changes: 33 additions & 97 deletions src/core/qgsogcutils.cpp
Expand Up @@ -891,6 +891,26 @@ QgsGeometry QgsOgcUtils::geometryFromGMLMultiPolygon( const QDomElement &geometr
return g;
}

QDomElement QgsOgcUtils::filterElement( QDomDocument &doc, GMLVersion gmlVersion, FilterVersion filterVersion, bool GMLUsed )
{
QDomElement filterElem =
( filterVersion == FILTER_FES_2_0 ) ?
doc.createElementNS( FES_NAMESPACE, QStringLiteral( "fes:Filter" ) ) :
doc.createElementNS( OGC_NAMESPACE, QStringLiteral( "ogc:Filter" ) );

if ( GMLUsed )
{
QDomAttr attr = doc.createAttribute( QStringLiteral( "xmlns:gml" ) );
if ( gmlVersion == GML_3_2_1 )
attr.setValue( GML32_NAMESPACE );
else
attr.setValue( GML_NAMESPACE );
filterElem.setAttributeNode( attr );
}
return filterElem;
}


bool QgsOgcUtils::readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &elem )
{
QString coordSeparator = QStringLiteral( "," );
Expand Down Expand Up @@ -1858,12 +1878,13 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &exp, QDomDo
QStringLiteral( "geometry" ), QString(), false, false, errorMessage );
}

QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage )
QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage, bool requiresFilterElement )
{
return expressionToOgcExpression( exp, doc, GML_2_1_2, FILTER_OGC_1_0,
QStringLiteral( "geometry" ), QString(), false, false, errorMessage );
QStringLiteral( "geometry" ), QString(), false, false, errorMessage, requiresFilterElement );
}


QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &expression,
QDomDocument &doc,
GMLVersion gmlVersion,
Expand All @@ -1888,19 +1909,7 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &expression,
if ( exprRootElem.isNull() )
return QDomElement();

QDomElement filterElem =
( filterVersion == FILTER_FES_2_0 ) ?
doc.createElementNS( FES_NAMESPACE, QStringLiteral( "fes:Filter" ) ) :
doc.createElementNS( OGC_NAMESPACE, QStringLiteral( "ogc:Filter" ) );
if ( utils.GMLNamespaceUsed() )
{
QDomAttr attr = doc.createAttribute( QStringLiteral( "xmlns:gml" ) );
if ( gmlVersion == GML_3_2_1 )
attr.setValue( GML32_NAMESPACE );
else
attr.setValue( GML_NAMESPACE );
filterElem.setAttributeNode( attr );
}
QDomElement filterElem = filterElement( doc, gmlVersion, filterVersion, utils.GMLNamespaceUsed() );
filterElem.appendChild( exprRootElem );
return filterElem;
}
Expand All @@ -1913,61 +1922,8 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &express
const QString &srsName,
bool honourAxisOrientation,
bool invertAxisOrientation,
QString *errorMessage )
{
QgsExpressionContext context;
context << QgsExpressionContextUtils::globalScope();

QgsExpression exp = expression;

const QgsExpressionNode *node = exp.rootNode();
if ( !node )
return QDomElement();

switch ( node->nodeType() )
{
case QgsExpressionNode::ntFunction:
case QgsExpressionNode::ntLiteral:
case QgsExpressionNode::ntColumnRef:
{
QgsOgcUtilsExprToFilter utils( doc, gmlVersion, filterVersion, geometryName, srsName, honourAxisOrientation, invertAxisOrientation );
const QDomElement exprRootElem = utils.expressionNodeToOgcFilter( node, &exp, &context );

if ( errorMessage )
*errorMessage = utils.errorMessage();

if ( !exprRootElem.isNull() )
{
return exprRootElem;
}
break;
}
default:
{
if ( errorMessage )
*errorMessage = QObject::tr( "Node type not supported in expression translation: %1" ).arg( node->nodeType() );
}
}
// got an error
return QDomElement();
}

QDomElement QgsOgcUtils::expressionToOgcExpressionFilter( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage )
{
return expressionToOgcExpressionFilter( exp, doc, GML_2_1_2, FILTER_OGC_1_0,
QStringLiteral( "geometry" ), QString(), false, false, errorMessage );
}


QDomElement QgsOgcUtils::expressionToOgcExpressionFilter( const QgsExpression &expression,
QDomDocument &doc,
GMLVersion gmlVersion,
FilterVersion filterVersion,
const QString &geometryName,
const QString &srsName,
bool honourAxisOrientation,
bool invertAxisOrientation,
QString *errorMessage )
QString *errorMessage,
bool requiresFilterElement )
{
QgsExpressionContext context;
context << QgsExpressionContextUtils::globalScope();
Expand All @@ -1992,21 +1948,14 @@ QDomElement QgsOgcUtils::expressionToOgcExpressionFilter( const QgsExpression &e

if ( !exprRootElem.isNull() )
{
QDomElement filterElem =
( filterVersion == FILTER_FES_2_0 ) ?
doc.createElementNS( FES_NAMESPACE, QStringLiteral( "fes:Filter" ) ) :
doc.createElementNS( OGC_NAMESPACE, QStringLiteral( "ogc:Filter" ) );
if ( utils.GMLNamespaceUsed() )
if ( requiresFilterElement )
{
QDomAttr attr = doc.createAttribute( QStringLiteral( "xmlns:gml" ) );
if ( gmlVersion == GML_3_2_1 )
attr.setValue( GML32_NAMESPACE );
else
attr.setValue( GML_NAMESPACE );
filterElem.setAttributeNode( attr );
QDomElement filterElem = filterElement( doc, gmlVersion, filterVersion, utils.GMLNamespaceUsed() );

filterElem.appendChild( exprRootElem );
return filterElem;
}
filterElem.appendChild( exprRootElem );
return filterElem;
return exprRootElem;
}
break;
}
Expand Down Expand Up @@ -2042,19 +1991,7 @@ QDomElement QgsOgcUtils::SQLStatementToOgcFilter( const QgsSQLStatement &stateme
if ( exprRootElem.isNull() )
return QDomElement();

QDomElement filterElem =
( filterVersion == FILTER_FES_2_0 ) ?
doc.createElementNS( FES_NAMESPACE, QStringLiteral( "fes:Filter" ) ) :
doc.createElementNS( OGC_NAMESPACE, QStringLiteral( "ogc:Filter" ) );
if ( utils.GMLNamespaceUsed() )
{
QDomAttr attr = doc.createAttribute( QStringLiteral( "xmlns:gml" ) );
if ( gmlVersion == GML_3_2_1 )
attr.setValue( GML32_NAMESPACE );
else
attr.setValue( GML_NAMESPACE );
filterElem.setAttributeNode( attr );
}
QDomElement filterElem = filterElement( doc, gmlVersion, filterVersion, utils.GMLNamespaceUsed() );

QSet<QString> setNamespaceURI;
for ( const LayerProperties &props : layerProperties )
Expand All @@ -2068,7 +2005,6 @@ QDomElement QgsOgcUtils::SQLStatementToOgcFilter( const QgsSQLStatement &stateme
filterElem.setAttributeNode( attr );
}
}

filterElem.appendChild( exprRootElem );
return filterElem;
}
Expand Down
20 changes: 18 additions & 2 deletions src/core/qgsogcutils.h
Expand Up @@ -214,7 +214,8 @@ class CORE_EXPORT QgsOgcUtils
* \returns valid OGC expression QDomElement on success,
* otherwise null QDomElement
*/
static QDomElement expressionToOgcExpression( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage = nullptr );
static QDomElement expressionToOgcExpression( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage = nullptr,
bool requiresFilterElement = false );

/**
* Creates an OGC expression XML element.
Expand All @@ -229,7 +230,8 @@ class CORE_EXPORT QgsOgcUtils
const QString &srsName,
bool honourAxisOrientation,
bool invertAxisOrientation,
QString *errorMessage = nullptr );
QString *errorMessage = nullptr,
bool requiresFilterElement = false );

/**
* Creates an OGC expression XML element.
Expand Down Expand Up @@ -323,6 +325,20 @@ class CORE_EXPORT QgsOgcUtils
//! Static method that creates geometry from GML MultiPolygon
static QgsGeometry geometryFromGMLMultiPolygon( const QDomElement &geometryElement );

/**
* @brief filterElement
* @param doc
* @param gmlVersion
* @param filterVersion
* @param GMLUsed
* @return
*/
static QDomElement filterElement(
QDomDocument &doc,
QgsOgcUtils::GMLVersion gmlVersion,
FilterVersion filterVersion,
bool GMLUsed );

/**
* Reads the \verbatim <gml:coordinates> \endverbatim element and extracts the coordinates as points
* \param coords list where the found coordinates are appended
Expand Down
2 changes: 1 addition & 1 deletion src/providers/wfs/qgswfsshareddata.cpp
Expand Up @@ -119,7 +119,7 @@ QString QgsWFSSharedData::computedExpression( const QgsExpression &expression )
if ( expression.isValid() )
{
QDomDocument expressionDoc;
QDomElement expressionElem = QgsOgcUtils::expressionToOgcExpressionFilter( expression, expressionDoc, gmlVersion, filterVersion, mGeometryAttribute, srsName(), honourAxisOrientation, mURI.invertAxisOrientation() );
QDomElement expressionElem = QgsOgcUtils::expressionToOgcExpression( expression, expressionDoc, gmlVersion, filterVersion, mGeometryAttribute, srsName(), honourAxisOrientation, mURI.invertAxisOrientation(), nullptr, true );

if ( !expressionElem.isNull() )
{
Expand Down

0 comments on commit b601ce4

Please sign in to comment.