/******************************************************************************************************************
* Action instruction algorithm(study sample data online,compare with sample
*data)
*
* arg[0] action expression
* arg[1] feedback expression
* arg[2] expression of judgment result
*
* feedback expression
* arg[2] expression of judgment result
*
* 1.0 2020-12-17 zoufuzhou
******************************************************************************************************************/
#include
#include
#include
#include
#include
extern std::map glob_items;
int AlgExpSample::init() {
LOG d("AlgExpSample::init", AUTO_CATCH_PID);
int ret = 0;
m_btime = 0;
this->sample_analysis->Init("T_RULE_SAMPLE", test_mode_, archive_interval_day_, judge_diff_);
string dbwhere = " RULEID = '" + rule_id_ + "' and flag = '1' ";
if (m_json_param["sample"]["datestart"][1].asString() != "" &&
m_json_param["sample"]["dateend"][1].asString() != "") {
dbwhere += " AND SAMPLEDATE >= TO_DATE ('" +
m_json_param["sample"]["datestart"][1].asString() +
"','YYYY-MM-DD') and SAMPLEDATE <= TO_DATE ('" +
m_json_param["sample"]["dateend"][1].asString() +
"','YYYY-MM-DD')";
}
d.Debug() << "where:" << dbwhere << endl;
this->sample_analysis->Read(dbwhere);
d.Debug() << "abs_diff:"
<< this->sample_analysis->GetProperty()->data.abs_diff.tostring() << endl;
d.Debug() << "normal_cfdi:"
<< this->sample_analysis->GetProperty()->data.normal_cfdi.tostring()
<< endl;
return ret;
}
AlgExpSample::AlgExpSample(const string &name, const Json::Value &rulejson,
const string &ruleId, const bool down_limit)
: AlgBase(name, rulejson, ruleId), AlgExp(name, rulejson, ruleId),
_down_limit(down_limit) {
LOG d("AlgExpSample::AlgExpSample", AUTO_CATCH_PID);
try {
data_source_ = m_json_param["datasource"]["value"][1].asInt();
d.Debug() << "data source[0:iHyerDB,1:memory]:" << data_source_ << endl;
keep_mode_ = 1; // m_json_param["action_condition"]["action_hold"][1].asInt();
m_modest = m_json_param["action_condition"]["mode"][1].asInt();
d.Debug() << "keep:" << keep_mode_ << " mode stat_tools:" << m_modest << endl;
archive_interval_day_ = m_json_param["sample"]["archive"][1].asInt();
d.Debug() << "archive:" << archive_interval_day_ << endl;
test_mode_ = m_json_param["alarm_option"]["mode"][1].asInt();
judge_diff_ = m_json_param["alarm_option"]["value"][1].asDouble();
d.Debug()
<< "modejudge(0: absolute difference, 1: error percentage (%), 2: "
"normal value signal (%)):"
<< test_mode_ << " samplediff:" << judge_diff_ << endl;
this->init();
m_expstr = string(m_json_param["action_condition"]["action_start"][1].asString());
this->print_exp_vars(m_expstr);
exp_act_ = new MathExpression(m_expstr.c_str(), mm_vars);
d.Debug() << "act_triggered_:" << m_expstr << "=" << exp_act_->evaluate() << endl;
m_expstr = string(m_json_param["alarm_option"]["var"][1].asString());
StringHelper::Trim(m_expstr);
if (m_expstr == "time")
// if(m_expstr.find("time",0) != string::npos)
{
m_timemode = true;
} else {
m_timemode = false;
}
if (exp_act_ == NULL) {
exp_act_ = new MathExpression(m_expstr.c_str(), mm_vars);
d.Debug() << "act_triggered_:" << m_expstr << "=" << exp_act_->evaluate()
<< endl;
}
if (!m_modest) {
this->malloc_ihd_mem();
}
} catch (const std::exception &e) {
d.Debug() << mix_cc::get_nested_exception(e) << std::endl;
}
}
AlgExpSample::~AlgExpSample() { delete exp_act_; }
int AlgExpSample::calculate(string &outjson) {
LOG d("AlgExpSample::calculate|" + rule_name_, AUTO_CATCH_PID);
int ret = 0;
outjson = "";
try {
if (m_modest == DATA_STAT::ACTUAL) {
for (unsigned int i = 0; i < m_tags.size(); i++) {
mm_vars["p" + std::to_string(i + 1)] =
mm_vars["tag" + std::to_string(i + 1)];
if (data_source_ == DataSource::MEMORY) {
mm_vars["tag" + std::to_string(i + 1)] = glob_items[m_tags[i]].value;
} else {
if (ihd_tools_->QuerySnapshot(m_tags[i], &mp_hdRec[i]) == NULL) {
mm_vars["tag" + std::to_string(i + 1)] = mp_hdRec[i].NumberValue();
}
}
}
ret = this->mon_proc(outjson, mp_hdRec);
} else {
ret = this->QueryDB3Record();
if (ret != NULL) {
return 0;
}
for (int i = 0; i < tag_count_; i++) {
for (int j = 0; j < m_tags.size(); j++) {
mm_vars["p" + std::to_string(j + 1)] =
mm_vars["tag" + std::to_string(j + 1)];
mm_vars["tag" + std::to_string(j + 1)] =
records_queried_[j][i].NumberValue();
}
ret = this->mon_proc(outjson, &records_queried_[0][i]);
if (ret == NULL && outjson != "") {
break;
}
}
if (this->m_btime == 0) {
this->SetHDTime(&query_time_region_.right, this->mstime());
}
this->free_ihd_mem();
}
} catch (const std::exception &e) {
d.Error() << mix_cc::get_nested_exception(e) << std::endl;
ret = -1;
}
return ret;
}
int AlgExpSample::mon_proc(string &outjson, HD3Record *hdRec) {
LOG d("AlgExpSample::mon_proc|" + rule_name_, AUTO_CATCH_PID);
int ret = 0;
outjson = "";
bool act_triggered_ = false;
double act_triggered_ = 0.0;
long long timediff = 0;
try {
act_triggered_ = (bool)exp_act_->evaluate();
this->print_exp_vars(m_expstr);
// d.Debug()<<"act_triggered_:"<SetHDTime(&query_time_region_.left, this->mstime());
this->SetHDTime(&query_time_region_.right, this->mstime());
} else {
this->SetHDTime(&query_time_region_.left, hdRec);
this->SetHDTime(&query_time_region_.right, hdRec);
}
this->print_exp_vars(m_expstr);
d.Debug() << "act_triggered_:" << setw(2) << act_triggered_ << endl;
act_triggered_ = exp_act_->evaluate();
d.Debug() << "act_triggered_:" << m_expstr << "=" << act_triggered_ << endl;
bool is_alarmed = false;
if(this->_down_limit)
{
is_alarmed = utility::is_alarm_value(this->sample_analysis, act_triggered_, judge_diff_);
}else
{
d.Debug() << "check" << std::endl;
is_alarmed = is_alarm_value_no_down_lim(this->sample_analysis, act_triggered_, judge_diff_);
}
if (is_alarmed) {
d.Debug() << "abs_diff:"
<< this->sample_analysis->GetProperty()->data.abs_diff.tostring()
<< endl;
d.Debug() << "normal_cfdi:"
<< this->sample_analysis->GetProperty()->data.normal_cfdi.tostring()
<< endl;
// this->print_exp_vars(m_expstr);
auto value = generate_sample_describe(this->sample_analysis, act_triggered_, judge_diff_);
msg =
rule_name_ + " " + m_json_param["alarm_option"]["error"][1].asString() + value;
// msg = rule_name_ + " " +
// m_json_param["alarm_option"]["error"][1].asString();
d.Debug() << msg << endl;
query_time_region_.left.nSec = query_time_region_.right.nSec = time(0);
msg = this->build_alarm_info(MsgLevel::ERROR, rule_id_, rule_name_,
"EXPSAMPLE", msg, query_time_region_);
if (!msg.empty())
outjson = msg;
}
// else
{
if (m_timemode) {
this->sample_analysis->Learning(timediff);
} else {
this->sample_analysis->Learning(act_triggered_);
}
}
}
} catch (const std::exception &e) {
d.Error() << mix_cc::get_nested_exception(e) << std::endl;
ret = -1;
}
return ret;
}