From 82725d4eee834f5a9fb033706c01959a8164a9f1 Mon Sep 17 00:00:00 2001 From: garniersam <44225808+garniersam@users.noreply.github.com> Date: Mon, 10 Mar 2025 18:17:30 +0100 Subject: [PATCH 1/3] Update RulesEngine.cs Execute a specific rule on a workflow and run action and (children actions also). Use the cache system. --- src/RulesEngine/RulesEngine.cs | 46 ++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/RulesEngine/RulesEngine.cs b/src/RulesEngine/RulesEngine.cs index 627b7b43..703c9a89 100644 --- a/src/RulesEngine/RulesEngine.cs +++ b/src/RulesEngine/RulesEngine.cs @@ -110,6 +110,22 @@ public async ValueTask> ExecuteAllRulesAsync(string workflo return ruleResultList; } + /// + /// This will executea specific rule of the specified workflow + /// + /// The name of the workflow with rules to execute against the inputs + /// The name of the rule to execute + /// A variable number of rule parameters + /// A rule result + public async ValueTask> ExecuteRuleAsync(string workflowName, string ruleName, params RuleParameter[] ruleParams) + { + var sortedRuleParams = ruleParams.ToList(); + sortedRuleParams.Sort((RuleParameter a, RuleParameter b) => string.Compare(a.Name, b.Name)); + var ruleResultTree = ValidateWorkflowAndExecuteRule(workflowName, ruleName, sortedRuleParams.ToArray()); + await ExecuteActionAsync([ruleResultTree]); + return ruleResultTree; + } + private async ValueTask ExecuteActionAsync(IEnumerable ruleResultList) { foreach (var ruleResult in ruleResultList) @@ -126,13 +142,6 @@ private async ValueTask ExecuteActionAsync(IEnumerable ruleResul } } - public async ValueTask ExecuteActionWorkflowAsync(string workflowName, string ruleName, RuleParameter[] ruleParameters) - { - var compiledRule = CompileRule(workflowName, ruleName, ruleParameters); - var resultTree = compiledRule(ruleParameters); - return await ExecuteActionForRuleResult(resultTree, true); - } - private async ValueTask ExecuteActionForRuleResult(RuleResultTree resultTree, bool includeRuleResults = false) { var ruleActions = resultTree?.Rule?.Actions; @@ -268,6 +277,29 @@ private List ValidateWorkflowAndExecuteRule(string workflowName, return result; } + /// + /// This will validate workflow rules then call execute method + /// + /// type of entity + /// input + /// workflow name + /// list of rule result set + private RuleResultTree ValidateWorkflowAndExecuteRule(string workflowName, string ruleName, RuleParameter[] ruleParams) + { + if (RegisterRule(workflowName, ruleParams)) + { + var compiledRulesCacheKey = GetCompiledRulesKey(workflowName, ruleParameters); + IDictionary> compiledRules = _rulesCache.GetCompiledRules(compiledRulesCacheKey); + if (compiledRules.TryGetValue(ruleName, out var compiledRule)) + { + return compiledRule(ruleParams); + } + } + + // if rules are not registered with Rules Engine + throw new ArgumentException($"Rule config file is not present for the {workflowName} workflow"); + } + /// /// This will compile the rules and store them to dictionary /// From f6a44b80b57433a401f5e9162aabe7c57e90cb7c Mon Sep 17 00:00:00 2001 From: garniersam <44225808+garniersam@users.noreply.github.com> Date: Mon, 10 Mar 2025 18:21:03 +0100 Subject: [PATCH 2/3] Update RulesEngine.cs --- src/RulesEngine/RulesEngine.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/RulesEngine/RulesEngine.cs b/src/RulesEngine/RulesEngine.cs index 703c9a89..b3078eb5 100644 --- a/src/RulesEngine/RulesEngine.cs +++ b/src/RulesEngine/RulesEngine.cs @@ -142,6 +142,13 @@ private async ValueTask ExecuteActionAsync(IEnumerable ruleResul } } + public async ValueTask ExecuteActionWorkflowAsync(string workflowName, string ruleName, RuleParameter[] ruleParameters) + { + var compiledRule = CompileRule(workflowName, ruleName, ruleParameters); + var resultTree = compiledRule(ruleParameters); + return await ExecuteActionForRuleResult(resultTree, true); + } + private async ValueTask ExecuteActionForRuleResult(RuleResultTree resultTree, bool includeRuleResults = false) { var ruleActions = resultTree?.Rule?.Actions; From b0bc44198446f2383063425062fec2ae6f7fe193 Mon Sep 17 00:00:00 2001 From: garniersam <44225808+garniersam@users.noreply.github.com> Date: Mon, 10 Mar 2025 18:22:02 +0100 Subject: [PATCH 3/3] Update RulesEngine.cs --- src/RulesEngine/RulesEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RulesEngine/RulesEngine.cs b/src/RulesEngine/RulesEngine.cs index b3078eb5..e9f80670 100644 --- a/src/RulesEngine/RulesEngine.cs +++ b/src/RulesEngine/RulesEngine.cs @@ -111,7 +111,7 @@ public async ValueTask> ExecuteAllRulesAsync(string workflo } /// - /// This will executea specific rule of the specified workflow + /// This will execute a specific rule of the specified workflow /// /// The name of the workflow with rules to execute against the inputs /// The name of the rule to execute