From 69a794785ada249cbeca01310889e61cab201143 Mon Sep 17 00:00:00 2001 From: stefan-gorules <127550877+stefan-gorules@users.noreply.github.com> Date: Wed, 26 Apr 2023 22:27:30 +0200 Subject: [PATCH] feat: evaluation reference map trace; (#28) * feat: evaluation reference map trace; * fix: cargo fmt * reduce performance penalty; --- core/engine/src/handler/table/zen.rs | 8 ++++++++ core/expression/src/isolate.rs | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/core/engine/src/handler/table/zen.rs b/core/engine/src/handler/table/zen.rs index 9418d192..2d3c5f8f 100644 --- a/core/engine/src/handler/table/zen.rs +++ b/core/engine/src/handler/table/zen.rs @@ -12,6 +12,7 @@ use zen_expression::isolate::Isolate; #[derive(Debug, Serialize)] struct RowResult { rule: Option>, + reference_map: Option>, index: usize, #[serde(skip)] output: RowOutput, @@ -134,6 +135,7 @@ impl<'a> DecisionTableHandler<'a> { return Some(RowResult { output: outputs, rule: None, + reference_map: None, index, }); } @@ -144,16 +146,22 @@ impl<'a> DecisionTableHandler<'a> { }; let mut expressions: HashMap = Default::default(); + let mut reference_map: HashMap = Default::default(); expressions.insert("_id".to_string(), rule_id.clone()); for input in &content.inputs { let rule_value = rule.get(input.id.as_str())?; expressions.insert(input.field.clone(), rule_value.clone()); + + if let Some(reference) = self.isolate.get_reference(input.field.as_str()) { + reference_map.insert(input.field.clone(), reference); + } } Some(RowResult { output: outputs, rule: Some(expressions), + reference_map: Some(reference_map), index, }) } diff --git a/core/expression/src/isolate.rs b/core/expression/src/isolate.rs index e5e2b096..a3a009c4 100644 --- a/core/expression/src/isolate.rs +++ b/core/expression/src/isolate.rs @@ -118,6 +118,13 @@ impl<'a> Isolate<'a> { Ok(()) } + pub fn get_reference(&self, reference: &'a str) -> Option { + let refs = self.references.borrow(); + let var = refs.get(reference)?; + + (*var).try_into().ok() + } + pub fn run_standard(&self, source: &'a str) -> Result { self.clear();