Skip to content

Commit ba2e9df

Browse files
author
Hugo Mercier
committed
Add layer dependencies for virtual layers
1 parent 020dac0 commit ba2e9df

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

src/providers/virtual/qgsvirtuallayerprovider.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,17 @@ QgsAttributeList QgsVirtualLayerProvider::pkAttributeIndexes()
600600
return QgsAttributeList();
601601
}
602602

603+
QSet<QString> QgsVirtualLayerProvider::layerDependencies() const
604+
{
605+
QSet<QString> deps;
606+
foreach ( const QgsVirtualLayerDefinition::SourceLayer& l, mDefinition.sourceLayers() )
607+
{
608+
if ( l.isReferenced() )
609+
deps << l.reference();
610+
}
611+
return deps;
612+
}
613+
603614
/**
604615
* Class factory to return a pointer to a newly created
605616
* QgsSpatiaLiteProvider object

src/providers/virtual/qgsvirtuallayerprovider.h

+3
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ class QgsVirtualLayerProvider: public QgsVectorDataProvider
8989
/** Return list of indexes of fields that make up the primary key */
9090
QgsAttributeList pkAttributeIndexes() override;
9191

92+
/** Get the list of layer ids on which this layer depends */
93+
QSet<QString> layerDependencies() const override;
94+
9295
private:
9396

9497
// file on disk

tests/src/python/test_provider_virtual.py

+39
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
QgsProviderRegistry,
3131
QgsVirtualLayerDefinition,
3232
QgsWKBTypes
33+
QgsProject
3334
)
3435

3536
from utilities import (unitTestDataPath,
@@ -664,5 +665,43 @@ def test_queryOnMemoryLayer(self):
664665
ml.addFeatures([f3])
665666
self.assertEqual(ml.featureCount(), vl.featureCount())
666667

668+
def test_ProjectDependencies(self):
669+
# make a virtual layer with living references and save it to a project
670+
l1 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False)
671+
self.assertEqual(l1.isValid(), True)
672+
QgsMapLayerRegistry.instance().addMapLayer(l1)
673+
674+
query = QUrl.toPercentEncoding("SELECT * FROM france_parts")
675+
l2 = QgsVectorLayer("?query=%s" % query, "aa", "virtual", False)
676+
self.assertEqual(l2.isValid(), True)
677+
QgsMapLayerRegistry.instance().addMapLayer(l2)
678+
679+
self.assertEqual(len(l2.layerDependencies()), 1)
680+
self.assertEqual(l2.layerDependencies()[0].startswith('france_parts'), True)
681+
682+
query = QUrl.toPercentEncoding("SELECT t1.objectid, t2.name_0 FROM france_parts as t1, aa as t2")
683+
l3 = QgsVectorLayer("?query=%s" % query, "bb", "virtual", False)
684+
self.assertEqual(l3.isValid(), True)
685+
QgsMapLayerRegistry.instance().addMapLayer(l3)
686+
687+
self.assertEqual(len(l2.layerDependencies()), 1)
688+
self.assertEqual(l2.layerDependencies()[0].startswith('france_parts'), True)
689+
690+
self.assertEqual(len(l3.layerDependencies()), 2)
691+
692+
temp = os.path.join(tempfile.gettempdir(), "qgstestproject.qgs")
693+
694+
QgsProject.instance().setFileName(temp)
695+
QgsProject.instance().write()
696+
697+
QgsMapLayerRegistry.instance().removeMapLayers([l1, l2])
698+
QgsProject.instance().clear()
699+
700+
QgsProject.instance().setFileName(temp)
701+
QgsProject.instance().read()
702+
703+
# make sure the 3 layers are loaded back
704+
self.assertEqual(len(QgsMapLayerRegistry.instance().mapLayers()), 3)
705+
667706
if __name__ == '__main__':
668707
unittest.main()

0 commit comments

Comments
 (0)