VariableController.cpp
164 lines
| 5.6 KiB
| text/x-c
|
CppLexer
r235 | #include <Variable/Variable.h> | |||
r225 | #include <Variable/VariableCacheController.h> | |||
Alexandre Leroux
|
r111 | #include <Variable/VariableController.h> | ||
Alexandre Leroux
|
r113 | #include <Variable/VariableModel.h> | ||
Alexandre Leroux
|
r111 | |||
Alexandre Leroux
|
r166 | #include <Data/DataProviderParameters.h> | ||
#include <Data/IDataProvider.h> | ||||
#include <Data/IDataSeries.h> | ||||
r193 | #include <Time/TimeController.h> | |||
Alexandre Leroux
|
r166 | |||
#include <QDateTime> | ||||
r235 | #include <QElapsedTimer> | |||
Alexandre Leroux
|
r111 | #include <QMutex> | ||
#include <QThread> | ||||
r225 | #include <unordered_map> | |||
Alexandre Leroux
|
r111 | Q_LOGGING_CATEGORY(LOG_VariableController, "VariableController") | ||
Alexandre Leroux
|
r166 | namespace { | ||
/// @todo Generates default dataseries, according to the provider passed in parameter. This method | ||||
/// will be deleted when the timerange is recovered from SciQlop | ||||
r193 | std::unique_ptr<IDataSeries> generateDefaultDataSeries(const IDataProvider &provider, | |||
const SqpDateTime &dateTime) noexcept | ||||
Alexandre Leroux
|
r166 | { | ||
r193 | auto parameters = DataProviderParameters{dateTime}; | |||
Alexandre Leroux
|
r166 | |||
return provider.retrieveData(parameters); | ||||
} | ||||
} // namespace | ||||
Alexandre Leroux
|
r111 | struct VariableController::VariableControllerPrivate { | ||
Alexandre Leroux
|
r159 | explicit VariableControllerPrivate(VariableController *parent) | ||
r225 | : m_WorkingMutex{}, | |||
m_VariableModel{new VariableModel{parent}}, | ||||
m_VariableCacheController{std::make_unique<VariableCacheController>()} | ||||
Alexandre Leroux
|
r111 | { | ||
} | ||||
QMutex m_WorkingMutex; | ||||
Alexandre Leroux
|
r159 | /// Variable model. The VariableController has the ownership | ||
VariableModel *m_VariableModel; | ||||
r193 | ||||
r225 | ||||
r195 | TimeController *m_TimeController{nullptr}; | |||
r225 | std::unique_ptr<VariableCacheController> m_VariableCacheController; | |||
r235 | ||||
std::unordered_map<std::shared_ptr<Variable>, std::shared_ptr<IDataProvider> > | ||||
m_VariableToProviderMap; | ||||
Alexandre Leroux
|
r111 | }; | ||
VariableController::VariableController(QObject *parent) | ||||
Alexandre Leroux
|
r159 | : QObject{parent}, impl{spimpl::make_unique_impl<VariableControllerPrivate>(this)} | ||
Alexandre Leroux
|
r111 | { | ||
r134 | qCDebug(LOG_VariableController()) << tr("VariableController construction") | |||
<< QThread::currentThread(); | ||||
Alexandre Leroux
|
r111 | } | ||
VariableController::~VariableController() | ||||
{ | ||||
r134 | qCDebug(LOG_VariableController()) << tr("VariableController destruction") | |||
<< QThread::currentThread(); | ||||
Alexandre Leroux
|
r111 | this->waitForFinish(); | ||
} | ||||
Alexandre Leroux
|
r166 | VariableModel *VariableController::variableModel() noexcept | ||
Alexandre Leroux
|
r113 | { | ||
Alexandre Leroux
|
r166 | return impl->m_VariableModel; | ||
Alexandre Leroux
|
r113 | } | ||
r193 | void VariableController::setTimeController(TimeController *timeController) noexcept | |||
{ | ||||
impl->m_TimeController = timeController; | ||||
} | ||||
Alexandre Leroux
|
r166 | void VariableController::createVariable(const QString &name, | ||
std::shared_ptr<IDataProvider> provider) noexcept | ||||
Alexandre Leroux
|
r152 | { | ||
r193 | ||||
if (!impl->m_TimeController) { | ||||
qCCritical(LOG_VariableController()) | ||||
<< tr("Impossible to create variable: The time controller is null"); | ||||
return; | ||||
} | ||||
Alexandre Leroux
|
r166 | /// @todo : for the moment : | ||
/// - the provider is only used to retrieve data from the variable for its initialization, but | ||||
/// it will be retained later | ||||
/// - default data are generated for the variable, without taking into account the timerange set | ||||
/// in sciqlop | ||||
r225 | auto dateTime = impl->m_TimeController->dateTime(); | |||
r193 | if (auto newVariable = impl->m_VariableModel->createVariable( | |||
r228 | name, dateTime, generateDefaultDataSeries(*provider, dateTime))) { | |||
r225 | ||||
r235 | // store the provider | |||
impl->m_VariableToProviderMap[newVariable] = provider; | ||||
qRegisterMetaType<std::shared_ptr<IDataSeries> >(); | ||||
qRegisterMetaType<SqpDateTime>(); | ||||
connect(provider.get(), &IDataProvider::dataProvided, newVariable.get(), | ||||
&Variable::onAddDataSeries); | ||||
r225 | // store in cache | |||
impl->m_VariableCacheController->addDateTime(newVariable, dateTime); | ||||
// notify the creation | ||||
Alexandre Leroux
|
r166 | emit variableCreated(newVariable); | ||
} | ||||
Alexandre Leroux
|
r152 | } | ||
r235 | ||||
void VariableController::requestDataLoading(std::shared_ptr<Variable> variable, | ||||
const SqpDateTime &dateTime) | ||||
{ | ||||
// we want to load data of the variable for the dateTime. | ||||
// First we check if the cache contains some of them. | ||||
// For the other, we ask the provider to give them. | ||||
if (variable) { | ||||
QElapsedTimer timer; | ||||
timer.start(); | ||||
r243 | qCInfo(LOG_VariableController()) << "TORM: The slow s0 operation took" << timer.elapsed() | |||
r235 | << "milliseconds"; | |||
auto dateTimeListNotInCache | ||||
= impl->m_VariableCacheController->provideNotInCacheDateTimeList(variable, dateTime); | ||||
r243 | qCInfo(LOG_VariableController()) << "TORM: The slow s1 operation took" << timer.elapsed() | |||
r235 | << "milliseconds"; | |||
// Ask the provider for each data on the dateTimeListNotInCache | ||||
impl->m_VariableToProviderMap.at(variable)->requestDataLoading(dateTimeListNotInCache); | ||||
r243 | qCInfo(LOG_VariableController()) << "TORM: The slow s2 operation took" << timer.elapsed() | |||
r235 | << "milliseconds"; | |||
// store in cache | ||||
impl->m_VariableCacheController->addDateTime(variable, dateTime); | ||||
r243 | qCInfo(LOG_VariableController()) << "TORM: The slow s3 operation took" << timer.elapsed() | |||
r235 | << "milliseconds"; | |||
} | ||||
else { | ||||
qCCritical(LOG_VariableController()) << tr("Impossible to load data of a variable null"); | ||||
} | ||||
} | ||||
Alexandre Leroux
|
r111 | void VariableController::initialize() | ||
{ | ||||
qCDebug(LOG_VariableController()) << tr("VariableController init") << QThread::currentThread(); | ||||
impl->m_WorkingMutex.lock(); | ||||
qCDebug(LOG_VariableController()) << tr("VariableController init END"); | ||||
} | ||||
void VariableController::finalize() | ||||
{ | ||||
impl->m_WorkingMutex.unlock(); | ||||
} | ||||
void VariableController::waitForFinish() | ||||
{ | ||||
QMutexLocker locker{&impl->m_WorkingMutex}; | ||||
} | ||||