diff --git a/core/include/Variable/Variable.h b/core/include/Variable/Variable.h index dcea562..5a6a9ed 100644 --- a/core/include/Variable/Variable.h +++ b/core/include/Variable/Variable.h @@ -28,17 +28,26 @@ public: const QVariantHash &metadata = {}); QString name() const noexcept; - SqpRange dateTime() const noexcept; - void setDateTime(const SqpRange &dateTime) noexcept; + SqpRange range() const noexcept; + void setRange(const SqpRange &range) noexcept; + SqpRange cacheRange() const noexcept; + void setCacheRange(const SqpRange &cacheRange) noexcept; /// @return the data of the variable, nullptr if there is no data IDataSeries *dataSeries() const noexcept; QVariantHash metadata() const noexcept; - bool contains(const SqpRange &dateTime) const noexcept; - bool intersect(const SqpRange &dateTime) const noexcept; - bool isInside(const SqpRange &dateTime) const noexcept; + bool contains(const SqpRange &range) const noexcept; + bool intersect(const SqpRange &range) const noexcept; + bool isInside(const SqpRange &range) const noexcept; + + bool cacheContains(const SqpRange &range) const noexcept; + bool cacheIntersect(const SqpRange &range) const noexcept; + bool cacheIsInside(const SqpRange &range) const noexcept; + + QVector provideNotInCacheRangeList(const SqpRange &range); + public slots: void setDataSeries(std::shared_ptr dataSeries) noexcept; diff --git a/core/src/Variable/Variable.cpp b/core/src/Variable/Variable.cpp index c64269d..494cce7 100644 --- a/core/src/Variable/Variable.cpp +++ b/core/src/Variable/Variable.cpp @@ -11,13 +11,14 @@ Q_LOGGING_CATEGORY(LOG_Variable, "Variable") struct Variable::VariablePrivate { explicit VariablePrivate(const QString &name, const SqpRange &dateTime, const QVariantHash &metadata) - : m_Name{name}, m_DateTime{dateTime}, m_Metadata{metadata}, m_DataSeries{nullptr} + : m_Name{name}, m_Range{dateTime}, m_Metadata{metadata}, m_DataSeries{nullptr} { } QString m_Name; - SqpRange m_DateTime; // The dateTime available in the view and loaded. not the cache. + SqpRange m_Range; + SqpRange m_CacheRange; QVariantHash m_Metadata; std::unique_ptr m_DataSeries; }; @@ -32,14 +33,24 @@ QString Variable::name() const noexcept return impl->m_Name; } -SqpRange Variable::dateTime() const noexcept +SqpRange Variable::range() const noexcept { - return impl->m_DateTime; + return impl->m_Range; } -void Variable::setDateTime(const SqpRange &dateTime) noexcept +void Variable::setRange(const SqpRange &range) noexcept { - impl->m_DateTime = dateTime; + impl->m_Range = range; +} + +SqpRange Variable::cacheRange() const noexcept +{ + return impl->m_CacheRange; +} + +void Variable::setCacheRange(const SqpRange &cacheRange) noexcept +{ + impl->m_CacheRange = cacheRange; } void Variable::setDataSeries(std::shared_ptr dataSeries) noexcept @@ -56,7 +67,6 @@ void Variable::setDataSeries(std::shared_ptr dataSeries) noexcept } else { impl->m_DataSeries->merge(dataSeries.get()); - // emit updated(); } } @@ -70,17 +80,63 @@ QVariantHash Variable::metadata() const noexcept return impl->m_Metadata; } -bool Variable::contains(const SqpRange &dateTime) const noexcept +bool Variable::contains(const SqpRange &range) const noexcept { - return impl->m_DateTime.contains(dateTime); + return impl->m_Range.contains(range); } -bool Variable::intersect(const SqpRange &dateTime) const noexcept +bool Variable::intersect(const SqpRange &range) const noexcept { - return impl->m_DateTime.intersect(dateTime); + return impl->m_Range.intersect(range); } -bool Variable::isInside(const SqpRange &dateTime) const noexcept +bool Variable::isInside(const SqpRange &range) const noexcept { - return dateTime.contains(SqpRange{impl->m_DateTime.m_TStart, impl->m_DateTime.m_TEnd}); + return range.contains(SqpRange{impl->m_Range.m_TStart, impl->m_Range.m_TEnd}); +} + +bool Variable::cacheContains(const SqpRange &range) const noexcept +{ + return impl->m_CacheRange.contains(range); +} + +bool Variable::cacheIntersect(const SqpRange &range) const noexcept +{ + return impl->m_CacheRange.intersect(range); +} + +bool Variable::cacheIsInside(const SqpRange &range) const noexcept +{ + return range.contains(SqpRange{impl->m_CacheRange.m_TStart, impl->m_CacheRange.m_TEnd}); +} + + +QVector Variable::provideNotInCacheRangeList(const SqpRange &range) +{ + auto notInCache = QVector{}; + + if (!this->cacheContains(range)) { + if (range.m_TEnd <= impl->m_CacheRange.m_TStart + || range.m_TStart >= impl->m_CacheRange.m_TEnd) { + notInCache << range; + } + else if (range.m_TStart < impl->m_CacheRange.m_TStart + && range.m_TEnd <= impl->m_CacheRange.m_TEnd) { + notInCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TStart}; + } + else if (range.m_TStart < impl->m_CacheRange.m_TStart + && range.m_TEnd > impl->m_CacheRange.m_TEnd) { + notInCache << SqpRange{range.m_TStart, impl->m_CacheRange.m_TStart} + << SqpRange{impl->m_CacheRange.m_TEnd, range.m_TStart}; + } + else if (range.m_TStart < impl->m_CacheRange.m_TEnd) { + notInCache << SqpRange{impl->m_CacheRange.m_TEnd, range.m_TStart}; + } + else { + qCCritical(LOG_Variable()) << tr("Detection of unknown case.") + << QThread::currentThread(); + } + } + + return notInCache; }