def test_geometry_conversion(self): query = QUrl.toPercentEncoding("select geomfromtext('multipoint((0 0),(1 1))') as geom") l = QgsVectorLayer("?query=%s&geometry=geom:multipoint:0" % query, "tt", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.geometry().exportToWkt().lower().startswith("multipoint"), True) self.assertEqual("),(" in f.geometry().exportToWkt(), True) # has two points query = QUrl.toPercentEncoding( "select geomfromtext('multipolygon(((0 0,1 0,1 1,0 1,0 0)),((0 1,1 1,1 2,0 2,0 1)))') as geom" ) l = QgsVectorLayer("?query=%s&geometry=geom:multipolygon:0" % query, "tt", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.geometry().exportToWkt().lower().startswith("multipolygon"), True) self.assertEqual(")),((" in f.geometry().exportToWkt(), True) # has two polygons query = QUrl.toPercentEncoding( "select geomfromtext('multilinestring((0 0,1 0,1 1,0 1,0 0),(0 1,1 1,1 2,0 2,0 1))') as geom" ) l = QgsVectorLayer("?query=%s&geometry=geom:multilinestring:0" % query, "tt", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.geometry().exportToWkt().lower().startswith("multilinestring"), True) self.assertEqual("),(" in f.geometry().exportToWkt(), True) # has two linestrings
def test_sql2(self): l2 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) query = QUrl.toPercentEncoding("SELECT * FROM france_parts") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual") self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().geometryType(), 3) self.assertEqual(l4.dataProvider().crs().postgisSrid(), 4326) n = 0 r = QgsFeatureRequest(QgsRectangle(-1.677, 49.624, -0.816, 49.086)) for f in l4.getFeatures(r): self.assertEqual(f.geometry() is not None, True) self.assertEqual(f.attributes()[0], 2661) n += 1 self.assertEqual(n, 1) # use uid query = QUrl.toPercentEncoding("SELECT * FROM france_parts") l5 = QgsVectorLayer( "?query=%s&geometry=geometry:polygon:4326&uid=ObjectId" % query, "tt", "virtual") self.assertEqual(l5.isValid(), True) idSum = sum(f.id() for f in l5.getFeatures()) self.assertEqual(idSum, 10659) r = QgsFeatureRequest(2661) idSum2 = sum(f.id() for f in l5.getFeatures(r)) self.assertEqual(idSum2, 2661) r = QgsFeatureRequest() r.setFilterFids([2661, 2664]) self.assertEqual(sum(f.id() for f in l5.getFeatures(r)), 2661 + 2664) # test attribute subset r = QgsFeatureRequest() r.setFlags(QgsFeatureRequest.SubsetOfAttributes) r.setSubsetOfAttributes([1]) s = [(f.id(), f.attributes()[1]) for f in l5.getFeatures(r)] self.assertEqual(sum(map(lambda x: x[0], s)), 10659) self.assertEqual(sum(map(lambda x: x[1], s)), 3064.0) # test NoGeometry # by request flag r = QgsFeatureRequest() r.setFlags(QgsFeatureRequest.NoGeometry) self.assertEqual( all([f.geometry() is None for f in l5.getFeatures(r)]), True) # test subset self.assertEqual(l5.dataProvider().featureCount(), 4) l5.setSubsetString("ObjectId = 2661") idSum2 = sum(f.id() for f in l5.getFeatures(r)) self.assertEqual(idSum2, 2661) self.assertEqual(l5.dataProvider().featureCount(), 1)
def test_rowid(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) query = QUrl.toPercentEncoding("select rowid as uid, * from vtab limit 1 offset 3") l = QgsVectorLayer("?layer=ogr:%s:vtab&query=%s" % (source, query), "vtab2", "virtual", False) # the last line must have a fixed rowid (not an autoincrement) for f in l.getFeatures(): lid = f.attributes()[0] self.assertEqual(lid, 3)
def test_filter_rect(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) query = QUrl.toPercentEncoding("select * from vtab where _search_frame_=BuildMbr(-2.10,49.38,-1.3,49.99,4326)") l2 = QgsVectorLayer("?layer=ogr:%s:vtab&query=%s&uid=objectid" % (source, query), "vtab2", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().featureCount(), 1) a = [fit.attributes()[4] for fit in l2.getFeatures()] self.assertEqual(a, [u"Basse-Normandie"])
def test_sql2(self): l2 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) query = QUrl.toPercentEncoding("SELECT * FROM france_parts") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual") self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().wkbType(), 3) self.assertEqual(l4.dataProvider().crs().postgisSrid(), 4326) n = 0 r = QgsFeatureRequest(QgsRectangle(-1.677, 49.624, -0.816, 49.086)) for f in l4.getFeatures(r): self.assertEqual(f.geometry() is not None, True) self.assertEqual(f.attributes()[0], 2661) n += 1 self.assertEqual(n, 1) # use uid query = QUrl.toPercentEncoding("SELECT * FROM france_parts") l5 = QgsVectorLayer("?query=%s&geometry=geometry:polygon:4326&uid=ObjectId" % query, "tt", "virtual") self.assertEqual(l5.isValid(), True) idSum = sum(f.id() for f in l5.getFeatures()) self.assertEqual(idSum, 10659) r = QgsFeatureRequest(2661) idSum2 = sum(f.id() for f in l5.getFeatures(r)) self.assertEqual(idSum2, 2661) r = QgsFeatureRequest() r.setFilterFids([2661, 2664]) self.assertEqual(sum(f.id() for f in l5.getFeatures(r)), 2661 + 2664) # test attribute subset r = QgsFeatureRequest() r.setFlags(QgsFeatureRequest.SubsetOfAttributes) r.setSubsetOfAttributes([1]) s = [(f.id(), f.attributes()[1]) for f in l5.getFeatures(r)] self.assertEqual(sum(map(lambda x: x[0], s)), 10659) self.assertEqual(sum(map(lambda x: x[1], s)), 3064.0) # test NoGeometry # by request flag r = QgsFeatureRequest() r.setFlags(QgsFeatureRequest.NoGeometry) self.assertEqual(all([not f.hasGeometry() for f in l5.getFeatures(r)]), True) # test subset self.assertEqual(l5.dataProvider().featureCount(), 4) l5.setSubsetString("ObjectId = 2661") idSum2 = sum(f.id() for f in l5.getFeatures(r)) self.assertEqual(idSum2, 2661) self.assertEqual(l5.dataProvider().featureCount(), 1)
def test_sql_field_types(self): query = QUrl.toPercentEncoding("SELECT 42 as t, 'ok'||'ok' as t2, GeomFromText('') as t3, 3.14*2 as t4") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "t") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.Int) self.assertEqual(l4.dataProvider().fields().at(1).name(), "t2") self.assertEqual(l4.dataProvider().fields().at(1).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(2).name(), "t3") self.assertEqual(l4.dataProvider().fields().at(2).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(3).name(), "t4") self.assertEqual(l4.dataProvider().fields().at(3).type(), QVariant.Double) # with type annotations query = QUrl.toPercentEncoding( "SELECT '42.0' as t /*:real*/, 3 as t2/*:text */, GeomFromText('') as t3 /*:multiPoInT:4326 */, 3.14*2 as t4/*:int*/" ) l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "t") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.Double) self.assertEqual(l4.dataProvider().fields().at(1).name(), "t2") self.assertEqual(l4.dataProvider().fields().at(1).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(2).name(), "t4") self.assertEqual(l4.dataProvider().fields().at(2).type(), QVariant.Int) self.assertEqual(l4.dataProvider().wkbType(), 4) # multipoint # test value types (!= from declared column types) for f in l4.getFeatures(): self.assertEqual(f.attributes()[0], "42.0") self.assertEqual(f.attributes()[1], 3) self.assertEqual(f.attributes()[2], 6.28) # with type annotations and url options query = QUrl.toPercentEncoding( "SELECT 1 as id /*:int*/, geomfromtext('point(0 0)',4326) as geometry/*:point:4326*/" ) l4 = QgsVectorLayer("?query=%s&geometry=geometry" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().wkbType(), 1) # point # with type annotations and url options (2) query = QUrl.toPercentEncoding( "SELECT 1 as id /*:int*/, 3.14 as f, geomfromtext('point(0 0)',4326) as geometry/*:point:4326*/" ) l4 = QgsVectorLayer("?query=%s&geometry=geometry&field=id:text" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "id") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(1).name(), "f") self.assertEqual(l4.dataProvider().fields().at(1).type(), QVariant.Double) self.assertEqual(l4.dataProvider().wkbType(), 1) # point
def test_reopen4(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) tmp = QUrl.fromLocalFile(os.path.join(tempfile.gettempdir(), "t.sqlite")).toString() query = QUrl.toPercentEncoding("SELECT * FROM vtab") l = QgsVectorLayer("%s?layer=ogr:%s:vtab&query=%s&uid=objectid&nogeometry" % (tmp, source, query), "vtab2", "virtual", False) self.assertEqual(l.isValid(), True) l2 = QgsVectorLayer(tmp, "tt", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 100) self.assertEqual(l2.dataProvider().featureCount(), 4) sumid = sum([f.id() for f in l2.getFeatures()]) self.assertEqual(sumid, 10659) suma = sum([f.attributes()[1] for f in l2.getFeatures()]) self.assertEqual(suma, 3064.0)
def test_Join(self): l1 = QgsVectorLayer(os.path.join(self.testDataDir, "points.shp"), "points", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) l2 = QgsVectorLayer( os.path.join(self.testDataDir, "points_relations.shp"), "points_relations", "ogr", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) ref_sum = sum(f.attributes()[1] for f in l2.getFeatures()) # use a temporary file query = QUrl.toPercentEncoding( "select id,Pilots,vtab1.geometry from vtab1,vtab2 where intersects(vtab1.geometry,vtab2.geometry)" ) l3 = QgsVectorLayer( "?layer_ref=%s&layer_ref=%s&uid=id&query=%s&geometry=geometry:1:4326" % (l1.id(), l2.id(), query), "vtab", "virtual", False) self.assertEqual(l3.isValid(), True) self.assertEqual(l3.dataProvider().geometryType(), 1) self.assertEqual(l3.dataProvider().fields().count(), 2) ref_sum2 = sum(f.id() for f in l3.getFeatures()) self.assertEqual(ref_sum, ref_sum2) QgsMapLayerRegistry.instance().removeMapLayer(l1) QgsMapLayerRegistry.instance().removeMapLayer(l2)
def test_embeddedLayer(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) l = QgsVectorLayer("?layer=ogr:%s" % source, "vtab", "virtual", False) self.assertEqual(l.isValid(), True) l = QgsVectorLayer("?layer=ogr:%s:nn" % source, "vtab", "virtual", False) self.assertEqual(l.isValid(), True)
def generate_oauth_header(url, conn_info): from PyQt5.QtNetworkAuth import QOAuth1, QOAuth1Signature auth_headers = dict( oauth_consumer_key=conn_info.get_("here_client_key", ""), oauth_nonce=bytes(QOAuth1.nonce()).decode("utf-8"), oauth_signature_method="HMAC-SHA1", oauth_timestamp=int(time.time()), oauth_version="1.0", ) signature = QOAuth1Signature( QUrl(url), conn_info.get_("here_client_secret"), "", QOAuth1Signature.HttpRequestMethod.Post, auth_headers, ) auth_headers["oauth_signature"] = bytes( QUrl.toPercentEncoding( bytes(signature.hmacSha1().toBase64()).decode("utf-8"))).decode( "utf-8") auth_header = "OAuth {}".format(",".join( '{}="{}"'.format(k, v) for k, v in auth_headers.items())).encode("utf-8") return auth_header
def test_sql3b(self): query = QUrl.toPercentEncoding("SELECT GeomFromText('POINT(0 0)') as geom") l4 = QgsVectorLayer("?query=%s&geometry=geom" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().geometryType(), 1) # forced geometry type query = QUrl.toPercentEncoding("SELECT GeomFromText('POINT(0 0)') as geom") l4 = QgsVectorLayer("?query=%s&geometry=geom:point:0" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().geometryType(), 1) query = QUrl.toPercentEncoding("SELECT CastToPoint(GeomFromText('POINT(0 0)')) as geom") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().geometryType(), 1)
def test_Join(self): l1 = QgsVectorLayer(os.path.join(self.testDataDir, "points.shp"), "points", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) l2 = QgsVectorLayer(os.path.join(self.testDataDir, "points_relations.shp"), "points_relations", "ogr", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) ref_sum = sum(f.attributes()[1] for f in l2.getFeatures()) # use a temporary file query = QUrl.toPercentEncoding( "select id,Pilots,vtab1.geometry from vtab1,vtab2 where intersects(vtab1.geometry,vtab2.geometry)" ) l3 = QgsVectorLayer( "?layer_ref=%s&layer_ref=%s&uid=id&query=%s&geometry=geometry:1:4326" % (l1.id(), l2.id(), query), "vtab", "virtual", False, ) self.assertEqual(l3.isValid(), True) self.assertEqual(l3.dataProvider().wkbType(), 1) self.assertEqual(l3.dataProvider().fields().count(), 2) ref_sum2 = sum(f.id() for f in l3.getFeatures()) self.assertEqual(ref_sum, ref_sum2) QgsMapLayerRegistry.instance().removeMapLayer(l1) QgsMapLayerRegistry.instance().removeMapLayer(l2)
def test_sql3b(self): query = QUrl.toPercentEncoding("SELECT GeomFromText('POINT(0 0)') as geom") l4 = QgsVectorLayer("?query=%s&geometry=geom" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().wkbType(), 1) # forced geometry type query = QUrl.toPercentEncoding("SELECT GeomFromText('POINT(0 0)') as geom") l4 = QgsVectorLayer("?query=%s&geometry=geom:point:0" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().wkbType(), 1) query = QUrl.toPercentEncoding("SELECT CastToPoint(GeomFromText('POINT(0 0)')) as geom") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().wkbType(), 1)
def test_sql_field_types(self): query = QUrl.toPercentEncoding("SELECT 42 as t, 'ok'||'ok' as t2, GeomFromText('') as t3, 3.14*2 as t4") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "t") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.Int) self.assertEqual(l4.dataProvider().fields().at(1).name(), "t2") self.assertEqual(l4.dataProvider().fields().at(1).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(2).name(), "t3") self.assertEqual(l4.dataProvider().fields().at(2).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(3).name(), "t4") self.assertEqual(l4.dataProvider().fields().at(3).type(), QVariant.Double) # with type annotations query = QUrl.toPercentEncoding("SELECT '42.0' as t /*:real*/, 3 as t2/*:text */, GeomFromText('') as t3 /*:multiPoInT:4326 */, 3.14*2 as t4/*:int*/") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "t") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.Double) self.assertEqual(l4.dataProvider().fields().at(1).name(), "t2") self.assertEqual(l4.dataProvider().fields().at(1).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(2).name(), "t4") self.assertEqual(l4.dataProvider().fields().at(2).type(), QVariant.Int) self.assertEqual(l4.dataProvider().geometryType(), 4) # multipoint # test value types (!= from declared column types) for f in l4.getFeatures(): self.assertEqual(f.attributes()[0], "42.0") self.assertEqual(f.attributes()[1], 3) self.assertEqual(f.attributes()[2], 6.28) # with type annotations and url options query = QUrl.toPercentEncoding("SELECT 1 as id /*:int*/, geomfromtext('point(0 0)',4326) as geometry/*:point:4326*/") l4 = QgsVectorLayer("?query=%s&geometry=geometry" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().geometryType(), 1) # point # with type annotations and url options (2) query = QUrl.toPercentEncoding("SELECT 1 as id /*:int*/, 3.14 as f, geomfromtext('point(0 0)',4326) as geometry/*:point:4326*/") l4 = QgsVectorLayer("?query=%s&geometry=geometry&field=id:text" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "id") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.String) self.assertEqual(l4.dataProvider().fields().at(1).name(), "f") self.assertEqual(l4.dataProvider().fields().at(1).type(), QVariant.Double) self.assertEqual(l4.dataProvider().geometryType(), 1) # point
def test_reopen2(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) tmp = QUrl.fromLocalFile(os.path.join(tempfile.gettempdir(), "t.sqlite")).toString() l = QgsVectorLayer("%s?layer=ogr:%s:vtab&nogeometry" % (tmp, source), "vtab2", "virtual", False) self.assertEqual(l.isValid(), True) l2 = QgsVectorLayer(tmp, "tt", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 100) self.assertEqual(l2.dataProvider().featureCount(), 4)
def test_sql4(self): l2 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) query = QUrl.toPercentEncoding("SELECT OBJECTId from france_parts") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) s = sum(f.attributes()[0] for f in l4.getFeatures()) self.assertEqual(s, 10659)
def test_recursiveLayer(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) l = QgsVectorLayer("?layer=ogr:%s" % source, "vtab", "virtual", False) self.assertEqual(l.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l) l2 = QgsVectorLayer("?layer_ref=" + l.id(), "vtab2", "virtual", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().removeMapLayer(l.id())
def test_QueryUrlEncoding(self): l1 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) query = str(QUrl.toPercentEncoding("SELECT * FROM vtab1")) l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=ObjectId&nogeometry" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().removeMapLayer(l1.id())
def test_reopen2(self): source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "france_parts.shp")) tmp = QUrl.fromLocalFile(os.path.join(tempfile.gettempdir(), "t.sqlite")).toString() l = QgsVectorLayer("%s?layer=ogr:%s:vtab&nogeometry" % (tmp, source), "vtab2", "virtual", False) self.assertEqual(l.isValid(), True) l2 = QgsVectorLayer(tmp, "tt", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().wkbType(), 100) self.assertEqual(l2.dataProvider().featureCount(), 4)
def test_DynamicGeometry(self): l1 = QgsVectorLayer(QUrl.fromLocalFile(os.path.join(self.testDataDir, "delimitedtext/testextpt.txt")).toString() + "?type=csv&delimiter=%7C&geomType=none&subsetIndex=no&watchFile=no", "test", "delimitedtext", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) query = QUrl.toPercentEncoding("select *,makepoint(x,y) as geom from vtab1") l2 = QgsVectorLayer("?layer_ref=%s&query=%s&geometry=geom:point:0&uid=id" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().removeMapLayer(l1)
def test_sql3(self): l2 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) # unnamed column query = QUrl.toPercentEncoding("SELECT count(*)") l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual", False) self.assertEqual(l4.isValid(), True) self.assertEqual(l4.dataProvider().fields().at(0).name(), "count(*)") self.assertEqual(l4.dataProvider().fields().at(0).type(), QVariant.Int)
def toSqlLayer(self, sql, geomCol, uniqueCol, layerName="QueryLayer", layerType=None, avoidSelectById=False, _filter=""): q = QUrl.toPercentEncoding(sql) s = "?query=%s" % q if uniqueCol is not None: s += "&uid=" + uniqueCol if geomCol is not None: s += "&geometry=" + geomCol vl = QgsVectorLayer(s, layerName, "virtual") if _filter: vl.setSubsetString(_filter) return vl
def test_ProjectDependencies(self): # make a virtual layer with living references and save it to a project l1 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) query = QUrl.toPercentEncoding("SELECT * FROM france_parts") l2 = QgsVectorLayer("?query=%s" % query, "aa", "virtual", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) self.assertEqual(len(l2.layerDependencies()), 1) self.assertEqual(l2.layerDependencies()[0].startswith('france_parts'), True) query = QUrl.toPercentEncoding( "SELECT t1.objectid, t2.name_0 FROM france_parts as t1, aa as t2") l3 = QgsVectorLayer("?query=%s" % query, "bb", "virtual", False) self.assertEqual(l3.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l3) self.assertEqual(len(l2.layerDependencies()), 1) self.assertEqual(l2.layerDependencies()[0].startswith('france_parts'), True) self.assertEqual(len(l3.layerDependencies()), 2) temp = os.path.join(tempfile.gettempdir(), "qgstestproject.qgs") QgsProject.instance().setFileName(temp) QgsProject.instance().write() QgsMapLayerRegistry.instance().removeMapLayers([l1, l2]) QgsProject.instance().clear() QgsProject.instance().setFileName(temp) QgsProject.instance().read() # make sure the 3 layers are loaded back self.assertEqual(len(QgsMapLayerRegistry.instance().mapLayers()), 3)
def test_geometry_conversion(self): query = QUrl.toPercentEncoding("select geomfromtext('multipoint((0 0),(1 1))') as geom") l = QgsVectorLayer("?query=%s&geometry=geom:multipoint:0" % query, "tt", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.geometry().exportToWkt().lower().startswith("multipoint"), True) self.assertEqual("),(" in f.geometry().exportToWkt(), True) # has two points query = QUrl.toPercentEncoding("select geomfromtext('multipolygon(((0 0,1 0,1 1,0 1,0 0)),((0 1,1 1,1 2,0 2,0 1)))') as geom") l = QgsVectorLayer("?query=%s&geometry=geom:multipolygon:0" % query, "tt", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.geometry().exportToWkt().lower().startswith("multipolygon"), True) self.assertEqual(")),((" in f.geometry().exportToWkt(), True) # has two polygons query = QUrl.toPercentEncoding("select geomfromtext('multilinestring((0 0,1 0,1 1,0 1,0 0),(0 1,1 1,1 2,0 2,0 1))') as geom") l = QgsVectorLayer("?query=%s&geometry=geom:multilinestring:0" % query, "tt", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.geometry().exportToWkt().lower().startswith("multilinestring"), True) self.assertEqual("),(" in f.geometry().exportToWkt(), True) # has two linestrings
def test_refLayers(self): l1 = QgsVectorLayer(QUrl.fromLocalFile(os.path.join(self.testDataDir, "delimitedtext/test.csv")).toString() + "?type=csv&geomType=none&subsetIndex=no&watchFile=no", "test", "delimitedtext", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) # cf qgis bug #12266 for i in range(10): q = QUrl.toPercentEncoding("select * from t" + str(i)) l2 = QgsVectorLayer("?layer_ref=%s:t%d&query=%s&uid=id" % (l1.id(), i, q), "vtab", "virtual", False) QgsMapLayerRegistry.instance().addMapLayer(l2) self.assertEqual(l2.isValid(), True) s = sum([f.id() for f in l2.dataProvider().getFeatures()]) # NOQA self.assertEqual(sum([f.id() for f in l2.getFeatures()]), 21) QgsMapLayerRegistry.instance().removeMapLayer(l2.id())
def test_encoding(self): # changes encoding on a shapefile (the only provider supporting setEncoding) source = QUrl.toPercentEncoding(os.path.join(self.testDataDir, "shp_latin1.dbf")) l = QgsVectorLayer("?layer=ogr:%s:fp:latin1" % source, "vtab", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.attributes()[1], u"accents éàè") # use UTF-8 now l = QgsVectorLayer("?layer=ogr:%s:fp:UTF-8" % source, "vtab", "virtual", False) self.assertEqual(l.isValid(), True) for f in l.getFeatures(): self.assertEqual(f.attributes()[1], u"accents \ufffd\ufffd\ufffd") # invalid unicode characters
def test_ProjectDependencies(self): # make a virtual layer with living references and save it to a project l1 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) query = QUrl.toPercentEncoding("SELECT * FROM france_parts") l2 = QgsVectorLayer("?query=%s" % query, "aa", "virtual", False) self.assertEqual(l2.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l2) self.assertEqual(len(l2.layerDependencies()), 1) self.assertEqual(l2.layerDependencies()[0].startswith("france_parts"), True) query = QUrl.toPercentEncoding("SELECT t1.objectid, t2.name_0 FROM france_parts as t1, aa as t2") l3 = QgsVectorLayer("?query=%s" % query, "bb", "virtual", False) self.assertEqual(l3.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l3) self.assertEqual(len(l2.layerDependencies()), 1) self.assertEqual(l2.layerDependencies()[0].startswith("france_parts"), True) self.assertEqual(len(l3.layerDependencies()), 2) temp = os.path.join(tempfile.gettempdir(), "qgstestproject.qgs") QgsProject.instance().setFileName(temp) QgsProject.instance().write() QgsMapLayerRegistry.instance().removeMapLayers([l1, l2]) QgsProject.instance().clear() QgsProject.instance().setFileName(temp) QgsProject.instance().read() # make sure the 3 layers are loaded back self.assertEqual(len(QgsMapLayerRegistry.instance().mapLayers()), 3)
def _get_cursor_columns(self, c): tf = QTemporaryFile() tf.open() tmp = tf.fileName() tf.close() q = QUrl.toPercentEncoding(c.sql) p = QgsVectorLayer("%s?query=%s" % (QUrl.fromLocalFile(tmp).toString(), q), "vv", "virtual") if not p.isValid(): return [] f = [f.name() for f in p.fields()] if p.geometryType() != Qgis.WKBNoGeometry: gn = getQueryGeometryName(tmp) if gn: f += [gn] return f
def _get_cursor_columns(self, c): tf = QTemporaryFile() tf.open() tmp = tf.fileName() tf.close() q = QUrl.toPercentEncoding(c.sql) p = QgsVectorLayer( "%s?query=%s" % (QUrl.fromLocalFile(tmp).toString(), q), "vv", "virtual") if not p.isValid(): return [] f = [f.name() for f in p.fields()] if p.geometryType() != QgsWkbTypes.NullGeometry: gn = getQueryGeometryName(tmp) if gn: f += [gn] return f
def __init__(self, db, sql, parent=None): # create a virtual layer with non-geometry results q = QUrl.toPercentEncoding(sql) t = QTime() t.start() tf = QTemporaryFile() tf.open() tmp = tf.fileName() tf.close() p = QgsVectorLayer( "%s?query=%s" % (QUrl.fromLocalFile(tmp).toString(), q), "vv", "virtual") self._secs = t.elapsed() / 1000.0 if not p.isValid(): data = [] header = [] raise DbError(p.dataProvider().error().summary(), sql) else: header = [f.name() for f in p.fields()] has_geometry = False if p.geometryType() != QgsWkbTypes.NullGeometry: gn = getQueryGeometryName(tmp) if gn: has_geometry = True header += [gn] data = [] for f in p.getFeatures(): a = f.attributes() if has_geometry: if f.hasGeometry(): a += [f.geometry().exportToWkt()] else: a += [None] data += [a] self._secs = 0 self._affectedRows = len(data) BaseTableModel.__init__(self, header, data, parent)
def __init__(self, db, sql, parent=None): # create a virtual layer with non-geometry results q = QUrl.toPercentEncoding(sql) t = QTime() t.start() tf = QTemporaryFile() tf.open() tmp = tf.fileName() tf.close() p = QgsVectorLayer("%s?query=%s" % (QUrl.fromLocalFile(tmp).toString(), q), "vv", "virtual") self._secs = t.elapsed() / 1000.0 if not p.isValid(): data = [] header = [] raise DbError(p.dataProvider().error().summary(), sql) else: header = [f.name() for f in p.fields()] has_geometry = False if p.geometryType() != QGis.WKBNoGeometry: gn = getQueryGeometryName(tmp) if gn: has_geometry = True header += [gn] data = [] for f in p.getFeatures(): a = f.attributes() if has_geometry: if f.geometry(): a += [f.geometry().exportToWkt()] else: a += [None] data += [a] self._secs = 0 self._affectedRows = len(data) BaseTableModel.__init__(self, header, data, parent)
def toPercent(s): return bytes(QUrl.toPercentEncoding(s)).decode()
def test_Query(self): l1 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) ref_sum = sum(f.attributes()[0] for f in l1.getFeatures()) query = QUrl.toPercentEncoding("SELECT * FROM vtab1") l2 = QgsVectorLayer( "?layer_ref=%s&geometry=geometry:3:4326&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False ) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().wkbType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # the same, without specifying the geometry column name l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().wkbType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # with two geometry columns query = QUrl.toPercentEncoding("SELECT *,geometry as geom FROM vtab1") l2 = QgsVectorLayer( "?layer_ref=%s&query=%s&uid=OBJECTID&geometry=geom:3:4326" % (l1.id(), query), "vtab", "virtual", False ) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().wkbType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # with two geometry columns, but no geometry column specified (will take the first) l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().wkbType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # the same, without geometry query = QUrl.toPercentEncoding("SELECT * FROM ww") l2 = QgsVectorLayer( "?layer_ref=%s:ww&query=%s&uid=ObJeCtId&nogeometry" % (l1.id(), query), "vtab", "virtual", False ) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().wkbType(), 100) # NoGeometry ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) self.assertEqual(ref_sum, ref_sum2) self.assertEqual(ref_sum, ref_sum3) # check that it fails when a query has a wrong geometry column l2 = QgsVectorLayer("?layer_ref=%s&query=%s&geometry=geo" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), False) QgsMapLayerRegistry.instance().removeMapLayer(l1.id())
def test_Query(self): l1 = QgsVectorLayer(os.path.join(self.testDataDir, "france_parts.shp"), "france_parts", "ogr", False) self.assertEqual(l1.isValid(), True) QgsMapLayerRegistry.instance().addMapLayer(l1) ref_sum = sum(f.attributes()[0] for f in l1.getFeatures()) query = QUrl.toPercentEncoding("SELECT * FROM vtab1") l2 = QgsVectorLayer("?layer_ref=%s&geometry=geometry:3:4326&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # the same, without specifying the geometry column name l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # with two geometry columns query = QUrl.toPercentEncoding("SELECT *,geometry as geom FROM vtab1") l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID&geometry=geom:3:4326" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # with two geometry columns, but no geometry column specified (will take the first) l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 3) ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) # check we have the same rows self.assertEqual(ref_sum, ref_sum2) # check the id is ok self.assertEqual(ref_sum, ref_sum3) # the same, without geometry query = QUrl.toPercentEncoding("SELECT * FROM ww") l2 = QgsVectorLayer("?layer_ref=%s:ww&query=%s&uid=ObJeCtId&nogeometry" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), True) self.assertEqual(l2.dataProvider().geometryType(), 100) # NoGeometry ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures()) ref_sum3 = sum(f.id() for f in l2.getFeatures()) self.assertEqual(ref_sum, ref_sum2) self.assertEqual(ref_sum, ref_sum3) # check that it fails when a query has a wrong geometry column l2 = QgsVectorLayer("?layer_ref=%s&query=%s&geometry=geo" % (l1.id(), query), "vtab", "virtual", False) self.assertEqual(l2.isValid(), False) QgsMapLayerRegistry.instance().removeMapLayer(l1.id())