|
22 | 22 | QgsMapLayerRegistry,
|
23 | 23 | QgsRectangle,
|
24 | 24 | QgsVirtualLayerDefinition,
|
| 25 | + QgsVirtualLayerDefinitionUtils, |
25 | 26 | QgsWKBTypes,
|
26 |
| - QgsProject |
| 27 | + QgsProject, |
| 28 | + QgsVectorJoinInfo |
27 | 29 | )
|
28 | 30 |
|
29 | 31 | from qgis.testing import start_app, unittest
|
@@ -731,6 +733,59 @@ def test_query_with_accents(self):
|
731 | 733 | ids = [f.id() for f in vl2.getFeatures()]
|
732 | 734 | self.assertEqual(ids, [])
|
733 | 735 |
|
| 736 | + def test_joined_layers_conversion(self): |
| 737 | + v1 = QgsVectorLayer("Point?field=id:integer&field=b_id:integer&field=c_id:integer&field=name:string", "A", "memory") |
| 738 | + self.assertEqual(v1.isValid(), True) |
| 739 | + v2 = QgsVectorLayer("Point?field=id:integer&field=bname:string&field=bfield:integer", "B", "memory") |
| 740 | + self.assertEqual(v2.isValid(), True) |
| 741 | + v3 = QgsVectorLayer("Point?field=id:integer&field=cname:string", "C", "memory") |
| 742 | + self.assertEqual(v3.isValid(), True) |
| 743 | + QgsMapLayerRegistry.instance().addMapLayers([v1, v2, v3]) |
| 744 | + joinInfo = QgsVectorJoinInfo() |
| 745 | + joinInfo.targetFieldName = "b_id" |
| 746 | + joinInfo.joinLayerId = v2.id() |
| 747 | + joinInfo.joinFieldName = "id" |
| 748 | + #joinInfo.prefix = "B_"; |
| 749 | + v1.addJoin(joinInfo) |
| 750 | + self.assertEqual(len(v1.fields()), 6) |
| 751 | + |
| 752 | + df = QgsVirtualLayerDefinitionUtils.fromJoinedLayer(v1) |
| 753 | + self.assertEqual(df.query(), 'SELECT t.rowid AS uid, t.id, t.b_id, t.c_id, t.name, j1.bname AS B_bname, j1.bfield AS B_bfield FROM {} AS t LEFT JOIN {} AS j1 ON t."b_id"=j1."id"'.format(v1.id(), v2.id())) |
| 754 | + |
| 755 | + # with a field subset |
| 756 | + v1.removeJoin(v2.id()) |
| 757 | + joinInfo.setJoinFieldNamesSubset(["bname"]) |
| 758 | + v1.addJoin(joinInfo) |
| 759 | + self.assertEqual(len(v1.fields()), 5) |
| 760 | + df = QgsVirtualLayerDefinitionUtils.fromJoinedLayer(v1) |
| 761 | + self.assertEqual(df.query(), 'SELECT t.rowid AS uid, t.id, t.b_id, t.c_id, t.name, j1.bname AS B_bname FROM {} AS t LEFT JOIN {} AS j1 ON t."b_id"=j1."id"'.format(v1.id(), v2.id())) |
| 762 | + joinInfo.setJoinFieldNamesSubset(None) |
| 763 | + |
| 764 | + # add a table prefix to the join |
| 765 | + v1.removeJoin(v2.id()) |
| 766 | + joinInfo.prefix = "BB_" |
| 767 | + v1.addJoin(joinInfo) |
| 768 | + self.assertEqual(len(v1.fields()), 6) |
| 769 | + df = QgsVirtualLayerDefinitionUtils.fromJoinedLayer(v1) |
| 770 | + self.assertEqual(df.query(), 'SELECT t.rowid AS uid, t.id, t.b_id, t.c_id, t.name, j1.bname AS BB_bname, j1.bfield AS BB_bfield FROM {} AS t LEFT JOIN {} AS j1 ON t."b_id"=j1."id"'.format(v1.id(), v2.id())) |
| 771 | + joinInfo.prefix = "" |
| 772 | + v1.removeJoin(v2.id()) |
| 773 | + v1.addJoin(joinInfo) |
| 774 | + |
| 775 | + # add another join |
| 776 | + joinInfo2 = QgsVectorJoinInfo() |
| 777 | + joinInfo2.targetFieldName = "c_id" |
| 778 | + joinInfo2.joinLayerId = v3.id() |
| 779 | + joinInfo2.joinFieldName = "id" |
| 780 | + v1.addJoin(joinInfo2) |
| 781 | + self.assertEqual(len(v1.fields()), 7) |
| 782 | + df = QgsVirtualLayerDefinitionUtils.fromJoinedLayer(v1) |
| 783 | + self.assertEqual(df.query(), ('SELECT t.rowid AS uid, t.id, t.b_id, t.c_id, t.name, j1.bname AS B_bname, j1.bfield AS B_bfield, j2.cname AS C_cname FROM {} AS t ' + |
| 784 | + 'LEFT JOIN {} AS j1 ON t."b_id"=j1."id" ' + |
| 785 | + 'LEFT JOIN {} AS j2 ON t."c_id"=j2."id"').format(v1.id(), v2.id(), v3.id())) |
| 786 | + |
| 787 | + QgsMapLayerRegistry.instance().removeMapLayers([v1, v2, v3]) |
| 788 | + |
734 | 789 |
|
735 | 790 | if __name__ == '__main__':
|
736 | 791 | unittest.main()
|
0 commit comments