Cleanup Execute SQL geometry type handling

And fix exception when "no geometry" type is selected

Fixes #54833
This commit is contained in:
Nyall Dawson 2023-10-05 09:27:32 +10:00
parent 7b93febd79
commit 33bb769b91

View File

@ -19,7 +19,8 @@ __author__ = 'Hugo Mercier'
__date__ = 'January 2016'
__copyright__ = '(C) 2016, Hugo Mercier'
from qgis.core import (QgsVirtualLayerDefinition,
from qgis.core import (Qgis,
QgsVirtualLayerDefinition,
QgsVectorLayer,
QgsWkbTypes,
QgsProcessingAlgorithm,
@ -76,6 +77,16 @@ class ExecuteSQL(QgisAlgorithm):
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
@ -92,17 +103,10 @@ class ExecuteSQL(QgisAlgorithm):
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))
@ -120,7 +124,9 @@ class ExecuteSQL(QgisAlgorithm):
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()
@ -150,13 +156,13 @@ class ExecuteSQL(QgisAlgorithm):
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())
@ -167,8 +173,12 @@ class ExecuteSQL(QgisAlgorithm):
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))