terrama2::services::alert::core::AdditionalDataHelper::AdditionalDataHelper(AdditionalData additionalData, DataManagerPtr dataManager) : additionalData_(additionalData) { dataSeries_ = dataManager->findDataSeries(additionalData.id); dataProvider_ = dataManager->findDataProvider(dataSeries_->dataProviderId); remover_ = std::make_shared<terrama2::core::FileRemover>(); }
void terrama2::core::erasePreviousResult(DataManagerPtr dataManager, DataSeriesId dataSeriesId, std::shared_ptr<te::dt::TimeInstantTZ> startTime) { auto outputDataSeries = dataManager->findDataSeries(dataSeriesId); if(!outputDataSeries) { TERRAMA2_LOG_ERROR() << QObject::tr("Invalid output data series for analysis."); return; } auto outputDataProvider = dataManager->findDataProvider(outputDataSeries->dataProviderId); if(!outputDataProvider) { TERRAMA2_LOG_ERROR() << QObject::tr("Invalid output data provider for analysis."); return; } if(outputDataProvider->dataProviderType == "POSTGIS") { auto dataset = outputDataSeries->datasetList[0]; std::string tableName = getTableNameProperty(dataset); std::shared_ptr<te::da::DataSource> datasource(te::da::DataSourceFactory::make("POSTGIS", outputDataProvider->uri)); // RAII for open/closing the datasource terrama2::core::OpenClose<std::shared_ptr<te::da::DataSource> > openClose(datasource); if(!datasource->isOpened()) { QString errMsg = QObject::tr("DataProvider could not be opened."); TERRAMA2_LOG_ERROR() << errMsg; throw Exception() << ErrorDescription(errMsg); } // get a transactor to interact to the data source std::shared_ptr<te::da::DataSourceTransactor> transactor(datasource->getTransactor()); auto dataSetNames = transactor->getDataSetNames(); if(std::find(dataSetNames.cbegin(), dataSetNames.cend(), tableName) != dataSetNames.cend() || std::find(dataSetNames.cbegin(), dataSetNames.cend(), "public."+tableName) != dataSetNames.cend()) transactor->execute("delete from " + tableName + " where execution_date = '" + startTime->toString() + "'"); } else { QString errMsg = QObject::tr("Removing old results not implement for this dataseries format."); TERRAMA2_LOG_ERROR() << errMsg; } }
std::set<std::string> terrama2::services::analysis::core::verify::dataAvailable(DataManagerPtr dataManager, AnalysisPtr analysis) { std::set<std::string> vecMessages; for(auto& analysisDataSeries : analysis->analysisDataSeriesList) { auto dataSeries = dataManager->findDataSeries(analysisDataSeries.dataSeriesId); auto dataProvider = dataManager->findDataProvider(dataSeries->dataProviderId); auto dataAccesor = terrama2::core::DataAccessorFactory::getInstance().make(dataProvider, dataSeries); try { terrama2::core::Filter filter; auto series = dataAccesor->getSeries(filter, nullptr); if(series.empty()) { QString errMsg = QObject::tr("No data available for data series '%1'.").arg(dataSeries->name.c_str()); TERRAMA2_LOG_WARNING() << errMsg; vecMessages.insert(vecMessages.end(), errMsg.toStdString()); } } catch(const terrama2::core::NoDataException&) { QString errMsg = QObject::tr("No data available for data series '%1'.").arg(dataSeries->name.c_str()); TERRAMA2_LOG_WARNING() << errMsg; vecMessages.insert(vecMessages.end(), errMsg.toStdString()); } catch(const terrama2::Exception& e) { std::string errMsg = boost::get_error_info<terrama2::ErrorDescription>(e)->toStdString(); vecMessages.insert(vecMessages.end(), errMsg); TERRAMA2_LOG_ERROR() << errMsg; } } return vecMessages; }
std::set<std::string> terrama2::services::analysis::core::verify::attributeIdentifier(DataManagerPtr dataManager, AnalysisPtr analysis) { std::set<std::string> vecMessages; if(analysis->type == AnalysisType::MONITORED_OBJECT_TYPE) { for(auto analysisDataSeries : analysis->analysisDataSeriesList) { if(analysisDataSeries.type == AnalysisDataSeriesType::DATASERIES_MONITORED_OBJECT_TYPE) { auto dataSeries = dataManager->findDataSeries(analysisDataSeries.dataSeriesId); auto dataProvider = dataManager->findDataProvider(dataSeries->dataProviderId); std::string identifier = analysisDataSeries.metadata["identifier"]; auto dataAccesor = terrama2::core::DataAccessorFactory::getInstance().make(dataProvider, dataSeries); try { terrama2::core::Filter filter; auto series = dataAccesor->getSeries(filter, nullptr); if(!series.empty()) { auto it = series.begin(); if(it != series.end()) { if(!it->second.teDataSetType) { QString errMsg = QObject::tr("Could not read dataset type for data series '%1'.").arg(dataSeries->name.c_str()); TERRAMA2_LOG_WARNING() << errMsg; vecMessages.insert(vecMessages.end(), errMsg.toStdString()); } auto property = it->second.teDataSetType->getProperty(identifier); if(property == nullptr) { QString errMsg = QObject::tr("Could not find the attribute identifier '%1' in data series '%2'.").arg(QString::fromStdString(identifier), QString::fromStdString(dataSeries->name)); TERRAMA2_LOG_WARNING() << errMsg; vecMessages.insert(vecMessages.end(), errMsg.toStdString()); } } else { throw new terrama2::core::NoDataException(); } } } catch(const terrama2::core::NoDataException&) { QString errMsg = QObject::tr("No data available for data series '%1'.").arg(dataSeries->name.c_str()); TERRAMA2_LOG_WARNING() << errMsg; vecMessages.insert(vecMessages.end(), errMsg.toStdString()); } catch(const terrama2::Exception& e) { std::string errMsg = boost::get_error_info<terrama2::ErrorDescription>(e)->toStdString(); vecMessages.insert(vecMessages.end(), errMsg); TERRAMA2_LOG_ERROR() << errMsg; } } } } return vecMessages; }