feat: ExpressionEngine 变量刷新实现(MEMORY + IHDB)

This commit is contained in:
Huamonarch 2026-05-15 12:27:58 +08:00
parent da9eb2ea2e
commit 50173683db

View File

@ -70,3 +70,77 @@ bool ExpressionEngine::evaluateBool(const std::string& name) {
int ExpressionEngine::initHoldExpStr(const std::string& exp_str) {
return 0; // stub — Task 5 will implement
}
void ExpressionEngine::refreshFromMemory(
const TimePoint& now_time,
mix_cc::time_range_t& query_time_range) {
ensureVarCache(var_cache_, m_tags_.size());
for (size_t i = 0; i < m_tags_.size(); i++) {
double current =
SingletonTemplate<GlobaltemSharedMemory>::GetInstance()[m_tags_[i]];
// pN = 旧 tagN
mm_vars_[var_cache_.p_keys[i]] = mm_vars_[var_cache_.tag_keys[i]];
// tagN = 当前值
mm_vars_[var_cache_.tag_keys[i]] = current;
// pvN 历史移位
for (size_t j = PV_NUM - 1; j > 0; j--) {
mm_vars_[var_cache_.pv_keys[i][j]] =
mm_vars_[var_cache_.pv_keys[i][j - 1]];
}
mm_vars_[var_cache_.pv_keys[i][0]] = current;
}
mm_vars_["now"] = std::chrono::duration_cast<std::chrono::milliseconds>(
now_time.time_since_epoch())
.count();
fun_vars_.refresh_fun_vars(false, &mm_vars_);
query_time_range.set_right(now_time);
refreshHoldVars();
}
void ExpressionEngine::refreshFromIhdRow(
int row,
const Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& queried_data,
const std::vector<TimePoint>& queried_time,
TimePoint& now_time,
mix_cc::time_range_t& query_time_range) {
if (queried_data.rows() == 0 || queried_data.cols() == 0) return;
if (row < 0 || row >= queried_data.rows()) return;
if (static_cast<int>(m_tags_.size()) > queried_data.cols()) return;
ensureVarCache(var_cache_, m_tags_.size());
for (size_t i = 0; i < m_tags_.size(); i++) {
// pN = 旧 tagN
mm_vars_[var_cache_.p_keys[i]] = mm_vars_[var_cache_.tag_keys[i]];
// tagN = 当前行数据
mm_vars_[var_cache_.tag_keys[i]] = queried_data(row, i);
// pvN 历史移位
for (size_t j = PV_NUM - 1; j > 0; j--) {
mm_vars_[var_cache_.pv_keys[i][j]] =
mm_vars_[var_cache_.pv_keys[i][j - 1]];
}
mm_vars_[var_cache_.pv_keys[i][0]] =
mm_vars_[var_cache_.tag_keys[i]];
}
mm_vars_["now"] =
mix_cc::mix_time_t(queried_time[row]).to_milliseconds();
now_time = queried_time[row];
query_time_range.set_right(queried_time[row]);
fun_vars_.refresh_fun_vars(false, &mm_vars_);
refreshHoldVars();
}
void ExpressionEngine::refreshHoldVars() {
// stub — Task 5 will implement
}