Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Populate sublayer driver name for OGR layers
  • Loading branch information
nyalldawson committed Jul 23, 2021
1 parent 6c2d7bd commit 4a7692c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/core/providers/ogr/qgsogrproviderutils.cpp
Expand Up @@ -2394,6 +2394,7 @@ QList< QgsProviderSublayerDetails > QgsOgrProviderUtils::querySubLayerList( int
details.setGeometryColumnName( geometryColumnName );
details.setDescription( longDescription );
details.setProviderKey( QStringLiteral( "ogr" ) );
details.setDriverName( driverName );

const QString uri = QgsOgrProviderMetadata().encodeUri( parts );
details.setUri( uri );
Expand Down Expand Up @@ -2483,6 +2484,7 @@ QList< QgsProviderSublayerDetails > QgsOgrProviderUtils::querySubLayerList( int
details.setGeometryColumnName( geometryColumnName );
details.setDescription( longDescription );
details.setProviderKey( QStringLiteral( "ogr" ) );
details.setDriverName( driverName );

if ( fCount.size() > 1 )
parts.insert( QStringLiteral( "geometryType" ), ogrWkbGeometryTypeName( countIt.key() ) );
Expand Down
29 changes: 29 additions & 0 deletions tests/src/python/test_provider_ogr.py
Expand Up @@ -1529,6 +1529,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.LineString)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'ESRI Shapefile')

# zip file layer vector
res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, 'zip', 'points2.zip'))
Expand All @@ -1541,6 +1542,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'ESRI Shapefile')
options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext())
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
Expand All @@ -1557,6 +1559,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'GeoJSON')
options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext())
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
Expand All @@ -1569,6 +1572,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[1].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[1].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[1].geometryColumnName(), '')
self.assertEqual(res[1].driverName(), 'ESRI Shapefile')
options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext())
vl = res[1].toLayer(options)
self.assertTrue(vl.isValid())
Expand All @@ -1585,6 +1589,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'GeoJSON')
options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext())
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
Expand All @@ -1601,6 +1606,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'ESRI Shapefile')
options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext())
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
Expand All @@ -1618,6 +1624,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'ESRI Shapefile')
options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext())
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
Expand All @@ -1635,6 +1642,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Unknown)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'ESRI Shapefile')

# retry with retrieving geometry types
res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, 'multipatch.shp'), Qgis.SublayerQueryFlag.ResolveGeometryType)
Expand All @@ -1647,6 +1655,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Polygon)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'ESRI Shapefile')

# single layer geopackage -- sublayers MUST have the layerName set on the uri,
# in case more layers are added in future to the gpkg
Expand All @@ -1660,6 +1669,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.CurvePolygon)
self.assertEqual(res[0].geometryColumnName(), 'geometry')
self.assertEqual(res[0].driverName(), 'GPKG')

# make sure result is valid to load layer from
vl = res[0].toLayer(options)
Expand All @@ -1677,6 +1687,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), 'geometry')
self.assertEqual(res[0].driverName(), 'GPKG')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
Expand All @@ -1690,6 +1701,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[1].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[1].wkbType(), QgsWkbTypes.MultiLineString)
self.assertEqual(res[1].geometryColumnName(), 'geom')
self.assertEqual(res[1].driverName(), 'GPKG')
vl = res[1].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.MultiLineString)
Expand All @@ -1703,6 +1715,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[1].name(), "lines")
self.assertEqual(res[1].featureCount(), 6)
self.assertEqual(res[1].geometryColumnName(), 'geom')
self.assertEqual(res[1].driverName(), 'GPKG')

# geopackage with two layers, but specific layer is requested in uri
res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_layers.gpkg") + '|layerid=0')
Expand All @@ -1716,6 +1729,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), 'geometry')
self.assertEqual(res[0].driverName(), 'GPKG')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
Expand All @@ -1731,6 +1745,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.MultiLineString)
self.assertEqual(res[0].geometryColumnName(), 'geom')
self.assertEqual(res[0].driverName(), 'GPKG')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.MultiLineString)
Expand All @@ -1746,6 +1761,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), 'geometry')
self.assertEqual(res[0].driverName(), 'GPKG')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
Expand All @@ -1761,6 +1777,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.MultiLineString)
self.assertEqual(res[0].geometryColumnName(), 'geom')
self.assertEqual(res[0].driverName(), 'GPKG')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.MultiLineString)
Expand All @@ -1777,6 +1794,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Unknown)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'MapInfo File')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())

Expand All @@ -1792,6 +1810,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), 13)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Unknown)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'MapInfo File')

# layer with mixed geometry types - resolve geometry type (for OGR provider this implies also that we count features!)
res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_types.TAB"), Qgis.SublayerQueryFlag.ResolveGeometryType)
Expand All @@ -1805,6 +1824,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[0].featureCount(), 4)
self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point)
self.assertEqual(res[0].geometryColumnName(), '')
self.assertEqual(res[0].driverName(), 'MapInfo File')
vl = res[0].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
Expand All @@ -1818,6 +1838,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[1].featureCount(), 4)
self.assertEqual(res[1].wkbType(), QgsWkbTypes.LineString)
self.assertEqual(res[1].geometryColumnName(), '')
self.assertEqual(res[1].driverName(), 'MapInfo File')
vl = res[1].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.LineString)
Expand All @@ -1831,6 +1852,7 @@ def test_provider_sublayer_details(self):
self.assertEqual(res[2].featureCount(), 3)
self.assertEqual(res[2].wkbType(), QgsWkbTypes.Polygon)
self.assertEqual(res[2].geometryColumnName(), '')
self.assertEqual(res[2].driverName(), 'MapInfo File')
vl = res[2].toLayer(options)
self.assertTrue(vl.isValid())
self.assertEqual(vl.wkbType(), QgsWkbTypes.Polygon)
Expand All @@ -1842,42 +1864,49 @@ def test_provider_sublayer_details(self):
'uri': r.uri(),
'providerKey': r.providerKey(),
'wkbType': r.wkbType(),
'driverName': r.driverName(),
'geomColName': r.geometryColumnName()} for r in res],
[{'name': 'somedata',
'description': '',
'uri': '{}/provider/spatialite.db|layername=somedata'.format(TEST_DATA_DIR),
'providerKey': 'ogr',
'wkbType': 1,
'driverName': 'SQLite',
'geomColName': 'geom'},
{'name': 'somepolydata',
'description': '',
'uri': '{}/provider/spatialite.db|layername=somepolydata'.format(TEST_DATA_DIR),
'providerKey': 'ogr',
'wkbType': 6,
'driverName': 'SQLite',
'geomColName': 'geom'},
{'name': 'some data',
'description': '',
'uri': '{}/provider/spatialite.db|layername=some data'.format(TEST_DATA_DIR),
'providerKey': 'ogr',
'wkbType': 1,
'driverName': 'SQLite',
'geomColName': 'geom'},
{'name': 'validator_project_test',
'description': '',
'uri': '{}/provider/spatialite.db|layername=validator_project_test'.format(TEST_DATA_DIR),
'providerKey': 'ogr',
'wkbType': 1,
'driverName': 'SQLite',
'geomColName': 'geom'},
{'name': 'data_licenses',
'description': '',
'uri': '{}/provider/spatialite.db|layername=data_licenses'.format(TEST_DATA_DIR),
'providerKey': 'ogr',
'wkbType': 100,
'driverName': 'SQLite',
'geomColName': ''},
{'name': 'some view',
'description': '',
'uri': '{}/provider/spatialite.db|layername=some view'.format(TEST_DATA_DIR),
'providerKey': 'ogr',
'wkbType': 100,
'driverName': 'SQLite',
'geomColName': ''}])


Expand Down

0 comments on commit 4a7692c

Please sign in to comment.