Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[mdal] Correctly parse uris with specific layer names in
encode/decodeUri
  • Loading branch information
nyalldawson committed Jul 26, 2021
1 parent 2834bfa commit 215d08f
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
28 changes: 24 additions & 4 deletions src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -1030,16 +1030,36 @@ bool QgsMdalProviderMetadata::createMeshData( const QgsMesh &mesh, const QString

QVariantMap QgsMdalProviderMetadata::decodeUri( const QString &uri ) const
{
const QString path = uri;
QVariantMap uriComponents;
uriComponents.insert( QStringLiteral( "path" ), path );

const QRegularExpression layerRegex( QStringLiteral( "^([a-zA-Z0-9]+?):\"(.*)\":([a-zA-Z0-9]+?)$" ) );
const QRegularExpressionMatch layerNameMatch = layerRegex.match( uri );
if ( layerNameMatch.hasMatch() )
{
uriComponents.insert( QStringLiteral( "driver" ), layerNameMatch.captured( 1 ) );
uriComponents.insert( QStringLiteral( "path" ), layerNameMatch.captured( 2 ) );
uriComponents.insert( QStringLiteral( "layerName" ), layerNameMatch.captured( 3 ) );
}
else
{
uriComponents.insert( QStringLiteral( "path" ), uri );
}

return uriComponents;
}

QString QgsMdalProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
const QString path = parts.value( QStringLiteral( "path" ) ).toString();
return path;
if ( !parts.value( QStringLiteral( "layerName" ) ).toString().isEmpty() )
{
return QStringLiteral( "%1:\"%2\":%3" ).arg( parts.value( QStringLiteral( "driver" ) ).toString(),
parts.value( QStringLiteral( "path" ) ).toString(),
parts.value( QStringLiteral( "layerName" ) ).toString() );
}
else
{
return parts.value( QStringLiteral( "path" ) ).toString();
}
}

QgsProviderMetadata::ProviderCapabilities QgsMdalProviderMetadata::providerCapabilities() const
Expand Down
19 changes: 19 additions & 0 deletions tests/src/providers/testqgsmdalprovider.cpp
Expand Up @@ -45,6 +45,7 @@ class TestQgsMdalProvider : public QObject

void load();
void filters();
void encodeDecodeUri();

private:
QString mTestDataDir;
Expand Down Expand Up @@ -85,6 +86,24 @@ void TestQgsMdalProvider::filters()
QVERIFY( datasetFilters.contains( "*.dat" ) );
}

void TestQgsMdalProvider::encodeDecodeUri()
{
QgsProviderMetadata *mdalMetadata = QgsProviderRegistry::instance()->providerMetadata( QStringLiteral( "mdal" ) );

// simple file uri
QVariantMap parts = mdalMetadata->decodeUri( QStringLiteral( "/home/data/test.nc" ) );
QCOMPARE( parts.value( QStringLiteral( "path" ) ).toString(), QStringLiteral( "/home/data/test.nc" ) );
QCOMPARE( parts.value( QStringLiteral( "driver" ) ).toString(), QString() );
QCOMPARE( parts.value( QStringLiteral( "layerName" ) ).toString(), QString() );
QCOMPARE( mdalMetadata->encodeUri( parts ), QStringLiteral( "/home/data/test.nc" ) );

// uri with layer name
parts = mdalMetadata->decodeUri( QStringLiteral( "netcdf:\"/home/data/test.nc\":layer3" ) );
QCOMPARE( parts.value( QStringLiteral( "path" ) ).toString(), QStringLiteral( "/home/data/test.nc" ) );
QCOMPARE( parts.value( QStringLiteral( "driver" ) ).toString(), QStringLiteral( "netcdf" ) );
QCOMPARE( parts.value( QStringLiteral( "layerName" ) ).toString(), QStringLiteral( "layer3" ) );
QCOMPARE( mdalMetadata->encodeUri( parts ), QStringLiteral( "netcdf:\"/home/data/test.nc\":layer3" ) );
}

void TestQgsMdalProvider::load()
{
Expand Down

0 comments on commit 215d08f

Please sign in to comment.