eis/dsm/data_query.cc

74 lines
2.9 KiB
C++

#include <dsm/data_query.h>
DataQuery::DataQuery() { logger_ = std::make_unique<LOG>("DataQuery"); }
DataQuery::~DataQuery() {}
json DataQuery::ihd_query_data(vector<string> tags,
mix_cc::time_range_t time_range,
TimeDur ihd_min_time_particles) {
std::vector<TimePoint> queried_time; ///< ihdb查询后的时间缓存
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
queried_data; ///< ihd查询后的数据缓存
json return_js = json::object();
int tag_num = tags.size();
try {
auto queried_batch_maybe = mix_cc::ihd::make_query_batch_maybe(
tags, time_range, ihd_min_time_particles);
if (queried_batch_maybe.is_nothing()) {
queried_time.clear();
queried_data = typename decltype(queried_batch_maybe)::type::Mat2d{};
logger_->Error() << "Tag点没有查到相应的信息" << std::endl;
return return_js;
}
auto queried_bath = queried_batch_maybe.unsafe_get_just();
auto result_maybe = mix_cc::ihd::read_data_with_time_maybe(&queried_bath);
if (result_maybe.is_nothing()) {
queried_time.clear();
queried_data = typename decltype(queried_batch_maybe)::type::Mat2d{};
logger_->Error() << "Tag点没有查到相应的数据1" << std::endl;
logger_->Error()
<< mix_cc::mix_time_t(time_range.get_left()).to_formatted_time()
<< " ~ "
<< mix_cc::mix_time_t(time_range.get_right()).to_formatted_time()
<< std::endl;
return return_js;
}
std::tie(queried_time, queried_data) = result_maybe.unsafe_get_just();
if (queried_data.rows() == 0) {
logger_->Error() << "Tag点没有查到相应的数据2" << std::endl;
logger_->Error()
<< mix_cc::mix_time_t(time_range.get_left()).to_formatted_time()
<< " ~ "
<< mix_cc::mix_time_t(time_range.get_right()).to_formatted_time()
<< std::endl;
return return_js;
}
} catch (const std::exception &e) {
logger_->Error() << e.what() << std::endl;
return return_js;
}
try {
for (int i = 0; i < tag_num; i++) {
Eigen::VectorXd selected_col = queried_data.col(i); // 提取列向量
std::vector<double> col_vec(selected_col.data(),
selected_col.data() + selected_col.size());
return_js[tags[i]] = col_vec;
}
std::vector<uint64_t> time_point;
for (auto item : queried_time) {
time_point.push_back(mix_cc::mix_time_t(item).to_milliseconds());
}
return_js["time"] = time_point;
} catch (const std::exception &e) {
logger_->Error() << e.what() << std::endl;
return return_js;
}
return return_js;
}
json DataQuery::operator()(vector<string> tags, mix_cc::time_range_t time_range,
TimeDur ihd_min_time_particles) {
return ihd_query_data(tags, time_range, ihd_min_time_particles);
}