示例#1
0
    def testGettersSetters(self):
        """
        Test provider list
        """
        d = QgsProviderSublayerDetails()
        d.setProviderKey('key')
        self.assertEqual(d.providerKey(), 'key')

        d.setType(QgsMapLayerType.MeshLayer)
        self.assertEqual(d.type(), QgsMapLayerType.MeshLayer)

        d.setUri('some uri')
        self.assertEqual(d.uri(), 'some uri')

        d.setName('name')
        self.assertEqual(d.name(), 'name')

        d.setDescription('desc')
        self.assertEqual(d.description(), 'desc')

        d.setPath(['a', 'b', 'c'])
        self.assertEqual(d.path(), ['a', 'b', 'c'])

        self.assertEqual(d.featureCount(), Qgis.FeatureCountState.UnknownCount)
        d.setFeatureCount(1000)
        self.assertEqual(d.featureCount(), 1000)

        self.assertEqual(d.wkbType(), QgsWkbTypes.Unknown)
        d.setWkbType(QgsWkbTypes.Point)
        self.assertEqual(d.wkbType(), QgsWkbTypes.Point)

        d.setGeometryColumnName('geom_col')
        self.assertEqual(d.geometryColumnName(), 'geom_col')

        d.setLayerNumber(13)
        self.assertEqual(d.layerNumber(), 13)

        d.setDriverName('drv')
        self.assertEqual(d.driverName(), 'drv')

        d.setSkippedContainerScan(True)
        self.assertTrue(d.skippedContainerScan())
        d.setSkippedContainerScan(False)
        self.assertFalse(d.skippedContainerScan())

        d.setFlags(Qgis.SublayerFlag.SystemTable)
        self.assertEqual(d.flags(),
                         Qgis.SublayerFlags(Qgis.SublayerFlag.SystemTable))
        d.setFlags(Qgis.SublayerFlags())
        self.assertEqual(d.flags(), Qgis.SublayerFlags())
    def test_equality(self):
        """
        Test equality operator
        """
        d = QgsProviderSublayerDetails()
        d2 = QgsProviderSublayerDetails()
        d.setProviderKey('key')
        self.assertNotEqual(d, d2)
        d2.setProviderKey('key')
        self.assertEqual(d, d2)

        d.setType(QgsMapLayerType.MeshLayer)
        self.assertNotEqual(d, d2)
        d2.setType(QgsMapLayerType.MeshLayer)
        self.assertEqual(d, d2)

        d.setUri('some uri')
        self.assertNotEqual(d, d2)
        d2.setUri('some uri')
        self.assertEqual(d, d2)

        d.setName('name')
        self.assertNotEqual(d, d2)
        d2.setName('name')
        self.assertEqual(d, d2)

        d.setDescription('desc')
        self.assertNotEqual(d, d2)
        d2.setDescription('desc')
        self.assertEqual(d, d2)

        d.setPath(['a', 'b', 'c'])
        self.assertNotEqual(d, d2)
        d2.setPath(['a', 'b', 'c'])
        self.assertEqual(d, d2)

        d.setFeatureCount(1000)
        self.assertNotEqual(d, d2)
        d2.setFeatureCount(1000)
        self.assertEqual(d, d2)

        d.setWkbType(QgsWkbTypes.Point)
        self.assertNotEqual(d, d2)
        d2.setWkbType(QgsWkbTypes.Point)
        self.assertEqual(d, d2)

        d.setGeometryColumnName('geom_col')
        self.assertNotEqual(d, d2)
        d2.setGeometryColumnName('geom_col')
        self.assertEqual(d, d2)

        d.setLayerNumber(13)
        self.assertNotEqual(d, d2)
        d2.setLayerNumber(13)
        self.assertEqual(d, d2)

        d.setDriverName('drv')
        self.assertNotEqual(d, d2)
        d2.setDriverName('drv')
        self.assertEqual(d, d2)

        d.setSkippedContainerScan(True)
        self.assertNotEqual(d, d2)
        d2.setSkippedContainerScan(True)
        self.assertEqual(d, d2)
示例#3
0
    def test_sublayerDetailsAreIncomplete(self):
        """
        Test sublayerDetailsAreIncomplete
        """
        uri = unitTestDataPath() + '/mixed_types.TAB'

        # surface scan only
        sublayers = QgsProviderRegistry.instance().querySublayers(uri)
        self.assertEqual(len(sublayers), 1)
        self.assertEqual(sublayers[0].wkbType(), QgsWkbTypes.Unknown)

        # need to resolve geometry types for complete details about this uri!
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(sublayers))
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownGeometryType)))
        # ...unless we are ignoring both unknown feature count and unknown geometry types
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount | QgsProviderUtils.
                    SublayerCompletenessFlag.IgnoreUnknownGeometryType)))

        # fake feature count, now we have complete details if we ignore unknown geometry type
        sublayers[0].setFeatureCount(5)
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownGeometryType)))

        # retry with retrieving geometry types
        sublayers = QgsProviderRegistry.instance().querySublayers(
            uri, Qgis.SublayerQueryFlag.ResolveGeometryType)
        # now we have all the details
        self.assertEqual(len(sublayers), 3)
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(sublayers))
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownGeometryType)))

        # this geopackage file requires manually requesting feature counts
        uri = unitTestDataPath() + '/mixed_layers.gpkg'

        # surface scan only
        sublayers = QgsProviderRegistry.instance().querySublayers(uri)
        self.assertEqual(len(sublayers), 4)
        self.assertEqual(sublayers[0].name(), 'band1')
        self.assertEqual(sublayers[1].name(), 'band2')
        self.assertEqual(sublayers[2].name(), 'points')
        self.assertEqual(sublayers[2].featureCount(),
                         Qgis.FeatureCountState.Uncounted)
        self.assertEqual(sublayers[3].name(), 'lines')
        self.assertEqual(sublayers[3].featureCount(),
                         Qgis.FeatureCountState.Uncounted)

        # need to count features for complete details about this uri!
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(sublayers))
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownGeometryType)))
        # ...unless we are ignoring unknown feature counts, that is...
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))

        # retry with retrieving feature count
        sublayers = QgsProviderRegistry.instance().querySublayers(
            uri, Qgis.SublayerQueryFlag.CountFeatures)
        # now we have all the details
        self.assertEqual(len(sublayers), 4)
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                sublayers,
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownGeometryType)))
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(sublayers))
        self.assertEqual(sublayers[0].name(), 'band1')
        self.assertEqual(sublayers[1].name(), 'band2')
        self.assertEqual(sublayers[2].name(), 'points')
        self.assertEqual(sublayers[2].featureCount(), 0)
        self.assertEqual(sublayers[3].name(), 'lines')
        self.assertEqual(sublayers[3].featureCount(), 6)

        # test with sublayer with skippedContainerScan flag
        sl1 = QgsProviderSublayerDetails()
        sl1.setProviderKey('ogr')
        sl1.setType(QgsMapLayerType.VectorLayer)
        sl1.setWkbType(QgsWkbTypes.Point)
        sl1.setFeatureCount(1)
        sl1.setSkippedContainerScan(False)
        self.assertFalse(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                [sl1],
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))
        self.assertFalse(QgsProviderUtils.sublayerDetailsAreIncomplete([sl1]))
        sl2 = QgsProviderSublayerDetails()
        sl2.setProviderKey('ogr')
        sl2.setType(QgsMapLayerType.VectorLayer)
        sl2.setWkbType(QgsWkbTypes.Point)
        sl2.setFeatureCount(1)
        sl2.setSkippedContainerScan(True)
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                [sl2],
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))
        self.assertTrue(QgsProviderUtils.sublayerDetailsAreIncomplete([sl2]))
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete(
                [sl1, sl2],
                QgsProviderUtils.SublayerCompletenessFlags(
                    QgsProviderUtils.SublayerCompletenessFlag.
                    IgnoreUnknownFeatureCount)))
        self.assertTrue(
            QgsProviderUtils.sublayerDetailsAreIncomplete([sl1, sl2]))