25
25
26
26
__revision__ = '$Format:%H$'
27
27
28
- from qgis .core import (QgsFeature ,
29
- QgsVirtualLayerDefinition ,
28
+ from qgis .core import (QgsVirtualLayerDefinition ,
30
29
QgsVectorLayer ,
31
- QgsCoordinateReferenceSystem ,
32
30
QgsWkbTypes ,
33
- QgsApplication ,
34
- QgsProcessingUtils )
31
+ QgsProcessingParameterMultipleLayers ,
32
+ QgsProcessingParameterString ,
33
+ QgsProcessingParameterEnum ,
34
+ QgsProcessingParameterCrs ,
35
+ QgsProcessingParameterFeatureSink ,
36
+ QgsFeatureSink ,
37
+ QgsProcessingException )
35
38
36
39
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
37
- from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
38
- from processing .core .parameters import ParameterString
39
- from processing .core .parameters import ParameterMultipleInput
40
- from processing .core .parameters import ParameterCrs
41
- from processing .core .parameters import ParameterSelection
42
- from processing .core .outputs import OutputVector
43
40
44
41
45
42
class ExecuteSQL (QgisAlgorithm ):
@@ -54,7 +51,7 @@ class ExecuteSQL(QgisAlgorithm):
54
51
INPUT_GEOMETRY_FIELD = 'INPUT_GEOMETRY_FIELD'
55
52
INPUT_GEOMETRY_TYPE = 'INPUT_GEOMETRY_TYPE'
56
53
INPUT_GEOMETRY_CRS = 'INPUT_GEOMETRY_CRS'
57
- OUTPUT_LAYER = 'OUTPUT_LAYER '
54
+ OUTPUT = 'OUTPUT '
58
55
59
56
def group (self ):
60
57
return self .tr ('Vector general tools' )
@@ -63,19 +60,19 @@ def __init__(self):
63
60
super ().__init__ ()
64
61
65
62
def initAlgorithm (self , config = None ):
66
- self .addParameter (ParameterMultipleInput (name = self .INPUT_DATASOURCES ,
67
- description = self .tr ('Additional input datasources (called input1, .., inputN in the query)' ),
68
- optional = True ))
63
+ self .addParameter (QgsProcessingParameterMultipleLayers (name = self .INPUT_DATASOURCES ,
64
+ description = self .tr ('Additional input datasources (called input1, .., inputN in the query)' ),
65
+ optional = True ))
69
66
70
- self .addParameter (ParameterString (name = self .INPUT_QUERY ,
71
- description = self .tr ('SQL query' ),
72
- multiline = True ))
67
+ self .addParameter (QgsProcessingParameterString (name = self .INPUT_QUERY ,
68
+ description = self .tr ('SQL query' ),
69
+ multiLine = True ))
73
70
74
- self .addParameter (ParameterString (name = self .INPUT_UID_FIELD ,
75
- description = self .tr ('Unique identifier field' ), optional = True ))
71
+ self .addParameter (QgsProcessingParameterString (name = self .INPUT_UID_FIELD ,
72
+ description = self .tr ('Unique identifier field' ), optional = True ))
76
73
77
- self .addParameter (ParameterString (name = self .INPUT_GEOMETRY_FIELD ,
78
- description = self .tr ('Geometry field' ), optional = True ))
74
+ self .addParameter (QgsProcessingParameterString (name = self .INPUT_GEOMETRY_FIELD ,
75
+ description = self .tr ('Geometry field' ), optional = True ))
79
76
80
77
self .geometryTypes = [
81
78
self .tr ('Autodetect' ),
@@ -86,13 +83,13 @@ def initAlgorithm(self, config=None):
86
83
'MultiPoint' ,
87
84
'MultiLineString' ,
88
85
'MultiPolygon' ]
89
- self .addParameter (ParameterSelection (self .INPUT_GEOMETRY_TYPE ,
90
- self .tr ('Geometry type' ), self .geometryTypes , optional = True ))
86
+ self .addParameter (QgsProcessingParameterEnum (self .INPUT_GEOMETRY_TYPE ,
87
+ self .tr ('Geometry type' ), options = self .geometryTypes , optional = True ))
91
88
92
- self .addParameter (ParameterCrs (self .INPUT_GEOMETRY_CRS ,
93
- self .tr ('CRS' ), optional = True ))
89
+ self .addParameter (QgsProcessingParameterCrs (self .INPUT_GEOMETRY_CRS ,
90
+ self .tr ('CRS' ), optional = True ))
94
91
95
- self .addOutput ( OutputVector (self .OUTPUT_LAYER , self .tr ('SQL Output' )))
92
+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('SQL Output' )))
96
93
97
94
def name (self ):
98
95
return 'executesql'
@@ -101,24 +98,19 @@ def displayName(self):
101
98
return self .tr ('Execute SQL' )
102
99
103
100
def processAlgorithm (self , parameters , context , feedback ):
104
- layers = self .getParameterValue ( self .INPUT_DATASOURCES )
105
- query = self .getParameterValue ( self .INPUT_QUERY )
106
- uid_field = self .getParameterValue ( self .INPUT_UID_FIELD )
107
- geometry_field = self .getParameterValue ( self .INPUT_GEOMETRY_FIELD )
108
- geometry_type = self .getParameterValue ( self .INPUT_GEOMETRY_TYPE )
109
- geometry_crs = self .getParameterValue ( self .INPUT_GEOMETRY_CRS )
101
+ layers = self .parameterAsLayerList ( parameters , self .INPUT_DATASOURCES , context )
102
+ query = self .parameterAsString ( parameters , self .INPUT_QUERY , context )
103
+ uid_field = self .parameterAsString ( parameters , self .INPUT_UID_FIELD , context )
104
+ geometry_field = self .parameterAsString ( parameters , self .INPUT_GEOMETRY_FIELD , context )
105
+ geometry_type = self .parameterAsEnum ( parameters , self .INPUT_GEOMETRY_TYPE , context )
106
+ geometry_crs = self .parameterAsCrs ( parameters , self .INPUT_GEOMETRY_CRS , context )
110
107
111
108
df = QgsVirtualLayerDefinition ()
112
- layerIdx = 1
113
- if layers :
114
- for layerSource in layers .split (';' ):
115
- layer = QgsProcessingUtils .mapLayerFromString (layerSource , context )
116
- if layer :
117
- df .addSource ('input{}' .format (layerIdx ), layer .id ())
118
- layerIdx += 1
109
+ for layerIdx , layer in enumerate (layers ):
110
+ df .addSource ('input{}' .format (layerIdx + 1 ), layer .id ())
119
111
120
112
if query == '' :
121
- raise GeoAlgorithmExecutionException (
113
+ raise QgsProcessingException (
122
114
self .tr ('Empty SQL. Please enter valid SQL expression and try again.' ))
123
115
else :
124
116
df .setQuery (query )
@@ -133,26 +125,22 @@ def processAlgorithm(self, parameters, context, feedback):
133
125
df .setGeometryField (geometry_field )
134
126
if geometry_type > 1 :
135
127
df .setGeometryWkbType (geometry_type - 1 )
136
- if geometry_crs :
137
- crs = QgsCoordinateReferenceSystem (geometry_crs )
138
- if crs .isValid ():
139
- df .setGeometrySrid (crs .postgisSrid ())
128
+ if geometry_crs .isValid ():
129
+ df .setGeometrySrid (geometry_crs .postgisSrid ())
140
130
141
131
vLayer = QgsVectorLayer (df .toString (), "temp_vlayer" , "virtual" )
142
132
if not vLayer .isValid ():
143
- raise GeoAlgorithmExecutionException (vLayer .dataProvider ().error ().message ())
133
+ raise QgsProcessingException (vLayer .dataProvider ().error ().message ())
144
134
145
- writer = self .getOutputFromName (self .OUTPUT_LAYER ).getVectorWriter (vLayer .fields (),
146
- vLayer .wkbType () if geometry_type != 1 else 1 ,
147
- vLayer .crs (), context )
135
+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
136
+ vLayer .fields (), vLayer .wkbType () if geometry_type != 1 else 1 , vLayer .crs ())
148
137
149
- features = QgsProcessingUtils .getFeatures (vLayer , context )
138
+ features = vLayer .getFeatures ()
150
139
total = 100.0 / vLayer .featureCount () if vLayer .featureCount () else 0
151
- outFeat = QgsFeature ()
152
140
for current , inFeat in enumerate (features ):
153
- outFeat . setAttributes ( inFeat . attributes ())
154
- if geometry_type != 1 :
155
- outFeat . setGeometry ( inFeat . geometry ())
156
- writer .addFeature (outFeat , QgsFeatureSink .FastInsert )
141
+ if feedback . isCanceled ():
142
+ break
143
+
144
+ sink .addFeature (inFeat , QgsFeatureSink .FastInsert )
157
145
feedback .setProgress (int (current * total ))
158
- del writer
146
+ return { self . OUTPUT : dest_id }
0 commit comments