Skip to content

Commit 88d3e2a

Browse files
committedMay 11, 2016
[FEATURE] Show stats for string and date fields in stats dock
1 parent b053ad8 commit 88d3e2a

File tree

2 files changed

+153
-28
lines changed

2 files changed

+153
-28
lines changed
 

‎src/app/qgsstatisticalsummarydockwidget.cpp

Lines changed: 144 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,23 @@ QList< QgsStatisticalSummary::Statistic > QgsStatisticalSummaryDockWidget::mDisp
3838
<< QgsStatisticalSummary::ThirdQuartile
3939
<< QgsStatisticalSummary::InterQuartileRange;
4040

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+
4158
#define MISSING_VALUES -1
4259

4360
static QgsExpressionContext _getExpressionContext( const void* context )
@@ -65,7 +82,9 @@ QgsStatisticalSummaryDockWidget::QgsStatisticalSummaryDockWidget( QWidget *paren
6582
mFieldExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, this );
6683

6784
mLayerComboBox->setFilters( QgsMapLayerProxyModel::VectorLayer );
68-
mFieldExpressionWidget->setFilters( QgsFieldProxyModel::Numeric );
85+
mFieldExpressionWidget->setFilters( QgsFieldProxyModel::Numeric |
86+
QgsFieldProxyModel::String |
87+
QgsFieldProxyModel::Date );
6988

7089
mLayerComboBox->setLayer( mLayerComboBox->layer( 0 ) );
7190
mFieldExpressionWidget->setLayer( mLayerComboBox->layer( 0 ) );
@@ -113,10 +132,47 @@ void QgsStatisticalSummaryDockWidget::refreshStatistics()
113132
return;
114133
}
115134

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+
{
116173
QString sourceFieldExp = mFieldExpressionWidget->currentField();
117174

118175
bool ok;
119-
bool selectedOnly = mSelectedOnlyCheckBox->isChecked();
120176
int missingValues = 0;
121177
QList< double > values = mLayer->getDoubleValues( sourceFieldExp, ok, selectedOnly, &missingValues );
122178

@@ -150,38 +206,46 @@ void QgsStatisticalSummaryDockWidget::refreshStatistics()
150206
int row = 0;
151207
Q_FOREACH ( QgsStatisticalSummary::Statistic stat, statsToDisplay )
152208
{
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 );
167212
row++;
168213
}
169214

170215
if ( mStatsActions.value( MISSING_VALUES )->isChecked() )
171216
{
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+
}
176223

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 );
185249
row++;
186250
}
187251
}
@@ -244,3 +308,55 @@ void QgsStatisticalSummaryDockWidget::layerSelectionChanged()
244308
if ( mSelectedOnlyCheckBox->isChecked() )
245309
refreshStatistics();
246310
}
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+

‎src/app/qgsstatisticalsummarydockwidget.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "ui_qgsstatisticalsummarybase.h"
2121

2222
#include "qgsstatisticalsummary.h"
23+
#include "qgsstringstatisticalsummary.h"
24+
#include "qgsdatetimestatisticalsummary.h"
2325

2426
class QgsBrowserModel;
2527
class QModelIndex;
@@ -62,6 +64,13 @@ class APP_EXPORT QgsStatisticalSummaryDockWidget : public QDockWidget, private U
6264

6365
QMap< int, QAction* > mStatsActions;
6466
static QList< QgsStatisticalSummary::Statistic > mDisplayStats;
67+
static QList< QgsStringStatisticalSummary::Statistic > mDisplayStringStats;
68+
static QList< QgsDateTimeStatisticalSummary::Statistic > mDisplayDateTimeStats;
69+
70+
void updateNumericStatistics( bool selectedOnly );
71+
void updateStringStatistics( bool selectedOnly );
72+
void updateDateTimeStatistics( bool selectedOnly );
73+
void addRow( int row, const QString& name, const QString& value, bool showValue );
6574
};
6675

6776
#endif // QGSSTATISTICALSUMMARYDOCKWIDGET_H

0 commit comments

Comments
 (0)
Please sign in to comment.