Skip to main content



Executing Rules

Applying Rules

Prerequisites

A valid RuleSession

Namespaces

InRule.Runtime

Classes

RuleSession, Entity, RuleException

See Also

Retrieving a Rule Application, Creating a RuleSession, Creating Entities, Handling Exceptions

References

InRule.Runtime.dll, InRule.Common.dll


Apply rules

try
{
// Apply the rules.
session.ApplyRules();
}
catch (RuleException ex)
{
// Handle any rule engine exceptions here.
Console.WriteLine(ex.ToString());
}
note

This will execute all Auto RuleSets, calculations, constraints and classifications.


Execute explicit rulesets and rule flows

// Apply the CalculatePaymentSchedule from the mortgageEntity
mortgageEntity.ExecuteRuleSet("CaculatePaymentSchedule");
note

Rule flows are executed using the same method and behave in the same manner as explicit rulesets. Any auto rules are also being applied when applying an explicit ruleset or rule flow.


Execute explicit rulesets that accept parameters

// Execute the ruleset passing in a list of parameters
mortgageEntity.ExecuteRuleSet("AddCharge", "Appraisal", 400.99);

Applying Rules with an Activation Model

Prerequisites

A valid RuleSession and Entity

Namespaces

InRule.Runtime

Classes

RuleSession, Entity

References

InRule.Runtime.dll, InRule.Common.dll

The following examples demonstrate how to control rule execution by Activating and Deactivating Rule Sets through a variety of techniques. The Activation should be set by calling one of the methods below, and then rules can be applied, as seen in the section above.


Activate RuleSets by Name

// Activate ruleset by name
ruleSession.ActivateRuleSets("Entity1.RuleSet1");

Deactivate RuleSets by Name

// Deactivate ruleset by name
ruleSession.DeactivateRuleSets("Entity1.RuleSet1");

Activate RuleSets by Category

// Activate ruleset by category
ruleSession.ActivateRuleSetsByCategory("Category1");

Deactivate RuleSets by Category

// Deactivate ruleset by category
ruleSession.DeactivateRuleSetsByCategory("Category1");

Activate RuleSet by Name from an Entity

// Activate ruleset by name
entity.ActivateRuleSet("RuleSet1");

Deactivate RuleSet by Name from an Entity

// Deactivate ruleset by name
entity.DeactivateRuleSet("RuleSet1");

Reset RuleSet activations

// Reset rule activations
ruleSession.ResetAllRuleSetActivations();
note

When calling ResetAllRuleSetActivations, the Activation status is set back to the original status at the time of authoring.

Executing Decisions

Prerequisites

A valid RuleSession

Namespaces

InRule.Runtime

Classes

RuleSession, RuleException

See Also

Retrieving a Rule Application, Creating a RuleSession, Handling Exceptions

References

InRule.Runtime.dll, InRule.Common.dll


Execute decision using DecisionInput

try
{
// Execute the Decision
var decision = session.CreateDecision("CalculateArea");
decision.Execute(new DecisionInput("height", 30), new DecisionInput("width", 400));
}
catch (RuleException ex)
{
// Handle any rule engine exceptions here.
Console.WriteLine(ex.ToString());
}
note

If a Decision input is an Entity type, an Entity instance should be passed. Any Auto RuleSets, calculations, constraints, and classifications on the passed Entity will be executed.


Execute decision using JSON

try
{
// Execute the Decision
var decision = session.CreateDecision("CalculateArea");
decision.Execute("{ \"height\": 30, \"width\": 400 }, EntityStateType.Json));
}
catch (RuleException ex)
{
// Handle any rule engine exceptions here.
Console.WriteLine(ex.ToString());
}

Executing an Independent Rule Set or Rule Flow

Prerequisites

A valid RuleSession

Namespaces

InRule.Runtime

Classes

RuleSession, Entity

See Also

Retrieving a Rule Application, Creating a RuleSession, Creating Entities


Execute an Independent Ruleset

int height = 30;
int width = 40;

// Create a runtime instance of the independent ruleset.
RuleSet calcAreaRuleSet = ruleSession.CreateIndependentRuleSet("CalculateArea");

// Execute the ruleset passing in the parameters
Runtime.RuleExecutionLog executionLog = calcAreaRuleSet.Execute(height, width);

Checking For Notifications & Validations

Prerequisites

A valid RuleSession

Namespaces

InRule.Runtime

Classes

Notification, Validation, RuleSession

See Also

Retrieving a Rule Application, Creating a RuleSession, Creating Entities, Applying Rules


Check for notifications

// Retrieve the notifications from the session state
foreach (Notification note in ruleSession.GetNotifications())
{
// Handle the notification
Console.WriteLine(note.Message);
}

Check for validations

// Retrieve the validations from the session state
foreach (Validation validation in ruleSession.GetValidations())
{
// Handle the validation
Console.WriteLine(validation.Message);
}

Handling Exceptions

Prerequisites

A valid RuleSession, a Try block wrapped around InRule SDK code to load state and execute rules.

Namespaces

InRule.Runtime , InRule.Common.Exceptions , InRule.Repository

Classes

RuleException, CompileException, CompilerError, RuntimeException

See Also

Basic Example of Creating a RuleApplication in Code

References

InRule.Runtime.dll, InRule.Common.dll

Below are the common exceptions to handle compile and runtime errors and the RuleException, which is the base class for all InRule exceptions. They are listed in the order in which they should be implemented.

The individual values in the AuthoringErrorCode and RuntimeErrorCode enumerations may change in future versions of InRule.

note

See the * class for a complete list of InRule exceptions.


Handling compiler exceptions

// Catching compile exceptions
catch (CompileException ex)
{
foreach (CompileError err in ex.Errors)
{
if (err.AuthoringErrorCode == AuthoringErrorCode.SqlQueryParameterTypeIsInvalid)
{
// React
}
}
}

Handling integration exceptions

// Catching integration exceptions
catch (IntegrationException ex)
{
if (ex.RuntimeErrorCode == RuntimeErrorCode.StateUnableToBindToMember)
{
// React
}
}

Handling base exceptions

// Base class exception; can be used to catch all InRule exceptions
catch (RuntimeException ex)
{
foreach (ErrorLogMessage err in ex.ErrorMessages)
{
if (err.RuntimeErrorCode == RuntimeErrorCode.AppSettingsSectionMissingOrMalformed)
{
// React
}
}

Runtime Settings

Prerequisites

A valid RuleSession

Namespaces

InRule.Runtime

Classes

RuleSessionSettings, RuleSession

These are some of the settings the rule engine uses during execution:


Overriding the current date

Gets or sets a value that will override the return value of the Today() function in the rule engine. If not set, the rule engine will use the current date.

To override the current date to January 1, 2025:

ruleSession.Settings.Now = new DateTime(2025, 1, 1);

Overriding the execution timeout

Gets or sets the maximum time for rule engine execution.

To override the default setting to 60 seconds:

ruleSession.Settings.ExecutionTimeout = new TimeSpan(0, 0, 60);

Overriding the maximum cycle count

Gets or sets the maximum cycles for rule engine execution.

To override the default setting:

ruleSession.Settings.MaxCycleCount = 200000;

Returning detailed statistics information

Gets or sets a value determining whether statistics info will be logged and returned. The default is false.

note

This will affect the amount of information that is displayed on the Performance Statistics report.

To override the default setting:

ruleSession.Settings.LogOptions = EngineLogOptions.SummaryStatistics;

To enable metrics logging

Set the MetricLogger property to an instance of an object that implements the IMetricLogger interface as shown below.

ruleSession.Settings.MetricLogger = new CsvMetricLogger();

For more details, refer to the CSV sample application.

Retrieving and Processing the RuleExecutionLog

Prerequisites

A valid RuleSession and Entity.

Namespaces

InRule.Runtime

Classes

RuleSession, Entity

References

InRule.Runtime.dll, InRule.Common.dll


Retrieving RuleExecutionLog from RuleSession.ApplyRules

// Apply rules and capture RuleExecutionLog
RuleExecutionLog executionLog = ruleSession.ApplyRules();

Retrieving RuleExecutionLog from Entity.ExecuteRuleSet

// Execute explicit RuleSet and capture RuleExecutionLog
RuleExecutionLog executionLog = entity.ExecuteRuleSet("CalculatePaymentSchedule");

Processing the RuleExecutionLog

The following method will take a RuleExecutionLog as a parameter and return a string with the text from all of the messages separated by line breaks.

public string GetExecutionLogText(RuleExecutionLog executionLog)
{
// Spin through all of the messages in the RuleExecutionLog and append to a StringBuilder
StringBuilder sb = new StringBuilder();
foreach (LogMessage message in executionLog.AllMessages)
{
sb.Append(message.Description + Environment.NewLine);
}
// return string
return sb.ToString();
}

See the Implementation Guide for more details.

Retrieving the Performance Statistics Report

Prerequisites

A valid RuleSession

NamespacesO

InRule.Runtime

Classes

FileSystemRuleApplicationReference, RuleSession, Entity, RuleException

See Also

Basic Example Of Calling Rules Engine , Retrieve the Performance Log

References

InRule.Runtime.dll, InRule.Common.dll

The following basic example demonstrates how to capture the Performance Statistics Report at run time.

// Turn on capturing of detailed statistics (if desired)
ruleSession.Settings.LogOptions = EngineLogOptions.DetailStatistics;

// Run rules
ruleSession.ApplyRules();

// Get the XML as a string for the Performance Statistics Report (includes log messages if log options configured to include them)
string reportXml = ruleSession.LastRuleExecutionLog.GetXml();

// Get the HTML as a string for the Performance Statistics Report
string reportHtml = ruleSession.LastRuleExecutionLog.GetHtml();

// write the report to the file system (could also view in a web browser control)
File.WriteAllText(@"c:\work\PerfStatsReport.html", reportHtml);

Retrieving the Performance Log

Prerequisites

A valid RuleSession

Namespaces

InRule.Runtime

Classes

FileSystemRuleApplicationReference, RuleSession, Entity

See Also

Basic Example Of Calling Rules Engine , Retrieve the Performance Statistics Report

The Performance Log contains information about load, compile and execution times. This information is also available in the InRule Event Logs. See Event Log Details for more information. The following example demonstrates how to capture the Performance Log information using the SDK.

    // Create the "Rectangle" entity, passing in Xml for state
Entity rectangle = session.CreateEntity("Rectangle", inputXml);
// Apply rules
session.ApplyRules();
// Get performance log information from the RuleSession
string perfLogDetails = session.Statistics.GetRunningTotalAllReport();

Example of Performance Log

SessionId: b8ea59d5-8ec3-4c8b-947c-bb41411d8304
GetRuleApplicationDefExecTime (usually indicates a compile): 14569.036ms (max 14569.036ms) 1
CreateRuleApplicationDefInfoExecTime: 1511.761ms (max 1511.761ms) 1
GetRuleApplicationRevisionKeyExecTime (incl. in CreateRuleApplicationDefInfo): 6.591ms 1
AggExecStatInfo.AggDirectives (incl. in Submit): 399.384ms 1
CreateSessionExecTime: 93.793ms 1
CreateEntityExecTime: 17511.331ms (max 17511.331ms) 1
LoadXmlExecTime: 93.128ms 1
SubmitExecTime: 642.903ms (max 642.903ms) 1
ProcessResponseExecTime: 22.564ms 1
ThreadId: 11
MaxCacheDepth: 5
CurrentCacheDepth: 1
CompileExecTime: 17195.075ms 1
WorkingMemCreateCnt: 1
Ruleapp 'RectangleApp': 1
CacheUpTime: 18.421sec
RunningTotalAll: 35558.794ms