@@ -38,6 +38,23 @@ QList< QgsStatisticalSummary::Statistic > QgsStatisticalSummaryDockWidget::mDisp
38
38
<< QgsStatisticalSummary::ThirdQuartile
39
39
<< QgsStatisticalSummary::InterQuartileRange;
40
40
41
+ QList< QgsStringStatisticalSummary::Statistic > QgsStatisticalSummaryDockWidget::mDisplayStringStats =
42
+ QList< QgsStringStatisticalSummary::Statistic > () << QgsStringStatisticalSummary::Count
43
+ << QgsStringStatisticalSummary::CountDistinct
44
+ << QgsStringStatisticalSummary::CountMissing
45
+ << QgsStringStatisticalSummary::Min
46
+ << QgsStringStatisticalSummary::Max
47
+ << QgsStringStatisticalSummary::MinimumLength
48
+ << QgsStringStatisticalSummary::MaximumLength;
49
+
50
+ QList< QgsDateTimeStatisticalSummary::Statistic > QgsStatisticalSummaryDockWidget::mDisplayDateTimeStats =
51
+ QList< QgsDateTimeStatisticalSummary::Statistic > () << QgsDateTimeStatisticalSummary::Count
52
+ << QgsDateTimeStatisticalSummary::CountDistinct
53
+ << QgsDateTimeStatisticalSummary::CountMissing
54
+ << QgsDateTimeStatisticalSummary::Min
55
+ << QgsDateTimeStatisticalSummary::Max
56
+ << QgsDateTimeStatisticalSummary::Range;
57
+
41
58
#define MISSING_VALUES -1
42
59
43
60
static QgsExpressionContext _getExpressionContext ( const void * context )
@@ -65,7 +82,9 @@ QgsStatisticalSummaryDockWidget::QgsStatisticalSummaryDockWidget( QWidget *paren
65
82
mFieldExpressionWidget ->registerGetExpressionContextCallback ( &_getExpressionContext, this );
66
83
67
84
mLayerComboBox ->setFilters ( QgsMapLayerProxyModel::VectorLayer );
68
- mFieldExpressionWidget ->setFilters ( QgsFieldProxyModel::Numeric );
85
+ mFieldExpressionWidget ->setFilters ( QgsFieldProxyModel::Numeric |
86
+ QgsFieldProxyModel::String |
87
+ QgsFieldProxyModel::Date );
69
88
70
89
mLayerComboBox ->setLayer ( mLayerComboBox ->layer ( 0 ) );
71
90
mFieldExpressionWidget ->setLayer ( mLayerComboBox ->layer ( 0 ) );
@@ -113,10 +132,47 @@ void QgsStatisticalSummaryDockWidget::refreshStatistics()
113
132
return ;
114
133
}
115
134
135
+ // non numeric field?
136
+ bool isNumeric = true ;
137
+ QVariant::Type fieldType = QVariant::Double;
138
+ if ( !mFieldExpressionWidget ->isExpression () )
139
+ {
140
+ QString field = mFieldExpressionWidget ->currentField ();
141
+ fieldType = mLayer ->fields ().field ( mLayer ->fields ().fieldNameIndex ( field ) ).type ();
142
+ if ( fieldType == QVariant::String || fieldType == QVariant::Date || fieldType == QVariant::DateTime )
143
+ {
144
+ isNumeric = false ;
145
+ }
146
+ }
147
+
148
+ bool selectedOnly = mSelectedOnlyCheckBox ->isChecked ();
149
+
150
+ if ( isNumeric )
151
+ {
152
+ updateNumericStatistics ( selectedOnly );
153
+ }
154
+ else
155
+ {
156
+ switch ( fieldType )
157
+ {
158
+ case QVariant::String:
159
+ updateStringStatistics ( selectedOnly );
160
+ break ;
161
+ case QVariant::Date:
162
+ case QVariant::DateTime:
163
+ updateDateTimeStatistics ( selectedOnly );
164
+ break ;
165
+ default :
166
+ break ;
167
+ }
168
+ }
169
+ }
170
+
171
+ void QgsStatisticalSummaryDockWidget::updateNumericStatistics ( bool selectedOnly )
172
+ {
116
173
QString sourceFieldExp = mFieldExpressionWidget ->currentField ();
117
174
118
175
bool ok;
119
- bool selectedOnly = mSelectedOnlyCheckBox ->isChecked ();
120
176
int missingValues = 0 ;
121
177
QList< double > values = mLayer ->getDoubleValues ( sourceFieldExp, ok, selectedOnly, &missingValues );
122
178
@@ -150,38 +206,46 @@ void QgsStatisticalSummaryDockWidget::refreshStatistics()
150
206
int row = 0 ;
151
207
Q_FOREACH ( QgsStatisticalSummary::Statistic stat, statsToDisplay )
152
208
{
153
- QTableWidgetItem* nameItem = new QTableWidgetItem ( QgsStatisticalSummary::displayName ( stat ) );
154
- nameItem->setToolTip ( nameItem->text () );
155
- nameItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
156
- mStatisticsTable ->setItem ( row, 0 , nameItem );
157
-
158
- QTableWidgetItem* valueItem = new QTableWidgetItem ();
159
- if ( stats.count () != 0 )
160
- {
161
- valueItem->setText ( QString::number ( stats.statistic ( stat ) ) );
162
- }
163
- valueItem->setToolTip ( valueItem->text () );
164
- valueItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
165
- mStatisticsTable ->setItem ( row, 1 , valueItem );
166
-
209
+ addRow ( row, QgsStatisticalSummary::displayName ( stat ),
210
+ QString::number ( stats.statistic ( stat ) ),
211
+ stats.count () != 0 );
167
212
row++;
168
213
}
169
214
170
215
if ( mStatsActions .value ( MISSING_VALUES )->isChecked () )
171
216
{
172
- QTableWidgetItem* nameItem = new QTableWidgetItem ( tr ( " Missing (null) values" ) );
173
- nameItem->setToolTip ( nameItem->text () );
174
- nameItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
175
- mStatisticsTable ->setItem ( row, 0 , nameItem );
217
+ addRow ( row, tr ( " Missing (null) values" ),
218
+ QString::number ( missingValues ),
219
+ stats.count () != 0 || missingValues != 0 );
220
+ row++;
221
+ }
222
+ }
176
223
177
- QTableWidgetItem* valueItem = new QTableWidgetItem ();
178
- if ( stats.count () != 0 || missingValues != 0 )
179
- {
180
- valueItem->setText ( QString::number ( missingValues ) );
181
- }
182
- valueItem->setToolTip ( valueItem->text () );
183
- valueItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
184
- mStatisticsTable ->setItem ( row, 1 , valueItem );
224
+ void QgsStatisticalSummaryDockWidget::updateStringStatistics ( bool selectedOnly )
225
+ {
226
+ QString field = mFieldExpressionWidget ->currentField ();
227
+
228
+ bool ok;
229
+ QVariantList values = mLayer ->getValues ( field, ok, selectedOnly );
230
+
231
+ if ( ! ok )
232
+ {
233
+ return ;
234
+ }
235
+
236
+ QgsStringStatisticalSummary stats;
237
+ stats.setStatistics ( QgsStringStatisticalSummary::All );
238
+ stats.calculateFromVariants ( values );
239
+
240
+ mStatisticsTable ->setRowCount ( mDisplayStringStats .count () );
241
+ mStatisticsTable ->setColumnCount ( 2 );
242
+
243
+ int row = 0 ;
244
+ Q_FOREACH ( QgsStringStatisticalSummary::Statistic stat, mDisplayStringStats )
245
+ {
246
+ addRow ( row, QgsStringStatisticalSummary::displayName ( stat ),
247
+ stats.statistic ( stat ).toString (),
248
+ stats.count () != 0 );
185
249
row++;
186
250
}
187
251
}
@@ -244,3 +308,55 @@ void QgsStatisticalSummaryDockWidget::layerSelectionChanged()
244
308
if ( mSelectedOnlyCheckBox ->isChecked () )
245
309
refreshStatistics ();
246
310
}
311
+
312
+ void QgsStatisticalSummaryDockWidget::updateDateTimeStatistics ( bool selectedOnly )
313
+ {
314
+ QString field = mFieldExpressionWidget ->currentField ();
315
+
316
+ bool ok;
317
+ QVariantList values = mLayer ->getValues ( field, ok, selectedOnly );
318
+
319
+ if ( ! ok )
320
+ {
321
+ return ;
322
+ }
323
+
324
+ QgsDateTimeStatisticalSummary stats;
325
+ stats.setStatistics ( QgsDateTimeStatisticalSummary::All );
326
+ stats.calculate ( values );
327
+
328
+ mStatisticsTable ->setRowCount ( mDisplayDateTimeStats .count () );
329
+ mStatisticsTable ->setColumnCount ( 2 );
330
+
331
+ int row = 0 ;
332
+ Q_FOREACH ( QgsDateTimeStatisticalSummary::Statistic stat, mDisplayDateTimeStats )
333
+ {
334
+ QString value = ( stat == QgsDateTimeStatisticalSummary::Range
335
+ ? tr ( " %1 seconds" ).arg ( stats.range ().seconds () )
336
+ : stats.statistic ( stat ).toString () );
337
+
338
+ addRow ( row, QgsDateTimeStatisticalSummary::displayName ( stat ),
339
+ value,
340
+ stats.count () != 0 );
341
+ row++;
342
+ }
343
+ }
344
+
345
+ void QgsStatisticalSummaryDockWidget::addRow ( int row, const QString& name, const QString& value,
346
+ bool showValue )
347
+ {
348
+ QTableWidgetItem* nameItem = new QTableWidgetItem ( name );
349
+ nameItem->setToolTip ( name );
350
+ nameItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
351
+ mStatisticsTable ->setItem ( row, 0 , nameItem );
352
+
353
+ QTableWidgetItem* valueItem = new QTableWidgetItem ();
354
+ if ( showValue )
355
+ {
356
+ valueItem->setText ( value );
357
+ }
358
+ valueItem->setToolTip ( value );
359
+ valueItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
360
+ mStatisticsTable ->setItem ( row, 1 , valueItem );
361
+ }
362
+
0 commit comments