Skip to content

Commit 68b4602

Browse files
committedFeb 19, 2019
layer_property expression function should use proper layer metadata
for return values where available ...instead of the older, server-specific properties This affects: - layer_property(...,'title') - layer_property(...,'abstract') - layer_property(...,'keywords') - layer_property(...,'attribution')
1 parent b06f00d commit 68b4602

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed
 

‎src/core/expression/qgsexpressionfunction.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4215,21 +4215,34 @@ static QVariant fcnGetLayerProperty( const QVariantList &values, const QgsExpres
42154215
if ( !layer )
42164216
return QVariant();
42174217

4218+
// here, we always prefer the layer metadata values over the older server-specific published values
42184219
QString layerProperty = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
42194220
if ( QString::compare( layerProperty, QStringLiteral( "name" ), Qt::CaseInsensitive ) == 0 )
42204221
return layer->name();
42214222
else if ( QString::compare( layerProperty, QStringLiteral( "id" ), Qt::CaseInsensitive ) == 0 )
42224223
return layer->id();
42234224
else if ( QString::compare( layerProperty, QStringLiteral( "title" ), Qt::CaseInsensitive ) == 0 )
4224-
return layer->title();
4225+
return !layer->metadata().title().isEmpty() ? layer->metadata().title() : layer->title();
42254226
else if ( QString::compare( layerProperty, QStringLiteral( "abstract" ), Qt::CaseInsensitive ) == 0 )
4226-
return layer->abstract();
4227+
return !layer->metadata().abstract().isEmpty() ? layer->metadata().abstract() : layer->abstract();
42274228
else if ( QString::compare( layerProperty, QStringLiteral( "keywords" ), Qt::CaseInsensitive ) == 0 )
4229+
{
4230+
QStringList keywords;
4231+
const QgsAbstractMetadataBase::KeywordMap keywordMap = layer->metadata().keywords();
4232+
for ( auto it = keywordMap.constBegin(); it != keywordMap.constEnd(); ++it )
4233+
{
4234+
keywords.append( it.value() );
4235+
}
4236+
if ( !keywords.isEmpty() )
4237+
return keywords;
42284238
return layer->keywordList();
4239+
}
42294240
else if ( QString::compare( layerProperty, QStringLiteral( "data_url" ), Qt::CaseInsensitive ) == 0 )
42304241
return layer->dataUrl();
42314242
else if ( QString::compare( layerProperty, QStringLiteral( "attribution" ), Qt::CaseInsensitive ) == 0 )
4232-
return layer->attribution();
4243+
{
4244+
return !layer->metadata().rights().isEmpty() ? QVariant( layer->metadata().rights() ) : QVariant( layer->attribution() );
4245+
}
42334246
else if ( QString::compare( layerProperty, QStringLiteral( "attribution_url" ), Qt::CaseInsensitive ) == 0 )
42344247
return layer->attributionUrl();
42354248
else if ( QString::compare( layerProperty, QStringLiteral( "source" ), Qt::CaseInsensitive ) == 0 )

‎tests/src/core/testqgsexpression.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class TestQgsExpression: public QObject
5757
private:
5858

5959
QgsVectorLayer *mPointsLayer = nullptr;
60+
QgsVectorLayer *mPointsLayerMetadata = nullptr;
6061
QgsVectorLayer *mMemoryLayer = nullptr;
6162
QgsVectorLayer *mAggregatesLayer = nullptr;
6263
QgsVectorLayer *mChildLayer = nullptr;
@@ -92,6 +93,25 @@ class TestQgsExpression: public QObject
9293
mPointsLayer->setMinimumScale( 500 );
9394
mPointsLayer->setMaximumScale( 1000 );
9495

96+
mPointsLayerMetadata = new QgsVectorLayer( pointFileInfo.filePath(),
97+
pointFileInfo.completeBaseName() + "_metadata", QStringLiteral( "ogr" ) );
98+
QgsProject::instance()->addMapLayer( mPointsLayerMetadata );
99+
QgsLayerMetadata metadata;
100+
metadata.setTitle( QStringLiteral( "metadata title" ) );
101+
metadata.setAbstract( QStringLiteral( "metadata abstract" ) );
102+
QMap<QString, QStringList> keywords;
103+
keywords.insert( QStringLiteral( "key1" ), QStringList() << QStringLiteral( "val1" ) << QStringLiteral( "val2" ) );
104+
keywords.insert( QStringLiteral( "key2" ), QStringList() << QStringLiteral( "val3" ) );
105+
metadata.setKeywords( keywords );
106+
metadata.setRights( QStringList() << QStringLiteral( "right1" ) << QStringLiteral( "right2" ) );
107+
mPointsLayerMetadata->setMetadata( metadata );
108+
mPointsLayerMetadata->setTitle( QStringLiteral( "layer title" ) );
109+
mPointsLayerMetadata->setAbstract( QStringLiteral( "layer abstract" ) );
110+
mPointsLayerMetadata->setKeywordList( QStringLiteral( "layer,keywords" ) );
111+
mPointsLayerMetadata->setDataUrl( QStringLiteral( "data url" ) );
112+
mPointsLayerMetadata->setAttribution( QStringLiteral( "layer attribution" ) );
113+
mPointsLayerMetadata->setAttributionUrl( QStringLiteral( "attribution url" ) );
114+
95115
QString rasterFileName = testDataDir + "tenbytenraster.asc";
96116
QFileInfo rasterFileInfo( rasterFileName );
97117
mRasterLayer = new QgsRasterLayer( rasterFileInfo.filePath(),
@@ -1288,6 +1308,11 @@ class TestQgsExpression: public QObject
12881308
QTest::newRow( "layer_property storage_type" ) << QStringLiteral( "layer_property('%1','storage_type')" ).arg( mPointsLayer->name() ) << false << QVariant( "ESRI Shapefile" );
12891309
QTest::newRow( "layer_property geometry_type" ) << QStringLiteral( "layer_property('%1','geometry_type')" ).arg( mPointsLayer->name() ) << false << QVariant( "Point" );
12901310

1311+
QTest::newRow( "layer_property title with metadata" ) << QStringLiteral( "layer_property('%1','title')" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "metadata title" );
1312+
QTest::newRow( "layer_property abstract with metadata" ) << QStringLiteral( "layer_property('%1','abstract')" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "metadata abstract" );
1313+
QTest::newRow( "layer_property keywords with metadata" ) << QStringLiteral( "array_to_string(layer_property('%1','keywords'),',')" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "val1,val2,val3" );
1314+
QTest::newRow( "layer_property attribution with metadata" ) << QStringLiteral( "array_to_string(layer_property('%1','attribution'))" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "right1,right2" );
1315+
12911316
QTest::newRow( "decode_uri shp path" ) << QStringLiteral( "array_last(string_to_array(replace(decode_uri('%1', 'path'), '\\\\', '/'), '/'))" ).arg( mPointsLayer->name() ) << false << QVariant( "points.shp" );
12921317

12931318
// raster_statistic tests

0 commit comments

Comments
 (0)
Please sign in to comment.