Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsdatetimestatisticalsummary.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 "qgsdatetimestatisticalsummary.h" 17 : : #include <QString> 18 : : #include <QDateTime> 19 : : #include <QStringList> 20 : : #include <QObject> 21 : : #include <QVariant> 22 : : #include <QVariantList> 23 : : #include <limits> 24 : : 25 : : /*************************************************************************** 26 : : * This class is considered CRITICAL and any change MUST be accompanied with 27 : : * full unit tests in test_qgsdatetimestatisticalsummary.py. 28 : : * See details in QEP #17 29 : : ****************************************************************************/ 30 : : 31 : 0 : QgsDateTimeStatisticalSummary::QgsDateTimeStatisticalSummary( QgsDateTimeStatisticalSummary::Statistics stats ) 32 : 0 : : mStatistics( stats ) 33 : : { 34 : 0 : reset(); 35 : 0 : } 36 : : 37 : 0 : void QgsDateTimeStatisticalSummary::reset() 38 : : { 39 : 0 : mCount = 0; 40 : 0 : mValues.clear(); 41 : 0 : mCountMissing = 0; 42 : 0 : mMin = QDateTime(); 43 : 0 : mMax = QDateTime(); 44 : 0 : mIsTimes = false; 45 : 0 : } 46 : : 47 : 0 : void QgsDateTimeStatisticalSummary::calculate( const QVariantList &values ) 48 : : { 49 : 0 : reset(); 50 : : 51 : 0 : const auto constValues = values; 52 : 0 : for ( const QVariant &variant : constValues ) 53 : : { 54 : 0 : addValue( variant ); 55 : : } 56 : 0 : finalize(); 57 : 0 : } 58 : : 59 : 0 : void QgsDateTimeStatisticalSummary::addValue( const QVariant &value ) 60 : : { 61 : : 62 : 0 : if ( value.type() == QVariant::DateTime ) 63 : : { 64 : 0 : testDateTime( value.toDateTime(), value.isNull() ); 65 : 0 : } 66 : 0 : else if ( value.type() == QVariant::Date ) 67 : : { 68 : 0 : QDate date = value.toDate(); 69 : 0 : testDateTime( date.isValid() ? QDateTime( date, QTime( 0, 0, 0 ) ) 70 : 0 : : QDateTime(), value.isNull() ); 71 : 0 : } 72 : 0 : else if ( value.type() == QVariant::Time ) 73 : : { 74 : 0 : mIsTimes = true; 75 : 0 : QTime time = value.toTime(); 76 : 0 : testDateTime( time.isValid() ? QDateTime( QDate::fromJulianDay( 0 ), time ) 77 : 0 : : QDateTime(), value.isNull() ); 78 : 0 : } 79 : : else //not a date 80 : : { 81 : 0 : mCountMissing++; 82 : 0 : mCount++; 83 : : } 84 : : 85 : : // QTime? 86 : 0 : } 87 : : 88 : 0 : void QgsDateTimeStatisticalSummary::finalize() 89 : : { 90 : : //nothing to do for now - this method has been added for forward compatibility 91 : : //if statistics are implemented which require a post-calculation step 92 : 0 : } 93 : : 94 : 0 : void QgsDateTimeStatisticalSummary::testDateTime( const QDateTime &dateTime, bool isNull ) 95 : : { 96 : 0 : mCount++; 97 : : 98 : 0 : if ( !dateTime.isValid() || isNull ) 99 : 0 : mCountMissing++; 100 : : 101 : 0 : if ( mStatistics & CountDistinct ) 102 : : { 103 : 0 : mValues << dateTime; 104 : 0 : } 105 : 0 : if ( mStatistics & Min || mStatistics & Range ) 106 : : { 107 : 0 : if ( mMin.isValid() && dateTime.isValid() ) 108 : : { 109 : 0 : mMin = std::min( mMin, dateTime ); 110 : 0 : } 111 : 0 : else if ( !mMin.isValid() && dateTime.isValid() ) 112 : : { 113 : 0 : mMin = dateTime; 114 : 0 : } 115 : 0 : } 116 : 0 : if ( mStatistics & Max || mStatistics & Range ) 117 : : { 118 : 0 : if ( mMax.isValid() && dateTime.isValid() ) 119 : : { 120 : 0 : mMax = std::max( mMax, dateTime ); 121 : 0 : } 122 : 0 : else if ( !mMax.isValid() && dateTime.isValid() ) 123 : : { 124 : 0 : mMax = dateTime; 125 : 0 : } 126 : 0 : } 127 : 0 : } 128 : : 129 : 0 : QVariant QgsDateTimeStatisticalSummary::statistic( QgsDateTimeStatisticalSummary::Statistic stat ) const 130 : : { 131 : 0 : switch ( stat ) 132 : : { 133 : : case Count: 134 : 0 : return mCount; 135 : : case CountDistinct: 136 : 0 : return mValues.count(); 137 : : case CountMissing: 138 : 0 : return mCountMissing; 139 : : case Min: 140 : 0 : return mIsTimes ? QVariant( mMin.time() ) : QVariant( mMin ); 141 : : case Max: 142 : 0 : return mIsTimes ? QVariant( mMax.time() ) : QVariant( mMax ); 143 : : case Range: 144 : 0 : return mIsTimes ? QVariant::fromValue( mMax.time() - mMin.time() ) : QVariant::fromValue( mMax - mMin ); 145 : : case All: 146 : 0 : return 0; 147 : : } 148 : 0 : return 0; 149 : 0 : } 150 : : 151 : 0 : QString QgsDateTimeStatisticalSummary::displayName( QgsDateTimeStatisticalSummary::Statistic statistic ) 152 : : { 153 : 0 : switch ( statistic ) 154 : : { 155 : : case Count: 156 : 0 : return QObject::tr( "Count" ); 157 : : case CountDistinct: 158 : 0 : return QObject::tr( "Count (distinct)" ); 159 : : case CountMissing: 160 : 0 : return QObject::tr( "Count (missing)" ); 161 : : case Min: 162 : 0 : return QObject::tr( "Minimum (earliest)" ); 163 : : case Max: 164 : 0 : return QObject::tr( "Maximum (latest)" ); 165 : : case Range: 166 : 0 : return QObject::tr( "Range (interval)" ); 167 : : case All: 168 : 0 : return QString(); 169 : : } 170 : 0 : return QString(); 171 : 0 : } 172 : :