Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsstringstatisticalsummary.cpp 3 : : ------------------------------- 4 : : Date : May 2016 5 : : Copyright : (C) 2016 by Nyall Dawson 6 : : Email : nyall dot dawson at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgsstringstatisticalsummary.h" 17 : : #include <QString> 18 : : #include <QStringList> 19 : : #include <QObject> 20 : : #include <QVariant> 21 : : #include <QVariantList> 22 : : #include <limits> 23 : : 24 : : /*************************************************************************** 25 : : * This class is considered CRITICAL and any change MUST be accompanied with 26 : : * full unit tests in test_qgsstringstatisticalsummary.py. 27 : : * See details in QEP #17 28 : : ****************************************************************************/ 29 : : 30 : 0 : QgsStringStatisticalSummary::QgsStringStatisticalSummary( QgsStringStatisticalSummary::Statistics stats ) 31 : 0 : : mStatistics( stats ) 32 : : { 33 : 0 : reset(); 34 : 0 : } 35 : : 36 : 0 : void QgsStringStatisticalSummary::reset() 37 : : { 38 : 0 : mCount = 0; 39 : 0 : mValues.clear(); 40 : 0 : mCountMissing = 0; 41 : 0 : mMin.clear(); 42 : 0 : mMax.clear(); 43 : 0 : mMinLength = std::numeric_limits<int>::max(); 44 : 0 : mMaxLength = 0; 45 : 0 : mSumLengths = 0; 46 : 0 : mMeanLength = 0; 47 : 0 : mMinority = QString(); 48 : 0 : mMajority = QString(); 49 : 0 : } 50 : : 51 : 0 : void QgsStringStatisticalSummary::calculate( const QStringList &values ) 52 : : { 53 : 0 : reset(); 54 : : 55 : 0 : const auto constValues = values; 56 : 0 : for ( const QString &string : constValues ) 57 : : { 58 : 0 : testString( string ); 59 : : } 60 : 0 : finalize(); 61 : 0 : } 62 : : 63 : 0 : void QgsStringStatisticalSummary::addString( const QString &string ) 64 : : { 65 : 0 : testString( string ); 66 : 0 : } 67 : : 68 : 0 : void QgsStringStatisticalSummary::addValue( const QVariant &value ) 69 : : { 70 : 0 : if ( value.type() == QVariant::String ) 71 : : { 72 : 0 : testString( value.toString() ); 73 : 0 : } 74 : 0 : finalize(); 75 : 0 : } 76 : : 77 : 0 : void QgsStringStatisticalSummary::finalize() 78 : : { 79 : 0 : mMeanLength = mSumLengths / static_cast< double >( mCount ); 80 : : 81 : 0 : if ( mStatistics & Minority || mStatistics & Majority ) 82 : : { 83 : 0 : QList<int> valueCounts = mValues.values(); 84 : : 85 : 0 : if ( mStatistics & Minority ) 86 : : { 87 : 0 : mMinority = mValues.key( *std::min_element( valueCounts.begin(), valueCounts.end() ) ); 88 : 0 : } 89 : 0 : if ( mStatistics & Majority ) 90 : : { 91 : 0 : mMajority = mValues.key( *std::max_element( valueCounts.begin(), valueCounts.end() ) ); 92 : 0 : } 93 : 0 : } 94 : 0 : } 95 : : 96 : 0 : void QgsStringStatisticalSummary::calculateFromVariants( const QVariantList &values ) 97 : : { 98 : 0 : reset(); 99 : : 100 : 0 : const auto constValues = values; 101 : 0 : for ( const QVariant &variant : constValues ) 102 : : { 103 : 0 : if ( variant.type() == QVariant::String ) 104 : : { 105 : 0 : testString( variant.toString() ); 106 : 0 : } 107 : : } 108 : : 109 : 0 : finalize(); 110 : 0 : } 111 : : 112 : 0 : void QgsStringStatisticalSummary::testString( const QString &string ) 113 : : { 114 : 0 : mCount++; 115 : : 116 : 0 : if ( string.isEmpty() ) 117 : 0 : mCountMissing++; 118 : : 119 : 0 : if ( mStatistics & CountDistinct || mStatistics & Majority || mStatistics & Minority ) 120 : : { 121 : 0 : mValues[string]++; 122 : 0 : } 123 : 0 : if ( mStatistics & Min ) 124 : : { 125 : 0 : if ( !mMin.isEmpty() && !string.isEmpty() ) 126 : : { 127 : 0 : mMin = std::min( mMin, string ); 128 : 0 : } 129 : 0 : else if ( mMin.isEmpty() && !string.isEmpty() ) 130 : : { 131 : 0 : mMin = string; 132 : 0 : } 133 : 0 : } 134 : 0 : if ( mStatistics & Max ) 135 : : { 136 : 0 : if ( !mMax.isEmpty() && !string.isEmpty() ) 137 : : { 138 : 0 : mMax = std::max( mMax, string ); 139 : 0 : } 140 : 0 : else if ( mMax.isEmpty() && !string.isEmpty() ) 141 : : { 142 : 0 : mMax = string; 143 : 0 : } 144 : 0 : } 145 : 0 : if ( mStatistics & MeanLength ) 146 : 0 : mSumLengths += string.length(); 147 : 0 : mMinLength = std::min( mMinLength, static_cast<int>( string.length() ) ); 148 : 0 : mMaxLength = std::max( mMaxLength, static_cast<int>( string.length() ) ); 149 : 0 : } 150 : : 151 : 0 : QVariant QgsStringStatisticalSummary::statistic( QgsStringStatisticalSummary::Statistic stat ) const 152 : : { 153 : 0 : switch ( stat ) 154 : : { 155 : : case Count: 156 : 0 : return mCount; 157 : : case CountDistinct: 158 : 0 : return mValues.count(); 159 : : case CountMissing: 160 : 0 : return mCountMissing; 161 : : case Min: 162 : 0 : return mMin; 163 : : case Max: 164 : 0 : return mMax; 165 : : case MinimumLength: 166 : 0 : return mMinLength; 167 : : case MaximumLength: 168 : 0 : return mMaxLength; 169 : : case MeanLength: 170 : 0 : return mMeanLength; 171 : : case Minority: 172 : 0 : return mMinority; 173 : : case Majority: 174 : 0 : return mMajority; 175 : : case All: 176 : 0 : return 0; 177 : : } 178 : 0 : return 0; 179 : 0 : } 180 : : 181 : 0 : QString QgsStringStatisticalSummary::displayName( QgsStringStatisticalSummary::Statistic statistic ) 182 : : { 183 : 0 : switch ( statistic ) 184 : : { 185 : : case Count: 186 : 0 : return QObject::tr( "Count" ); 187 : : case CountDistinct: 188 : 0 : return QObject::tr( "Count (distinct)" ); 189 : : case CountMissing: 190 : 0 : return QObject::tr( "Count (missing)" ); 191 : : case Min: 192 : 0 : return QObject::tr( "Minimum" ); 193 : : case Max: 194 : 0 : return QObject::tr( "Maximum" ); 195 : : case MinimumLength: 196 : 0 : return QObject::tr( "Minimum length" ); 197 : : case MaximumLength: 198 : 0 : return QObject::tr( "Maximum length" ); 199 : : case MeanLength: 200 : 0 : return QObject::tr( "Mean length" ); 201 : : case Minority: 202 : 0 : return QObject::tr( "Minority" ); 203 : : case Majority: 204 : 0 : return QObject::tr( "Majority" ); 205 : : case All: 206 : 0 : return QString(); 207 : : } 208 : 0 : return QString(); 209 : 0 : } 210 : :