From 813ee5a68dd3c77eea4cabde292a5b9a939144f6 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 30 Jul 2020 09:15:52 +1000 Subject: [PATCH] [expressions] Silently alias "geom" named across to "geometry" So that was can standardize on using "geometry" as the named argument insted of mixing "geom" and "geometry" in the public docs. --- src/core/expression/qgsexpressionnode.h | 5 +++++ src/core/expression/qgsexpressionnodeimpl.cpp | 13 ++++++++++++- tests/src/core/testqgsexpression.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/core/expression/qgsexpressionnode.h b/src/core/expression/qgsexpressionnode.h index 4ccb2c272ca..3e86afbd6ce 100644 --- a/src/core/expression/qgsexpressionnode.h +++ b/src/core/expression/qgsexpressionnode.h @@ -170,6 +170,11 @@ class CORE_EXPORT QgsExpressionNode SIP_ABSTRACT bool mHasNamedNodes = false; + /** + * Cleans up and standardises the name of a named node. + */ + static QString cleanNamedNodeName( const QString &name ); + public: }; diff --git a/src/core/expression/qgsexpressionnodeimpl.cpp b/src/core/expression/qgsexpressionnodeimpl.cpp index e60483869cd..531d2b49182 100644 --- a/src/core/expression/qgsexpressionnodeimpl.cpp +++ b/src/core/expression/qgsexpressionnodeimpl.cpp @@ -52,7 +52,7 @@ QgsExpressionNode::NodeList::~NodeList() void QgsExpressionNode::NodeList::append( QgsExpressionNode::NamedNode *node ) { mList.append( node->node ); - mNameList.append( node->name.toLower() ); + mNameList.append( cleanNamedNodeName( node->name ) ); mHasNamedNodes = true; delete node; } @@ -82,6 +82,17 @@ QString QgsExpressionNode::NodeList::dump() const return msg; } +QString QgsExpressionNode::NodeList::cleanNamedNodeName( const QString &name ) +{ + QString cleaned = name.toLower(); + + // upgrade older argument names to standard versions + if ( cleaned == QLatin1String( "geom" ) ) + cleaned = QStringLiteral( "geometry" ); + + return cleaned; +} + // diff --git a/tests/src/core/testqgsexpression.cpp b/tests/src/core/testqgsexpression.cpp index b186a9571b9..cf92611b3e6 100644 --- a/tests/src/core/testqgsexpression.cpp +++ b/tests/src/core/testqgsexpression.cpp @@ -1038,6 +1038,8 @@ class TestQgsExpression: public QObject QTest::newRow( "exterior_ring polygon" ) << "geom_to_wkt(exterior_ring(geom_from_wkt('POLYGON((-1 -1, 4 0, 4 2, 0 2, -1 -1),( 0.1 0.1, 0.1 0.2, 0.2 0.2, 0.2, 0.1, 0.1 0.1))')))" << false << QVariant( "LineString (-1 -1, 4 0, 4 2, 0 2, -1 -1)" ); QTest::newRow( "exterior_ring line" ) << "exterior_ring(geom_from_wkt('LINESTRING(0 0, 1 1, 2 2)'))" << false << QVariant(); QTest::newRow( "centroid polygon" ) << "geom_to_wkt(centroid( geomFromWKT('POLYGON((0 0,0 9,9 0,0 0))')))" << false << QVariant( "Point (3 3)" ); + QTest::newRow( "centroid named argument geom" ) << "geom_to_wkt(centroid( geom:=geomFromWKT('POLYGON((0 0,0 9,9 0,0 0))')))" << false << QVariant( "Point (3 3)" ); + QTest::newRow( "centroid named argument geometry" ) << "geom_to_wkt(centroid( geometry:=geomFromWKT('POLYGON((0 0,0 9,9 0,0 0))')))" << false << QVariant( "Point (3 3)" ); QTest::newRow( "centroid multi polygon" ) << "geom_to_wkt(centroid( geomFromWKT('MULTIPOLYGON(((0 0,0 1,1 1,1 0,0 0)),((2 0,2 1,3 1,3 0,2 0)))') ))" << false << QVariant( "Point (1.5 0.5)" ); QTest::newRow( "centroid point" ) << "geom_to_wkt(centroid( geomFromWKT('POINT (1.5 0.5)') ))" << false << QVariant( "Point (1.5 0.5)" ); QTest::newRow( "centroid line" ) << "geom_to_wkt(centroid( geomFromWKT('LINESTRING (-1 2, 9 12)') ))" << false << QVariant( "Point (4 7)" );