Skip to content

Commit

Permalink
Cleanup Execute SQL geometry type handling
Browse files Browse the repository at this point in the history
And fix exception when "no geometry" type is selected

Fixes #54833
  • Loading branch information
nyalldawson committed Oct 5, 2023
1 parent 7b93feb commit 33bb769
Showing 1 changed file with 28 additions and 18 deletions.
46 changes: 28 additions & 18 deletions python/plugins/processing/algs/qgis/ExecuteSQL.py
Expand Up @@ -19,7 +19,8 @@
__date__ = 'January 2016'
__copyright__ = '(C) 2016, Hugo Mercier'

from qgis.core import (QgsVirtualLayerDefinition,
from qgis.core import (Qgis,
QgsVirtualLayerDefinition,
QgsVectorLayer,
QgsWkbTypes,
QgsProcessingAlgorithm,
Expand Down Expand Up @@ -76,6 +77,16 @@ def groupId(self):
def __init__(self):
super().__init__()

self.geometry_types = [
(None, self.tr('Autodetect')),
(Qgis.WkbType.NoGeometry, self.tr('No geometry')),
(Qgis.WkbType.Point, self.tr('Point')),
(Qgis.WkbType.LineString, self.tr('LineString')),
(Qgis.WkbType.Polygon, self.tr('Polygon')),
(Qgis.WkbType.MultiPoint, self.tr('MultiPoint')),
(Qgis.WkbType.MultiLineString, self.tr('MultiLineString')),
(Qgis.WkbType.MultiPolygon, self.tr('MultiPolygon'))]

def flags(self):
return super().flags() | QgsProcessingAlgorithm.FlagNoThreading

Expand All @@ -92,17 +103,10 @@ def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterString(name=self.INPUT_GEOMETRY_FIELD,
description=self.tr('Geometry field'), optional=True))

self.geometryTypes = [
self.tr('Autodetect'),
self.tr('No geometry'),
'Point',
'LineString',
'Polygon',
'MultiPoint',
'MultiLineString',
'MultiPolygon']
self.addParameter(QgsProcessingParameterEnum(self.INPUT_GEOMETRY_TYPE,
self.tr('Geometry type'), options=self.geometryTypes, defaultValue=0))
self.tr('Geometry type'),
options=[t[1] for t in self.geometry_types],
defaultValue=0))

self.addParameter(QgsProcessingParameterCrs(self.INPUT_GEOMETRY_CRS,
self.tr('CRS'), optional=True))
Expand All @@ -120,7 +124,9 @@ def processAlgorithm(self, parameters, context, feedback):
query = self.parameterAsString(parameters, self.INPUT_QUERY, context)
uid_field = self.parameterAsString(parameters, self.INPUT_UID_FIELD, context)
geometry_field = self.parameterAsString(parameters, self.INPUT_GEOMETRY_FIELD, context)
geometry_type = self.parameterAsEnum(parameters, self.INPUT_GEOMETRY_TYPE, context)
geometry_type = self.geometry_types[
self.parameterAsEnum(parameters, self.INPUT_GEOMETRY_TYPE, context)
][0]
geometry_crs = self.parameterAsCrs(parameters, self.INPUT_GEOMETRY_CRS, context)

df = QgsVirtualLayerDefinition()
Expand Down Expand Up @@ -150,13 +156,13 @@ def processAlgorithm(self, parameters, context, feedback):
if uid_field:
df.setUid(uid_field)

if geometry_type == 1: # no geometry
df.setGeometryWkbType(QgsWkbTypes.NoGeometry)
if geometry_type == Qgis.WkbType.NoGeometry:
df.setGeometryWkbType(Qgis.WkbType.NoGeometry)
else:
if geometry_field:
df.setGeometryField(geometry_field)
if geometry_type > 1:
df.setGeometryWkbType(geometry_type - 1)
if geometry_type is not None:
df.setGeometryWkbType(geometry_type)
if geometry_crs.isValid():
df.setGeometrySrid(geometry_crs.postgisSrid())

Expand All @@ -167,8 +173,12 @@ def processAlgorithm(self, parameters, context, feedback):
if vLayer.wkbType() == QgsWkbTypes.Unknown:
raise QgsProcessingException(self.tr("Cannot find geometry field"))

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
vLayer.fields(), vLayer.wkbType() if geometry_type != 1 else 1, vLayer.crs())
(sink, dest_id) = self.parameterAsSink(parameters,
self.OUTPUT,
context,
vLayer.fields(),
vLayer.wkbType(),
vLayer.crs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

Expand Down

0 comments on commit 33bb769

Please sign in to comment.