diff --git a/core/src/Variable/Variable.cpp b/core/src/Variable/Variable.cpp index aad63c4..2148365 100644 --- a/core/src/Variable/Variable.cpp +++ b/core/src/Variable/Variable.cpp @@ -219,19 +219,24 @@ QVector Variable::provideInCacheRangeList(const SqpRange &range) const auto inCache = QVector{}; - if (this->cacheContains(range)) { - if (range.m_TStart <= impl->m_CacheRange.m_TEnd - && range.m_TEnd >= impl->m_CacheRange.m_TEnd) { - inCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TEnd}; + if (this->intersect(range)) { + if (range.m_TStart <= impl->m_CacheRange.m_TStart + && range.m_TEnd >= impl->m_CacheRange.m_TStart + && range.m_TEnd < impl->m_CacheRange.m_TEnd) { + inCache << SqpRange{impl->m_CacheRange.m_TStart, range.m_TEnd}; } else if (range.m_TStart >= impl->m_CacheRange.m_TStart - && range.m_TEnd < impl->m_CacheRange.m_TEnd) { + && range.m_TEnd <= impl->m_CacheRange.m_TEnd) { inCache << range; } - else if (range.m_TStart < impl->m_CacheRange.m_TStart - && range.m_TEnd >= impl->m_CacheRange.m_TStart) { - inCache << SqpRange{impl->m_CacheRange.m_TStart, range.m_TEnd}; + else if (range.m_TStart > impl->m_CacheRange.m_TStart + && range.m_TEnd > impl->m_CacheRange.m_TEnd) { + inCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TEnd}; + } + else if (range.m_TStart <= impl->m_CacheRange.m_TStart + && range.m_TEnd >= impl->m_CacheRange.m_TEnd) { + inCache << impl->m_CacheRange; } else { qCCritical(LOG_Variable()) << tr("Detection of unknown case.") diff --git a/core/tests/Variable/TestVariable.cpp b/core/tests/Variable/TestVariable.cpp new file mode 100644 index 0000000..1228ddc --- /dev/null +++ b/core/tests/Variable/TestVariable.cpp @@ -0,0 +1,188 @@ +#include + +#include +#include + +#include + +class TestVariable : public QObject { + Q_OBJECT + +private slots: + void testNotInCacheRangeList(); + + void testInCacheRangeList(); +}; + + +void TestVariable::testNotInCacheRangeList() +{ + auto varRS = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 20, 0}}; + auto varRE = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 40, 0}}; + + auto sqpR = SqpRange{static_cast(varRS.toMSecsSinceEpoch()), + static_cast(varRE.toMSecsSinceEpoch())}; + + auto varCRS = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 0, 0}}; + auto varCRE = QDateTime{QDate{2017, 01, 01}, QTime{2, 4, 0, 0}}; + auto sqpCR = SqpRange{static_cast(varCRS.toMSecsSinceEpoch()), + static_cast(varCRE.toMSecsSinceEpoch())}; + + Variable var{"Var test", sqpR}; + var.setCacheRange(sqpCR); + + // 1: [ts,te] < varTS + auto ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 0, 0, 0}}; + auto te = QDateTime{QDate{2017, 01, 01}, QTime{2, 1, 0, 0}}; + auto sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + + auto notInCach = var.provideNotInCacheRangeList(sqp); + + QCOMPARE(notInCach.size(), 1); + + auto notInCachRange = notInCach.first(); + + QCOMPARE(notInCachRange.m_TStart, static_cast(ts.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(te.toMSecsSinceEpoch())); + + // 2: ts < varTS < te < varTE + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 0, 0, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 30, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideNotInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(ts.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(varCRS.toMSecsSinceEpoch())); + + // 3: varTS < ts < te < varTE + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 20, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 30, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideNotInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 0); + + + // 4: varTS < ts < varTE < te + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 20, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 5, 0, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideNotInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(varCRE.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(te.toMSecsSinceEpoch())); + + // 5: varTS < varTE < ts < te + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 4, 20, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 5, 0, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideNotInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(ts.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(te.toMSecsSinceEpoch())); + + // 6: ts (ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideNotInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 2); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(ts.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(varCRS.toMSecsSinceEpoch())); + notInCachRange = notInCach[1]; + QCOMPARE(notInCachRange.m_TStart, static_cast(varCRE.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(te.toMSecsSinceEpoch())); +} + + +void TestVariable::testInCacheRangeList() +{ + auto varRS = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 20, 0}}; + auto varRE = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 40, 0}}; + + auto sqpR = SqpRange{static_cast(varRS.toMSecsSinceEpoch()), + static_cast(varRE.toMSecsSinceEpoch())}; + + auto varCRS = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 0, 0}}; + auto varCRE = QDateTime{QDate{2017, 01, 01}, QTime{2, 4, 0, 0}}; + auto sqpCR = SqpRange{static_cast(varCRS.toMSecsSinceEpoch()), + static_cast(varCRE.toMSecsSinceEpoch())}; + + Variable var{"Var test", sqpR}; + var.setCacheRange(sqpCR); + + // 1: [ts,te] < varTS + auto ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 0, 0, 0}}; + auto te = QDateTime{QDate{2017, 01, 01}, QTime{2, 1, 0, 0}}; + auto sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + + auto notInCach = var.provideInCacheRangeList(sqp); + + QCOMPARE(notInCach.size(), 0); + + // 2: ts < varTS < te < varTE + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 0, 0, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 30, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + auto notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(varCRS.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(te.toMSecsSinceEpoch())); + + // 3: varTS < ts < te < varTE + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 20, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 30, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(ts.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(te.toMSecsSinceEpoch())); + + // 4: varTS < ts < varTE < te + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 3, 20, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 5, 0, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(ts.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(varCRE.toMSecsSinceEpoch())); + + // 5: varTS < varTE < ts < te + ts = QDateTime{QDate{2017, 01, 01}, QTime{2, 4, 20, 0}}; + te = QDateTime{QDate{2017, 01, 01}, QTime{2, 5, 0, 0}}; + sqp = SqpRange{static_cast(ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 0); + + // 6: ts (ts.toMSecsSinceEpoch()), + static_cast(te.toMSecsSinceEpoch())}; + notInCach = var.provideInCacheRangeList(sqp); + QCOMPARE(notInCach.size(), 1); + notInCachRange = notInCach.first(); + QCOMPARE(notInCachRange.m_TStart, static_cast(varCRS.toMSecsSinceEpoch())); + QCOMPARE(notInCachRange.m_TEnd, static_cast(varCRE.toMSecsSinceEpoch())); +} + + +QTEST_MAIN(TestVariable) +#include "TestVariable.moc"