Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[mdal] Respect FastScan flag when querying sublayers
  • Loading branch information
nyalldawson committed Jul 23, 2021
1 parent 816bb43 commit c5163e9
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -1060,7 +1060,7 @@ QgsProviderMetadata::ProviderMetadataCapabilities QgsMdalProviderMetadata::capab
return QuerySublayers;
}

QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const QString &uri, Qgis::SublayerQueryFlags, QgsFeedback * ) const
QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags, QgsFeedback * ) const
{
if ( uri.isEmpty() )
return {};
Expand Down Expand Up @@ -1090,6 +1090,21 @@ QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const
return {};
}

if ( flags & Qgis::SublayerQueryFlag::FastScan )
{
if ( !info.isFile() )
return {};

QgsProviderSublayerDetails details;
details.setType( QgsMapLayerType::MeshLayer );
details.setProviderKey( QStringLiteral( "mdal" ) );
details.setUri( uri );
details.setName( QgsProviderUtils::suggestLayerNameFromFilePath( uri ) );
// treat all mesh files as potentially being containers (is this correct?)
details.setSkippedContainerScan( true );
return {details};
}

const QStringList meshNames = QString( MDAL_MeshNames( uri.toUtf8() ) ).split( QStringLiteral( ";;" ) );

QList<QgsProviderSublayerDetails> res;
Expand Down
35 changes: 35 additions & 0 deletions tests/src/core/testqgsmeshlayer.cpp
Expand Up @@ -96,6 +96,7 @@ class TestQgsMeshLayer : public QObject
void test_setDataSource();

void testMdalProviderQuerySublayers();
void testMdalProviderQuerySublayersFastScan();
};

QString TestQgsMeshLayer::readFile( const QString &fname ) const
Expand Down Expand Up @@ -1646,6 +1647,40 @@ void TestQgsMeshLayer::testMdalProviderQuerySublayers()
QVERIFY( ml->isValid() );
}

void TestQgsMeshLayer::testMdalProviderQuerySublayersFastScan()
{
// test querying sub layers for a mesh layer, using the fast scan flag
QgsProviderMetadata *mdalMetadata = QgsProviderRegistry::instance()->providerMetadata( QStringLiteral( "mdal" ) );

// invalid uri
QList< QgsProviderSublayerDetails >res = mdalMetadata->querySublayers( QString(), Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );

// not a mesh
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/lines.shp", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );

// single layer mesh
res = mdalMetadata->querySublayers( mDataDir + "/quad_and_triangle.2dm", Qgis::SublayerQueryFlag::FastScan );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "quad_and_triangle" ) );
QCOMPARE( res.at( 0 ).uri(), mDataDir + "/quad_and_triangle.2dm" );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QVERIFY( res.at( 0 ).skippedContainerScan() );

// mesh with two layers
res = mdalMetadata->querySublayers( mDataDir + "/manzese_1d2d_small_map.nc", Qgis::SublayerQueryFlag::FastScan );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "manzese_1d2d_small_map" ) );
QCOMPARE( res.at( 0 ).uri(), mDataDir + "/manzese_1d2d_small_map.nc" );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QVERIFY( res.at( 0 ).skippedContainerScan() );
}

void TestQgsMeshLayer::test_temporal()
{
qint64 relativeTime_0 = -1000;
Expand Down

0 comments on commit c5163e9

Please sign in to comment.