Skip to content

Commit f0558c3

Browse files
committedFeb 20, 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') (cherry picked from commit 68b4602)
1 parent bad93ce commit f0558c3

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
@@ -3987,21 +3987,34 @@ static QVariant fcnGetLayerProperty( const QVariantList &values, const QgsExpres
39873987
if ( !layer )
39883988
return QVariant();
39893989

3990+
// here, we always prefer the layer metadata values over the older server-specific published values
39903991
QString layerProperty = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
39913992
if ( QString::compare( layerProperty, QStringLiteral( "name" ), Qt::CaseInsensitive ) == 0 )
39923993
return layer->name();
39933994
else if ( QString::compare( layerProperty, QStringLiteral( "id" ), Qt::CaseInsensitive ) == 0 )
39943995
return layer->id();
39953996
else if ( QString::compare( layerProperty, QStringLiteral( "title" ), Qt::CaseInsensitive ) == 0 )
3996-
return layer->title();
3997+
return !layer->metadata().title().isEmpty() ? layer->metadata().title() : layer->title();
39973998
else if ( QString::compare( layerProperty, QStringLiteral( "abstract" ), Qt::CaseInsensitive ) == 0 )
3998-
return layer->abstract();
3999+
return !layer->metadata().abstract().isEmpty() ? layer->metadata().abstract() : layer->abstract();
39994000
else if ( QString::compare( layerProperty, QStringLiteral( "keywords" ), Qt::CaseInsensitive ) == 0 )
4001+
{
4002+
QStringList keywords;
4003+
const QgsAbstractMetadataBase::KeywordMap keywordMap = layer->metadata().keywords();
4004+
for ( auto it = keywordMap.constBegin(); it != keywordMap.constEnd(); ++it )
4005+
{
4006+
keywords.append( it.value() );
4007+
}
4008+
if ( !keywords.isEmpty() )
4009+
return keywords;
40004010
return layer->keywordList();
4011+
}
40014012
else if ( QString::compare( layerProperty, QStringLiteral( "data_url" ), Qt::CaseInsensitive ) == 0 )
40024013
return layer->dataUrl();
40034014
else if ( QString::compare( layerProperty, QStringLiteral( "attribution" ), Qt::CaseInsensitive ) == 0 )
4004-
return layer->attribution();
4015+
{
4016+
return !layer->metadata().rights().isEmpty() ? QVariant( layer->metadata().rights() ) : QVariant( layer->attribution() );
4017+
}
40054018
else if ( QString::compare( layerProperty, QStringLiteral( "attribution_url" ), Qt::CaseInsensitive ) == 0 )
40064019
return layer->attributionUrl();
40074020
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
@@ -55,6 +55,7 @@ class TestQgsExpression: public QObject
5555
private:
5656

5757
QgsVectorLayer *mPointsLayer = nullptr;
58+
QgsVectorLayer *mPointsLayerMetadata = nullptr;
5859
QgsVectorLayer *mMemoryLayer = nullptr;
5960
QgsVectorLayer *mAggregatesLayer = nullptr;
6061
QgsVectorLayer *mChildLayer = nullptr;
@@ -90,6 +91,25 @@ class TestQgsExpression: public QObject
9091
mPointsLayer->setMinimumScale( 500 );
9192
mPointsLayer->setMaximumScale( 1000 );
9293

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

1286+
QTest::newRow( "layer_property title with metadata" ) << QStringLiteral( "layer_property('%1','title')" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "metadata title" );
1287+
QTest::newRow( "layer_property abstract with metadata" ) << QStringLiteral( "layer_property('%1','abstract')" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "metadata abstract" );
1288+
QTest::newRow( "layer_property keywords with metadata" ) << QStringLiteral( "array_to_string(layer_property('%1','keywords'),',')" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "val1,val2,val3" );
1289+
QTest::newRow( "layer_property attribution with metadata" ) << QStringLiteral( "array_to_string(layer_property('%1','attribution'))" ).arg( mPointsLayerMetadata->name() ) << false << QVariant( "right1,right2" );
1290+
12661291
// raster_statistic tests
12671292
QTest::newRow( "raster_statistic no layer" ) << "raster_statistic('',1,'min')" << false << QVariant();
12681293
QTest::newRow( "raster_statistic bad layer" ) << "raster_statistic('bad',1,'min')" << false << QVariant();

0 commit comments

Comments
 (0)
Please sign in to comment.