ticket901patch.diff

Fernando Pacheco -, 2008-01-13 12:37 PM

Download (18.1 KB)

View differences:

src/app/qgspgquerybuilder.cpp (copia de trabajo)
24 24
: QDialog(parent, fl)
25 25
{
26 26
  setupUi(this);
27
  setupListViews();
27
  setupGuiViews();
28 28
}
29 29
// constructor used when the query builder must make its own
30 30
// connection to the database
......
33 33
: QDialog(parent, fl), mUri(uri)
34 34
{
35 35
  setupUi(this);
36
  setupListViews();
36
  setupGuiViews();
37 37
  // The query builder must make its own connection to the database when
38 38
  // using this constructor
39 39
  QString connInfo = mUri->connInfo();
......
71 71
: QDialog(parent, fl), mPgConnection(con)
72 72
{
73 73
  setupUi(this);
74
  setupListViews();
74
  setupGuiViews();
75 75
  mOwnConnection = false; // we don't own this connection since it was passed to us
76 76
  mUri = new QgsDataSourceURI( "table=" + tableName);
77 77
  QString datasource = QString(tr("Table <b>%1</b> in database <b>%2</b> on host <b>%3</b>, user <b>%4</b>"))
......
138 138
      mFieldMap[fieldName] = QgsField(fieldName, type, fieldType);
139 139
      QStandardItem *myItem = new QStandardItem(fieldName);
140 140
      myItem->setEditable(false);
141
      mModelFields->insertRow(mModelFields->rowCount(),myItem);
141
      mModelFields->insertRow(mModelFields->rowCount(),myItem);      
142 142
    }
143
    // All fields get ... setup
144
    setupLstFieldsModel();
143 145
  }
144 146
  else
145 147
  {
......
148 150
  PQclear(result);
149 151
}
150 152

  
151
void QgsPgQueryBuilder::setupListViews()
153
void QgsPgQueryBuilder::setupLstFieldsModel()
152 154
{
153
  //Models
155
  lstFields->setModel(mModelFields);
156
}
157

  
158
void QgsPgQueryBuilder::setupGuiViews()
159
{
160
  //Initialize the models
154 161
  mModelFields = new QStandardItemModel();
155 162
  mModelValues = new QStandardItemModel();
156
  lstFields->setModel(mModelFields);
157
  lstValues->setModel(mModelValues);
158 163
  // Modes
159 164
  lstFields->setViewMode(QListView::ListMode);
160 165
  lstValues->setViewMode(QListView::ListMode);
......
163 168
  // Performance tip since Qt 4.1
164 169
  lstFields->setUniformItemSizes(true);
165 170
  lstValues->setUniformItemSizes(true);
171
  // Colored rows
172
  lstFields->setAlternatingRowColors(true);
173
  lstValues->setAlternatingRowColors(true);
166 174
}
167 175

  
168
void QgsPgQueryBuilder::on_btnSampleValues_clicked()
176
void QgsPgQueryBuilder::fillValues(QString theSQL)
169 177
{
170
  QString myFieldName = mModelFields->data(lstFields->currentIndex()).toString();
171
  if (myFieldName.isEmpty())
172
      return;
173

  
174
  QString sql = "SELECT DISTINCT \"" + myFieldName + "\" " +
175
      "FROM (SELECT \"" + myFieldName + "\" " +
176
      "FROM " + mUri->quotedTablename() + " " +
177
      "LIMIT 5000) AS foo " +
178
      "ORDER BY \"" + myFieldName + "\" "+
179
      "LIMIT 25";
180
  // clear the values list 
178
  // clear the model
181 179
  mModelValues->clear();
180
  
182 181
  // determine the field type
183
  QgsField field = mFieldMap[myFieldName];
184
  bool isCharField = field.typeName().find("char") > -1;
185
  PGresult *result = PQexec(mPgConnection, (const char *) (sql.utf8()));
182
  QgsField field = mFieldMap[mModelFields->data(lstFields->currentIndex()).toString()];
183
  bool mActualFieldIsChar = field.typeName().find("char") > -1;
184
  
185
  PGresult *result = PQexec(mPgConnection, (const char *) (theSQL.utf8()));
186 186

  
187 187
  if (PQresultStatus(result) == PGRES_TUPLES_OK) 
188 188
  {
......
190 190
    for(int i=0; i < rowCount; i++)
191 191
    {
192 192
      QString value = QString::fromUtf8(PQgetvalue(result, i, 0));
193
      if(isCharField)
194
      {
195
        value = "'" + value + "'";
196
      }
197 193
      QStandardItem *myItem = new QStandardItem(value);
198 194
      myItem->setEditable(false);
199 195
      mModelValues->insertRow(mModelValues->rowCount(),myItem);
200 196
    }
201 197
  }else
202 198
  {
203
    QMessageBox::warning(this, tr("Database error"), tr("<p>Failed to get sample of field values using SQL:</p><p>") + sql + "</p><p>Error message was: "+ QString(PQerrorMessage(mPgConnection)) + "</p>");
199
    QMessageBox::warning(this, tr("Database error"), tr("<p>Failed to get sample of field values using SQL:</p><p>") + theSQL + "</p><p>Error message was: "+ QString(PQerrorMessage(mPgConnection)) + "</p>");
204 200
  }
205 201
  // free the result set
206 202
  PQclear(result);
207 203
}
208 204

  
205
void QgsPgQueryBuilder::on_btnSampleValues_clicked()
206
{
207
  lstValues->setCursor(Qt::WaitCursor);
208
  QString myFieldName = mModelFields->data(lstFields->currentIndex()).toString();
209
  if (myFieldName.isEmpty())
210
      return;
211
  
212
  QgsField field = mFieldMap[mModelFields->data(lstFields->currentIndex()).toString()];
213
  bool mActualFieldIsChar = field.typeName().find("char") > -1;
214
  
215
  QString sql = "SELECT DISTINCT \"" + myFieldName + "\" " +
216
      "FROM (SELECT \"" + myFieldName + "\" " +
217
      "FROM " + mUri->quotedTablename() + " " +
218
      "LIMIT 5000) AS foo " +
219
      "ORDER BY \"" + myFieldName + "\" "+
220
      "LIMIT 25";
221
  
222
  //delete connection mModelValues and lstValues
223
  QStandardItemModel *tmp = new QStandardItemModel();
224
  lstValues->setModel(tmp);
225
  //Clear and fill the mModelValues 
226
  fillValues(sql);
227
  lstValues->setModel(mModelValues);
228
  lstValues->setCursor(Qt::ArrowCursor);
229
  //delete the tmp
230
  delete tmp;
231
  
232
}
233

  
209 234
void QgsPgQueryBuilder::on_btnGetAllValues_clicked()
210 235
{
236
  lstValues->setCursor(Qt::WaitCursor);
211 237
  QString myFieldName = mModelFields->data(lstFields->currentIndex()).toString();
212 238
  if (myFieldName.isEmpty())
213 239
      return;
214 240

  
215 241
  QString sql = "select distinct \"" + myFieldName
216 242
      + "\" from " + mUri->quotedTablename() + " order by \"" + myFieldName + "\"";
217
  // clear the values list 
218
  mModelValues->clear();
219
  // determine the field type
220
  QgsField field = mFieldMap[myFieldName];
221
  bool isCharField = field.typeName().find("char") > -1;
222

  
223
  PGresult *result = PQexec(mPgConnection, (const char *) (sql.utf8()));
224

  
225
  if (PQresultStatus(result) == PGRES_TUPLES_OK) 
226
  {
227
    int rowCount =  PQntuples(result);
228
    
229
    lstValues->setCursor(Qt::WaitCursor);
230
    // Block for better performance
231
    mModelValues->blockSignals(true);
232
    lstValues->setUpdatesEnabled(false);
233
    
234
    for(int i=0; i < rowCount; i++)
235
    {
236
      QString value = QString::fromUtf8(PQgetvalue(result, i, 0));
237
      if(isCharField)
238
      {
239
        value = "'" + value + "'";
240
      }
241
      QStandardItem *myItem = new QStandardItem(value);
242
      myItem->setEditable(false);
243
      mModelValues->insertRow(mModelValues->rowCount(),myItem);
244
    }
245
    
246
    // Unblock for normal use
247
    mModelValues->blockSignals(false);
248
    lstValues->setUpdatesEnabled(true);
249
    // TODO: already sorted, signal emit to refresh model 
250
    mModelValues->sort(0);
251
    lstValues->setCursor(Qt::ArrowCursor);
252
    
253
  }else
254
  {
255
    QMessageBox::warning(this, tr("Database error"), tr("Failed to get sample of field values") + QString(PQerrorMessage(mPgConnection)) );
256
  }
257
  // free the result set
258
  PQclear(result);
243
  
244
  //delete connection mModelValues and lstValues
245
  QStandardItemModel *tmp = new QStandardItemModel();
246
  lstValues->setModel(tmp);
247
  //Clear and fill the mModelValues 
248
  fillValues(sql);
249
  lstValues->setModel(mModelValues);
250
  lstValues->setCursor(Qt::ArrowCursor);
251
  //delete the tmp
252
  delete tmp;
259 253
}
260 254

  
261 255
void QgsPgQueryBuilder::on_btnTest_clicked()
......
398 392
  txtSQL->setText(sqlStatement);
399 393
}
400 394

  
395
void QgsPgQueryBuilder::on_lstFields_clicked( const QModelIndex &index )
396
{
397
  if (mPreviousFieldRow != index.row())
398
  {
399
    mPreviousFieldRow = index.row();
400
    
401
    // If type is gemetry .. normal users don't want to get values?
402
    QgsField field = mFieldMap[mModelFields->data(lstFields->currentIndex()).toString()];
403
    if (field.typeName().find("geometry") > -1)
404
    {
405
      btnSampleValues->setEnabled(false);
406
      btnGetAllValues->setEnabled(false); 
407
    }else
408
    {
409
      btnSampleValues->setEnabled(true);
410
      btnGetAllValues->setEnabled(true);
411
    }
412
    mModelValues->clear();
413
  }
414
}
415

  
401 416
void QgsPgQueryBuilder::on_lstFields_doubleClicked( const QModelIndex &index )
402 417
{
403 418
  txtSQL->insert("\"" + mModelFields->data(index).toString() + "\"");
......
405 420

  
406 421
void QgsPgQueryBuilder::on_lstValues_doubleClicked( const QModelIndex &index )
407 422
{
408
  txtSQL->insert(mModelValues->data(index).toString());
423
  if (mActualFieldIsChar)
424
  {
425
    txtSQL->insert("'" + mModelValues->data(index).toString() + "'");
426
  }else
427
  {
428
    txtSQL->insert(mModelValues->data(index).toString());
429
  }
409 430
}
410 431

  
411 432
void QgsPgQueryBuilder::on_btnLessEqual_clicked()
src/app/qgspgquerybuilder.h (copia de trabajo)
87 87
    void on_btnILike_clicked();
88 88
    QString sql();
89 89
    void setSql( QString sqlStatement);
90
    void on_lstFields_clicked( const QModelIndex &index );
90 91
    void on_lstFields_doubleClicked( const QModelIndex &index );
91 92
    void on_lstValues_doubleClicked( const QModelIndex &index );
92 93
    void on_btnLessEqual_clicked();
......
123 124
  /*! 
124 125
   * Setup models for listviews
125 126
   */ 
126
  void setupListViews();
127
  void setupGuiViews();
128
  void setupLstFieldsModel();
129
  void fillValues(QString theSQL);
127 130

  
128 131
  /*! Get the number of records that would be returned by the current SQL
129 132
   * @return Number of records or -1 if an error was encountered
......
149 152
  QStandardItemModel *mModelFields;
150 153
  //! Model for values ListView
151 154
  QStandardItemModel *mModelValues;
155
  //! Actual field char?
156
  bool mActualFieldIsChar;
157
  //! Previous field row to delete model
158
  int mPreviousFieldRow;
152 159
};
153 160
#endif //QGSPGQUERYBUILDER_H
src/ui/qgspgquerybuilderbase.ui (copia de trabajo)
12 12
   </rect>
13 13
  </property>
14 14
  <property name="sizePolicy" >
15
   <sizepolicy>
16
    <hsizetype>0</hsizetype>
17
    <vsizetype>0</vsizetype>
15
   <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
18 16
    <horstretch>0</horstretch>
19 17
    <verstretch>0</verstretch>
20 18
   </sizepolicy>
......
29 27
   <bool>true</bool>
30 28
  </property>
31 29
  <layout class="QGridLayout" >
32
   <property name="margin" >
30
   <property name="leftMargin" >
33 31
    <number>11</number>
34 32
   </property>
35
   <property name="spacing" >
33
   <property name="topMargin" >
34
    <number>11</number>
35
   </property>
36
   <property name="rightMargin" >
37
    <number>11</number>
38
   </property>
39
   <property name="bottomMargin" >
40
    <number>11</number>
41
   </property>
42
   <property name="horizontalSpacing" >
36 43
    <number>6</number>
37 44
   </property>
45
   <property name="verticalSpacing" >
46
    <number>6</number>
47
   </property>
38 48
   <item row="2" column="0" colspan="2" >
39 49
    <widget class="QGroupBox" name="groupBox4" >
40 50
     <property name="title" >
41 51
      <string>Operators</string>
42 52
     </property>
43 53
     <layout class="QGridLayout" >
44
      <property name="margin" >
54
      <property name="leftMargin" >
45 55
       <number>11</number>
46 56
      </property>
47
      <property name="spacing" >
57
      <property name="topMargin" >
58
       <number>11</number>
59
      </property>
60
      <property name="rightMargin" >
61
       <number>11</number>
62
      </property>
63
      <property name="bottomMargin" >
64
       <number>11</number>
65
      </property>
66
      <property name="horizontalSpacing" >
48 67
       <number>6</number>
49 68
      </property>
69
      <property name="verticalSpacing" >
70
       <number>6</number>
71
      </property>
50 72
      <item row="0" column="0" >
51 73
       <widget class="QPushButton" name="btnEqual" >
52 74
        <property name="text" >
......
150 172
   </item>
151 173
   <item row="4" column="0" colspan="2" >
152 174
    <layout class="QHBoxLayout" >
153
     <property name="margin" >
154
      <number>11</number>
155
     </property>
156 175
     <property name="spacing" >
157 176
      <number>6</number>
158 177
     </property>
178
     <property name="leftMargin" >
179
      <number>11</number>
180
     </property>
181
     <property name="topMargin" >
182
      <number>11</number>
183
     </property>
184
     <property name="rightMargin" >
185
      <number>11</number>
186
     </property>
187
     <property name="bottomMargin" >
188
      <number>11</number>
189
     </property>
159 190
     <item>
160 191
      <spacer>
161 192
       <property name="orientation" >
......
230 261
   <item row="1" column="1" >
231 262
    <widget class="QGroupBox" name="groupBox2" >
232 263
     <property name="sizePolicy" >
233
      <sizepolicy>
234
       <hsizetype>0</hsizetype>
235
       <vsizetype>0</vsizetype>
264
      <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
236 265
       <horstretch>0</horstretch>
237 266
       <verstretch>0</verstretch>
238 267
      </sizepolicy>
......
241 270
      <string>Values</string>
242 271
     </property>
243 272
     <layout class="QGridLayout" >
244
      <property name="margin" >
273
      <property name="leftMargin" >
245 274
       <number>11</number>
246 275
      </property>
247
      <property name="spacing" >
276
      <property name="topMargin" >
277
       <number>11</number>
278
      </property>
279
      <property name="rightMargin" >
280
       <number>11</number>
281
      </property>
282
      <property name="bottomMargin" >
283
       <number>11</number>
284
      </property>
285
      <property name="horizontalSpacing" >
248 286
       <number>6</number>
249 287
      </property>
288
      <property name="verticalSpacing" >
289
       <number>6</number>
290
      </property>
250 291
      <item row="2" column="1" >
251 292
       <widget class="QPushButton" name="btnGetAllValues" >
293
        <property name="toolTip" >
294
         <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
295
p, li { white-space: pre-wrap; }
296
&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
297
&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Retrieve &lt;span style=" font-weight:600;">all&lt;/span> the record in the vector file (&lt;span style=" font-style:italic;">if the table is big, the operation can consume some time&lt;/span>)&lt;/p>&lt;/body>&lt;/html></string>
298
        </property>
252 299
        <property name="text" >
253 300
         <string>All</string>
254 301
        </property>
......
256 303
      </item>
257 304
      <item row="2" column="0" >
258 305
       <widget class="QPushButton" name="btnSampleValues" >
306
        <property name="toolTip" >
307
         <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
308
p, li { white-space: pre-wrap; }
309
&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
310
&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Take a &lt;span style=" font-weight:600;">sample&lt;/span> of records in the vector file&lt;/p>&lt;/body>&lt;/html></string>
311
        </property>
259 312
        <property name="text" >
260 313
         <string>Sample</string>
261 314
        </property>
262 315
       </widget>
263 316
      </item>
264 317
      <item rowspan="2" row="0" column="0" colspan="2" >
265
       <widget class="QListView" name="lstValues" />
318
       <widget class="QListView" name="lstValues" >
319
        <property name="whatsThis" >
320
         <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
321
p, li { white-space: pre-wrap; }
322
&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
323
&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">List of values for the current field.&lt;/p>&lt;/body>&lt;/html></string>
324
        </property>
325
        <property name="autoFillBackground" >
326
         <bool>true</bool>
327
        </property>
328
        <property name="selectionBehavior" >
329
         <enum>QAbstractItemView::SelectRows</enum>
330
        </property>
331
        <property name="uniformItemSizes" >
332
         <bool>true</bool>
333
        </property>
334
       </widget>
266 335
      </item>
267 336
     </layout>
268 337
    </widget>
269 338
   </item>
270 339
   <item row="1" column="0" >
271 340
    <widget class="QGroupBox" name="groupBox1" >
341
     <property name="sizePolicy" >
342
      <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
343
       <horstretch>0</horstretch>
344
       <verstretch>0</verstretch>
345
      </sizepolicy>
346
     </property>
272 347
     <property name="title" >
273 348
      <string>Fields</string>
274 349
     </property>
275 350
     <layout class="QGridLayout" >
276
      <property name="margin" >
351
      <property name="leftMargin" >
277 352
       <number>11</number>
278 353
      </property>
279
      <property name="spacing" >
354
      <property name="topMargin" >
355
       <number>11</number>
356
      </property>
357
      <property name="rightMargin" >
358
       <number>11</number>
359
      </property>
360
      <property name="bottomMargin" >
361
       <number>11</number>
362
      </property>
363
      <property name="horizontalSpacing" >
280 364
       <number>6</number>
281 365
      </property>
366
      <property name="verticalSpacing" >
367
       <number>6</number>
368
      </property>
282 369
      <item row="0" column="0" >
283
       <widget class="QListView" name="lstFields" />
370
       <widget class="QListView" name="lstFields" >
371
        <property name="whatsThis" >
372
         <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
373
p, li { white-space: pre-wrap; }
374
&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
375
&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">List of fields in this vector file&lt;/p>&lt;/body>&lt;/html></string>
376
        </property>
377
       </widget>
284 378
      </item>
285 379
     </layout>
286 380
    </widget>
......
304 398
      <string>SQL where clause</string>
305 399
     </property>
306 400
     <layout class="QGridLayout" >
307
      <property name="margin" >
401
      <property name="leftMargin" >
308 402
       <number>11</number>
309 403
      </property>
310
      <property name="spacing" >
404
      <property name="topMargin" >
405
       <number>11</number>
406
      </property>
407
      <property name="rightMargin" >
408
       <number>11</number>
409
      </property>
410
      <property name="bottomMargin" >
411
       <number>11</number>
412
      </property>
413
      <property name="horizontalSpacing" >
311 414
       <number>6</number>
312 415
      </property>
416
      <property name="verticalSpacing" >
417
       <number>6</number>
418
      </property>
313 419
      <item row="0" column="0" >
314 420
       <widget class="QTextEdit" name="txtSQL" />
315 421
      </item>