##// END OF EJS Templates
WIP Multicomponent TS...
WIP Multicomponent TS Signed-off-by: Alexis Jeandet <alexis.jeandet@member.fsf.org>

File last commit:

r1431:8eb0c93bfd80
r1431:8eb0c93bfd80
Show More
python_providers.cpp
150 lines | 5.6 KiB | text/x-c | CppLexer
Ported MockPlugin to new Variable2 impl and added dummy python plugin...
r1423 #include "python_providers.h"
Added ultra preliminary version of python providers...
r1428 #include <Data/DataProviderParameters.h>
#include <Data/DateTimeRange.h>
#include <Data/IDataProvider.h>
#include <Data/ScalarTimeSerie.h>
#include <Data/SpectrogramTimeSerie.h>
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 #include <Data/TimeSeriesUtils.h>
Added ultra preliminary version of python providers...
r1428 #include <Data/VectorTimeSerie.h>
#include <DataSource/DataSourceController.h>
#include <DataSource/DataSourceItem.h>
#include <DataSource/DataSourceItemAction.h>
#include <QDir>
#include <QStandardPaths>
#include <QStringList>
#include <SqpApplication.h>
#include <TimeSeries.h>
#include <functional>
#include <iostream>
const auto DATA_SOURCE_NAME = QStringLiteral("PythonProviders");
class PythonProvider : public IDataProvider
{
public:
WIP Multicomponent TS...
r1431 explicit PythonProvider(PythonInterpreter::provider_funct_t f) : _pythonFunction { f } {}
Added ultra preliminary version of python providers...
r1428
PythonProvider(const PythonProvider& other) : _pythonFunction { other._pythonFunction } {}
std::shared_ptr<IDataProvider> clone() const override
{
return std::make_shared<PythonProvider>(*this);
}
virtual TimeSeries::ITimeSerie* getData(const DataProviderParameters& parameters) override
{
auto product = parameters.m_Data.value("PRODUCT", "").toString().toStdString();
auto range = parameters.m_Range;
Added POC AMDA python impl and CDAWEB bits...
r1430 std::vector<std::tuple<std::string, std::string>> metadata;
std::transform(parameters.m_Data.constKeyValueBegin(), parameters.m_Data.constKeyValueEnd(),
std::back_inserter(metadata), [](const auto& item) {
return std::tuple<std::string, std::string> { item.first.toStdString(),
item.second.toString().toStdString() };
});
auto result = _pythonFunction(metadata, range.m_TStart, range.m_TEnd);
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 return TimeSeriesUtils::copy(result);
Added ultra preliminary version of python providers...
r1428 }
private:
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 PythonInterpreter::provider_funct_t _pythonFunction;
Added ultra preliminary version of python providers...
r1428 };
Ported MockPlugin to new Variable2 impl and added dummy python plugin...
r1423
void PythonProviders::initialize()
{
Added ultra preliminary version of python providers...
r1428 _interpreter.add_register_callback(
Added POC AMDA python impl and CDAWEB bits...
r1430 [this](const std::vector<PythonInterpreter::product_t>& product_list,
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 PythonInterpreter::provider_funct_t f) { this->register_product(product_list, f); });
Added ultra preliminary version of python providers...
r1428
for (const auto& path : QStandardPaths::standardLocations(QStandardPaths::AppLocalDataLocation))
{
auto dir = QDir(path + "/python");
if (dir.exists())
{
for (const auto& entry :
dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name))
{
if (entry.isFile() && entry.suffix() == "py")
{
_interpreter.eval(entry.absoluteFilePath().toStdString());
}
}
}
}
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 _interpreter.release();
Added ultra preliminary version of python providers...
r1428 }
PythonProviders::~PythonProviders() {}
std::unique_ptr<DataSourceItem> make_folder_item(const QString& name)
{
return std::make_unique<DataSourceItem>(DataSourceItemType::NODE, name);
}
template <typename T>
DataSourceItem* make_path_items(
const T& path_list_begin, const T& path_list_end, DataSourceItem* root)
{
std::for_each(path_list_begin, path_list_end, [&root](const auto& folder_name) mutable {
auto folder_ptr = root->findItem(folder_name);
if (folder_ptr == nullptr)
{
auto folder = make_folder_item(folder_name);
folder_ptr = folder.get();
root->appendChild(std::move(folder));
}
root = folder_ptr;
});
return root;
}
std::unique_ptr<DataSourceItem> make_product_item(
const QVariantHash& metaData, const QUuid& dataSourceUid)
{
auto result = std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT, metaData);
// Adds plugin name to product metadata
result->setData(DataSourceItem::PLUGIN_DATA_KEY, DATA_SOURCE_NAME);
result->setData(DataSourceItem::ID_DATA_KEY, metaData.value(DataSourceItem::NAME_DATA_KEY));
auto productName = metaData.value(DataSourceItem::NAME_DATA_KEY).toString();
// Add action to load product from DataSourceController
result->addAction(
std::make_unique<DataSourceItemAction>(QObject::tr("Load %1 product").arg(productName),
[productName, dataSourceUid](DataSourceItem& item) {
if (auto app = sqpApp)
{
app->dataSourceController().loadProductItem(dataSourceUid, item);
}
}));
return result;
Updated meson build files...
r1425 }
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 void PythonProviders::register_product(
Added POC AMDA python impl and CDAWEB bits...
r1430 const std::vector<PythonInterpreter::product_t>& product_list,
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 PythonInterpreter::provider_funct_t f)
Updated meson build files...
r1425 {
Added ultra preliminary version of python providers...
r1428 auto& dataSourceController = sqpApp->dataSourceController();
Added POC AMDA python impl and CDAWEB bits...
r1430 QString test = DATA_SOURCE_NAME + QUuid::createUuid().toString();
auto id = dataSourceController.registerDataSource(test);
auto root = make_folder_item(test);
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 std::for_each(std::cbegin(product_list), std::cend(product_list),
[id, f, root = root.get()](const auto& product) {
Added POC AMDA python impl and CDAWEB bits...
r1430 const auto& path = std::get<0>(product);
Added ultra preliminary version of python providers...
r1428 auto path_list = QString::fromStdString(path).split('/');
auto name = *(std::cend(path_list) - 1);
auto path_item
= make_path_items(std::cbegin(path_list), std::cend(path_list) - 1, root);
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 QVariantHash metaData { { DataSourceItem::NAME_DATA_KEY, name } };
Added POC AMDA python impl and CDAWEB bits...
r1430 std::for_each(std::cbegin(std::get<2>(product)), std::cend(std::get<2>(product)),
Some more progress on Python Providers side, works with a simple request on CDAWeb....
r1429 [&metaData](const auto& mdata) {
metaData[QString::fromStdString(mdata.first)]
= QString::fromStdString(mdata.second);
});
path_item->appendChild(make_product_item(metaData, id));
Added ultra preliminary version of python providers...
r1428 });
dataSourceController.setDataSourceItem(id, std::move(root));
dataSourceController.setDataProvider(id, std::make_unique<PythonProvider>(f));
Ported MockPlugin to new Variable2 impl and added dummy python plugin...
r1423 }