From d5ec3b1db330f0aa7552d40902f8414c6b82218e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Mon, 18 Jun 2018 14:10:11 +0200 Subject: [PATCH] #3057 Resampled plot export. Add more resample periods. Add unit tests --- .../Application/Tools/RiaQDateTimeTools.cpp | 22 +- .../Application/Tools/RiaQDateTimeTools.h | 6 + .../Tools/RiaTimeHistoryCurveResampler.cpp | 3 +- .../RiaTimeHistoryCurveTools-Test.cpp | 199 ++++++++++++++++++ 4 files changed, 224 insertions(+), 6 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp b/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp index 63356ad392..0f9d6f533a 100644 --- a/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp +++ b/ApplicationCode/Application/Tools/RiaQDateTimeTools.cpp @@ -32,7 +32,10 @@ //-------------------------------------------------------------------------------------------------- const DateTimeSpan RiaQDateTimeTools::TIMESPAN_DECADE = DateTimeSpan(10, 0, 0); const DateTimeSpan RiaQDateTimeTools::TIMESPAN_YEAR = DateTimeSpan(1, 0, 0); +const DateTimeSpan RiaQDateTimeTools::TIMESPAN_HALFYEAR = DateTimeSpan(0, 6, 0); +const DateTimeSpan RiaQDateTimeTools::TIMESPAN_QUARTER = DateTimeSpan(0, 3, 0); const DateTimeSpan RiaQDateTimeTools::TIMESPAN_MONTH = DateTimeSpan(0, 1, 0); +const DateTimeSpan RiaQDateTimeTools::TIMESPAN_WEEK = DateTimeSpan(0, 0, 7); const DateTimeSpan RiaQDateTimeTools::TIMESPAN_DAY = DateTimeSpan(0, 0, 1); @@ -260,7 +263,10 @@ const DateTimeSpan RiaQDateTimeTools::timeSpan(DateTimePeriod period) { case DateTimePeriod::DECADE: return TIMESPAN_DECADE; case DateTimePeriod::YEAR: return TIMESPAN_YEAR; + case DateTimePeriod::HALFYEAR: return TIMESPAN_HALFYEAR; + case DateTimePeriod::QUARTER: return TIMESPAN_QUARTER; case DateTimePeriod::MONTH: return TIMESPAN_MONTH; + case DateTimePeriod::WEEK: return TIMESPAN_WEEK; case DateTimePeriod::DAY: return TIMESPAN_DAY; } CVF_ASSERT(false); @@ -272,12 +278,20 @@ const DateTimeSpan RiaQDateTimeTools::timeSpan(DateTimePeriod period) //-------------------------------------------------------------------------------------------------- QDateTime RiaQDateTimeTools::truncateTime(const QDateTime& dt, DateTimePeriod period) { + int y = dt.date().year(); + int m = dt.date().month(); + int d = dt.date().day(); + int dow = dt.date().dayOfWeek(); + switch (period) { - case DateTimePeriod::DECADE: return createUtcDateTime(QDate((dt.date().year() / 10) * 10, 1, 1)); - case DateTimePeriod::YEAR: return createUtcDateTime(QDate(dt.date().year(), 1, 1)); - case DateTimePeriod::MONTH: return createUtcDateTime(QDate(dt.date().year(), dt.date().month(), 1)); - case DateTimePeriod::DAY: return createUtcDateTime(QDate(dt.date().year(), dt.date().month(), dt.date().day())); + case DateTimePeriod::DECADE: return createUtcDateTime(QDate((y / 10) * 10, 1, 1)); + case DateTimePeriod::YEAR: return createUtcDateTime(QDate(y, 1, 1)); + case DateTimePeriod::HALFYEAR: return createUtcDateTime(QDate(y, ((m - 1) / 6) * 6 + 1, 1)); + case DateTimePeriod::QUARTER: return createUtcDateTime(QDate(y, ((m - 1) / 3) * 3 + 1, 1)); + case DateTimePeriod::MONTH: return createUtcDateTime(QDate(y, m, 1)); + case DateTimePeriod::WEEK: return createUtcDateTime(QDate(y, m, d).addDays(-dow + 1)); + case DateTimePeriod::DAY: return createUtcDateTime(QDate(y, m, d)); } CVF_ASSERT(false); return createUtcDateTime(); diff --git a/ApplicationCode/Application/Tools/RiaQDateTimeTools.h b/ApplicationCode/Application/Tools/RiaQDateTimeTools.h index dac0454b77..dd4ad2c2d7 100644 --- a/ApplicationCode/Application/Tools/RiaQDateTimeTools.h +++ b/ApplicationCode/Application/Tools/RiaQDateTimeTools.h @@ -35,7 +35,10 @@ enum class DateTimePeriod { DECADE, YEAR, + HALFYEAR, + QUARTER, MONTH, + WEEK, DAY }; @@ -46,7 +49,10 @@ class RiaQDateTimeTools { static const DateTimeSpan TIMESPAN_DECADE; static const DateTimeSpan TIMESPAN_YEAR; + static const DateTimeSpan TIMESPAN_HALFYEAR; + static const DateTimeSpan TIMESPAN_QUARTER; static const DateTimeSpan TIMESPAN_MONTH; + static const DateTimeSpan TIMESPAN_WEEK; static const DateTimeSpan TIMESPAN_DAY; public: diff --git a/ApplicationCode/Application/Tools/RiaTimeHistoryCurveResampler.cpp b/ApplicationCode/Application/Tools/RiaTimeHistoryCurveResampler.cpp index 434ff6c2a1..ae9fd3337c 100644 --- a/ApplicationCode/Application/Tools/RiaTimeHistoryCurveResampler.cpp +++ b/ApplicationCode/Application/Tools/RiaTimeHistoryCurveResampler.cpp @@ -192,10 +192,9 @@ void RiaTimeHistoryCurveResampler::computeResampledTimeSteps(DateTimePeriod peri clearData(); auto currTimeStep = firstResampledTimeStep(firstOriginalTimeStep, period); + while (QDT::lessThanOrEqualTo(currTimeStep, lastOriginalTimeStep)) { - auto ss1 = currTimeStep.toString(); - m_timeSteps.push_back(currTimeStep.toTime_t()); currTimeStep = QDT::addPeriod(currTimeStep, period); } diff --git a/ApplicationCode/UnitTests/RiaTimeHistoryCurveTools-Test.cpp b/ApplicationCode/UnitTests/RiaTimeHistoryCurveTools-Test.cpp index 11609b9bf4..da6115c5fd 100644 --- a/ApplicationCode/UnitTests/RiaTimeHistoryCurveTools-Test.cpp +++ b/ApplicationCode/UnitTests/RiaTimeHistoryCurveTools-Test.cpp @@ -46,6 +46,205 @@ TEST(RiaTimeHistoryCurveResampler, Test_Resampling_NoPeriod) EXPECT_EQ(0, (int)resampler.resampledTimeSteps().size()); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST(RiaTimeHistoryCurveResampler, Test_Resampling_Decade) +{ + std::vector timeStrings( + { + "1989-02-03", + "2005-06-06", + "2012-02-07" + } + ); + + std::vector dataValues( + { + 0.0, + 0.0, + 0.0 + } + ); + + RiaTimeHistoryCurveResampler resampler; + resampler.setCurveData(dataValues, toTime_tVector(timeStrings)); + resampler.resampleAndComputeWeightedMeanValues(DateTimePeriod::DECADE); + + EXPECT_EQ(3, (int)resampler.resampledTimeSteps().size()); + EXPECT_EQ(toTime_t("1990-01-01"), resampler.resampledTimeSteps()[0]); + EXPECT_EQ(toTime_t("2000-01-01"), resampler.resampledTimeSteps()[1]); + EXPECT_EQ(toTime_t("2010-01-01"), resampler.resampledTimeSteps()[2]); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST(RiaTimeHistoryCurveResampler, Test_Resampling_Year) +{ + std::vector timeStrings( + { + "2014-06-06", + "2015-12-02", + "2018-02-07" + } + ); + + std::vector dataValues( + { + 0.0, + 0.0, + 0.0 + } + ); + + RiaTimeHistoryCurveResampler resampler; + resampler.setCurveData(dataValues, toTime_tVector(timeStrings)); + resampler.resampleAndComputeWeightedMeanValues(DateTimePeriod::YEAR); + + EXPECT_EQ(4, (int)resampler.resampledTimeSteps().size()); + EXPECT_EQ(toTime_t("2015-01-01"), resampler.resampledTimeSteps()[0]); + EXPECT_EQ(toTime_t("2016-01-01"), resampler.resampledTimeSteps()[1]); + EXPECT_EQ(toTime_t("2017-01-01"), resampler.resampledTimeSteps()[2]); + EXPECT_EQ(toTime_t("2018-01-01"), resampler.resampledTimeSteps()[3]); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST(RiaTimeHistoryCurveResampler, Test_Resampling_HalfYear) +{ + std::vector timeStrings( + { + "2016-06-06", + "2017-03-02", + "2018-02-07" + } + ); + + std::vector dataValues( + { + 0.0, + 0.0, + 0.0 + } + ); + + RiaTimeHistoryCurveResampler resampler; + resampler.setCurveData(dataValues, toTime_tVector(timeStrings)); + resampler.resampleAndComputeWeightedMeanValues(DateTimePeriod::HALFYEAR); + + EXPECT_EQ(4, (int)resampler.resampledTimeSteps().size()); + EXPECT_EQ(toTime_t("2016-07-01"), resampler.resampledTimeSteps()[0]); + EXPECT_EQ(toTime_t("2017-01-01"), resampler.resampledTimeSteps()[1]); + EXPECT_EQ(toTime_t("2017-07-01"), resampler.resampledTimeSteps()[2]); + EXPECT_EQ(toTime_t("2018-01-01"), resampler.resampledTimeSteps()[3]); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST(RiaTimeHistoryCurveResampler, Test_Resampling_Quarter) +{ + std::vector timeStrings( + { + "2016-09-06", + "2017-03-02", + "2018-02-07" + } + ); + + std::vector dataValues( + { + 0.0, + 0.0, + 0.0 + } + ); + + RiaTimeHistoryCurveResampler resampler; + resampler.setCurveData(dataValues, toTime_tVector(timeStrings)); + resampler.resampleAndComputeWeightedMeanValues(DateTimePeriod::QUARTER); + + EXPECT_EQ(6, (int)resampler.resampledTimeSteps().size()); + EXPECT_EQ(toTime_t("2016-10-01"), resampler.resampledTimeSteps()[0]); + EXPECT_EQ(toTime_t("2017-01-01"), resampler.resampledTimeSteps()[1]); + EXPECT_EQ(toTime_t("2017-04-01"), resampler.resampledTimeSteps()[2]); + EXPECT_EQ(toTime_t("2017-07-01"), resampler.resampledTimeSteps()[3]); + EXPECT_EQ(toTime_t("2017-10-01"), resampler.resampledTimeSteps()[4]); + EXPECT_EQ(toTime_t("2018-01-01"), resampler.resampledTimeSteps()[5]); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST(RiaTimeHistoryCurveResampler, Test_Resampling_Month) +{ + std::vector timeStrings( + { + "2017-09-06", + "2017-12-02", + "2018-02-07" + } + ); + + std::vector dataValues( + { + 0.0, + 0.0, + 0.0 + } + ); + + RiaTimeHistoryCurveResampler resampler; + resampler.setCurveData(dataValues, toTime_tVector(timeStrings)); + resampler.resampleAndComputeWeightedMeanValues(DateTimePeriod::MONTH); + + EXPECT_EQ(5, (int)resampler.resampledTimeSteps().size()); + EXPECT_EQ(toTime_t("2017-10-01"), resampler.resampledTimeSteps()[0]); + EXPECT_EQ(toTime_t("2017-11-01"), resampler.resampledTimeSteps()[1]); + EXPECT_EQ(toTime_t("2017-12-01"), resampler.resampledTimeSteps()[2]); + EXPECT_EQ(toTime_t("2018-01-01"), resampler.resampledTimeSteps()[3]); + EXPECT_EQ(toTime_t("2018-02-01"), resampler.resampledTimeSteps()[4]); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST(RiaTimeHistoryCurveResampler, Test_Resampling_Week) +{ + std::vector timeStrings( + { + "2017-11-02", + "2017-12-24", + "2018-01-07" + } + ); + + std::vector dataValues( + { + 0.0, + 0.0, + 0.0 + } + ); + + RiaTimeHistoryCurveResampler resampler; + resampler.setCurveData(dataValues, toTime_tVector(timeStrings)); + resampler.resampleAndComputeWeightedMeanValues(DateTimePeriod::WEEK); + + EXPECT_EQ(9, (int)resampler.resampledTimeSteps().size()); + EXPECT_EQ(toTime_t("2017-11-06"), resampler.resampledTimeSteps()[0]); + EXPECT_EQ(toTime_t("2017-11-13"), resampler.resampledTimeSteps()[1]); + EXPECT_EQ(toTime_t("2017-11-20"), resampler.resampledTimeSteps()[2]); + EXPECT_EQ(toTime_t("2017-11-27"), resampler.resampledTimeSteps()[3]); + EXPECT_EQ(toTime_t("2017-12-04"), resampler.resampledTimeSteps()[4]); + EXPECT_EQ(toTime_t("2017-12-11"), resampler.resampledTimeSteps()[5]); + EXPECT_EQ(toTime_t("2017-12-18"), resampler.resampledTimeSteps()[6]); + EXPECT_EQ(toTime_t("2017-12-25"), resampler.resampledTimeSteps()[7]); + EXPECT_EQ(toTime_t("2018-01-01"), resampler.resampledTimeSteps()[8]); +} + //-------------------------------------------------------------------------------------------------- /// //--------------------------------------------------------------------------------------------------