Chapter 4. Creating DRL rules in Business Central
You can create and manage DRL rules for your project in Business Central. In each DRL rule file, you define rule conditions, actions, and other components related to the rule, based on the data objects you create or import in the package.
Procedure
-
Go to Menu
Design Projects and click the project name. -
Click Add Asset
DRL file. Enter an informative DRL file name and select the appropriate Package. The package that you specify must be the same package where the required data objects have been assigned or will be assigned.
You can also select Show declared DSL sentences if any domain specific language (DSL) assets have been defined in your project. These DSL assets will then become usable objects for conditions and actions that you define in the DRL designer.
Click Ok to create the rule asset.
The new DRL file is now listed in the DRL panel of the Project Explorer, or in the DSLR panel if you selected the Show declared DSL sentences option. The package to which you assigned this DRL file is listed at the top of the file.
-
In the Fact types list in the left panel of the DRL designer, confirm that all data objects and data object fields (expand each) required for your rules are listed. If not, you can either import relevant data objects from other packages by using
importstatements in the DRL file, or create data objects within your package. After all data objects are in place, return to the Model tab of the DRL designer and define the DRL file with any of the following components:
Components of a DRL file
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
package: (automatic) This was defined for you when you created the DRL file and selected the package. import: Use this to identify the data objects from either this package or another package that you want to use in the DRL file. Specify the package and data object in the formatpackage.name.object.name, one import per line.Importing data objects
import mortgages.mortgages.LoanApplication;
import mortgages.mortgages.LoanApplication;Copy to Clipboard Copied! Toggle word wrap Toggle overflow function: (optional) Use this to include a function to be used by rules in the DRL file. Functions put semantic code in your rule source file. Functions are especially useful if an action (then) part of a rule is used repeatedly and only the parameters differ for each rule. Above the rules in the DRL file, you can declare the function or import a static method as a function, and then use the function by name in an action (then) part of the rule.Declaring and using a function with a rule (option 1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Importing and using the function with a rule (option 2)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow query: (optional) Use this to search the process engine for facts related to the rules in the DRL file. Queries search for a set of defined conditions and do not requirewhenorthenspecifications. Query names are global to the KIE base and therefore must be unique among all other rule queries in the project. To return the results of a query, construct a traditionalQueryResultsdefinition usingksession.getQueryResults("name"), where"name"is the query name. This returns a list of query results, which enable you to retrieve the objects that matched the query. Define the query and query results parameters above the rules in the DRL file.Query and query results for people under the age of 21, with a rule
Copy to Clipboard Copied! Toggle word wrap Toggle overflow declare: (optional) Use this to declare a new fact type to be used by rules in the DRL file. The default fact type in thejava.langpackage of Red Hat Process Automation Manager isObject, but you can declare other types in DRL files as needed. Declaring fact types in DRL files enables you to define a new fact model directly in the process engine, without creating models in a lower-level language like Java.Declaring and using a new fact type
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rule: Use this to define each rule in the DRL file. Rules consist of a rule name in the formatrule "name", followed by optional attributes that define rule behavior (such assalienceorno-loop), followed bywhenandthendefinitions. The same rule name cannot be used more than once in the same package. Thewhenpart of the rule contains the conditions that must be met to execute an action. For example, if a bank requires loan applicants to have over 21 years of age, then thewhencondition for anUnderagerule would beApplicant( age < 21 ). Thethenpart of the rule contains the actions to be performed when the conditional part of the rule has been met. For example, when the loan applicant is under 21 years old, thethenaction would besetApproved( false ), declining the loan because the applicant is under age. Conditions (when) and actions (then) consist of a series of stated fact patterns with optional constraints, bindings, and other supported DRL elements, based on the available data objects in the package. These patterns determine how defined objects are affected by the rule.Rule for loan application age limit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow At minimum, each DRL file must specify the
package,import, andrulecomponents. All other components are optional.Figure 4.1. Sample DRL file with required components and optional rule attributes
-
- After you define all components of the rule, click Validate in the upper-right toolbar of the DRL designer to validate the DRL file. If the file validation fails, address any problems described in the error message, review all syntax and components in the DRL file, and try again to validate the file until the file passes.
- Click Save in the DRL designer to save your work.
For more details about adding conditions to DRL rules, see Section 4.1, “Adding WHEN conditions in DRL rules”.
For more details about adding actions to DRL rules, see Section 4.2, “Adding THEN actions in DRL rules”.
4.1. Adding WHEN conditions in DRL rules Copy linkLink copied to clipboard!
The when part of the rule contains the conditions that must be met to execute an action. For example, if a bank requires loan applicants to have over 21 years of age, then the when condition of an Underage rule would be Applicant( age < 21 ). Conditions consist of a series of stated patterns and constraints, with optional bindings and other supported DRL elements, based on the available data objects in the package.
Prerequisites
-
The
packageis defined at the top of the DRL file. This should have been done for you when you created the file. -
The
importlist of data objects used in the rule is defined below thepackageline of the DRL file. Data objects can be from this package or from another package in Business Central. -
The
rulename is defined in the formatrule "name"below thepackage,import, and other lines that apply to the entire DRL file. The same rule name cannot be used more than once in the same package. Optional rule attributes (such assalienceorno-loop) that define rule behavior are below the rule name, before thewhensection.
Procedure
In the DRL designer, enter
whenwithin the rule to begin adding condition statements. Thewhensection consists of zero or more fact patterns that define conditions for the rule.If the
whensection is empty, then actions in thethensection are executed every time afireAllRules()call is made in the process engine. This is useful if you want to use rules to set up the process engine state.Rule without conditions
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Enter a pattern for the first condition to be met, with optional constraints, bindings, and other supported DRL elements. A basic pattern format is
patternBinding : patternType ( constraints ). Patterns are based on the available data objects in the package and define the conditions to be met in order to trigger actions in thethensection.Simple pattern: A simple pattern with no constraints matches against a fact of the given type. For example, the following condition is only that the applicant exists.
when Applicant( )
when Applicant( )Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pattern with constraints: A pattern with constraints matches against a fact of the given type and the additional restrictions in parentheses that are true or false. For example, the following condition is that the applicant is under the age of 21.
when Applicant( age < 21 )
when Applicant( age < 21 )Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pattern with binding: A binding on a pattern is a shorthand reference that other components of the rule can use to refer back to the defined pattern. For example, the following binding
aonLoanApplicationis used in a related action for underage applicants.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Continue defining all condition patterns that apply to this rule. The following are some of the keyword options for defining DRL conditions:
and: Use this to group conditional components into a logical conjunction. Infix and prefixandare supported. By default, all listed conditions or actions are combined withandwhen no conjunction is specified.Copy to Clipboard Copied! Toggle word wrap Toggle overflow or: Use this to group conditional components into a logical disjunction. Infix and prefixorare supported.Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )
Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )Copy to Clipboard Copied! Toggle word wrap Toggle overflow exists: Use this to specify facts and constraints that must exist. Note that this does not mean that a fact exists, but that a fact must exist. This option is triggered on only the first match, not subsequent matches.exists (Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ))
exists (Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ))Copy to Clipboard Copied! Toggle word wrap Toggle overflow not: Use this to specify facts and constraints that must not exist.not (Applicant( age < 21 ))
not (Applicant( age < 21 ))Copy to Clipboard Copied! Toggle word wrap Toggle overflow forall: Use this to set up a construct where all facts that match the first pattern match all the remaining patterns.forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )Copy to Clipboard Copied! Toggle word wrap Toggle overflow from: Use this to specify a source for data to be matched by the conditional pattern.Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddress
Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddressCopy to Clipboard Copied! Toggle word wrap Toggle overflow entry-point: Use this to define anEntry Pointcorresponding to a data source for the pattern. Typically used withfrom.Applicant( ) from entry-point "LoanApplication"
Applicant( ) from entry-point "LoanApplication"Copy to Clipboard Copied! Toggle word wrap Toggle overflow collect: Use this to define a collection of objects that the construct can use as part of the condition. In the example, all pending applications in the process engine for each given mortgage are grouped inArrayLists. If three or more pending applications are found, the rule is executed.m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )Copy to Clipboard Copied! Toggle word wrap Toggle overflow accumulate: Use this to iterate over a collection of objects, execute custom actions for each of the elements, and return one or more result objects (if the constraints evaluate totrue). This option is a more flexible and powerful form ofcollect. Use the formataccumulate( <source pattern>; <functions> [;<constraints>] ). In the example,min,max, andaverageare accumulate functions that calculate the minimum, maximum and average temperature values over all the readings for each sensor. Other supported functions includecount,sum,variance,standardDeviation,collectList, andcollectSet.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Advanced DRL optionsThese are examples of basic keyword options and pattern constructs for defining conditions. For more advanced DRL options and syntax supported in the DRL designer, see the Drools Documentation online.
- After you define all condition components of the rule, click Validate in the upper-right toolbar of the DRL designer to validate the DRL file. If the file validation fails, address any problems described in the error message, review all syntax and components in the DRL file, and try again to validate the file until the file passes.
- Click Save in the DRL designer to save your work.
4.2. Adding THEN actions in DRL rules Copy linkLink copied to clipboard!
The then part of the rule contains the actions to be performed when the conditional part of the rule has been met. For example, when a loan applicant is under 21 years old, the then action of an Underage rule would be setApproved( false ), declining the loan because the applicant is under age. Actions execute consequences based on the rule conditions and on available data objects in the package.
Prerequisites
-
The
packageis defined at the top of the DRL file. This should have been done for you when you created the file. -
The
importlist of data objects used in the rule is defined below thepackageline of the DRL file. Data objects can be from this package or from another package in Business Central. -
The
rulename is defined in the formatrule "name"below thepackage,import, and other lines that apply to the entire DRL file. The same rule name cannot be used more than once in the same package. Optional rule attributes (such assalienceorno-loop) that define rule behavior are below the rule name, before thewhensection.
Procedure
-
In the DRL designer, enter
thenafter thewhensection of the rule to begin adding action statements. Enter one or more actions to be executed on fact patterns based on the conditions for the rule.
The following are some of the keyword options for defining DRL actions:
and: Use this to group action components into a logical conjunction. Infix and prefixandare supported. By default, all listed conditions or actions are combined withandwhen no conjunction is specified.Copy to Clipboard Copied! Toggle word wrap Toggle overflow set: Use this to set the value of a field.application.setApproved ( false ); application.setExplanation( "has been bankrupt" );
application.setApproved ( false ); application.setExplanation( "has been bankrupt" );Copy to Clipboard Copied! Toggle word wrap Toggle overflow modify: Use this to specify fields to be modified for a fact and to notify the process engine of the change.modify( LoanApplication ) { setAmount( 100 ) }modify( LoanApplication ) { setAmount( 100 ) }Copy to Clipboard Copied! Toggle word wrap Toggle overflow update: Use this to specify fields and the entire related fact to be modified and to notify the process engine of the change. After a fact has changed, you must callupdatebefore changing another fact that might be affected by the updated values. Themodifykeyword avoids this added step.update( LoanApplication ) { setAmount( 100 ) }update( LoanApplication ) { setAmount( 100 ) }Copy to Clipboard Copied! Toggle word wrap Toggle overflow delete: Use this to remove an object from the process engine. The keywordretractis also supported in the DRL designer and executes the same action, butdeleteis preferred for consistency with the keywordinsert.delete( LoanApplication );
delete( LoanApplication );Copy to Clipboard Copied! Toggle word wrap Toggle overflow insert: Use this to insert anewfact and define resulting fields and values as needed for the fact.insert( new Applicant() );
insert( new Applicant() );Copy to Clipboard Copied! Toggle word wrap Toggle overflow insertLogical: Use this to insert anewfact logically into the process engine and define resulting fields and values as needed for the fact. The Red Hat Process Automation Manager process engine is responsible for logical decisions on insertions and retractions of facts. After regular or stated insertions, facts have to be retracted explicitly. After logical insertions, facts are automatically retracted when the conditions that originally asserted the facts are no longer true.insertLogical( new Applicant() );
insertLogical( new Applicant() );Copy to Clipboard Copied! Toggle word wrap Toggle overflow Advanced DRL optionsThese are examples of basic keyword options and pattern constructs for defining actions. For more advanced DRL options and syntax supported in the DRL designer, see the Drools Documentation online.
- After you define all action components of the rule, click Validate in the upper-right toolbar of the DRL designer to validate the DRL file. If the file validation fails, address any problems described in the error message, review all syntax and components in the DRL file, and try again to validate the file until the file passes.
- Click Save in the DRL designer to save your work.
4.2.1. Rule attributes Copy linkLink copied to clipboard!
Rule attributes are additional specifications that you can add to business rules to modify rule behavior. The following table lists the names and supported values of the attributes that you can assign to rules:
| Attribute | Value |
|---|---|
|
| An integer defining the priority of the rule. Rules with a higher salience value are given higher priority when ordered in the activation queue.
Example: |
|
| A Boolean value. When the option is selected, the rule is enabled. When the option is not selected, the rule is disabled.
Example: |
|
|
A string containing a date and time definition. The rule can be activated only if the current date and time is after a
Example: |
|
|
A string containing a date and time definition. The rule cannot be activated if the current date and time is after the
Example: |
|
| A Boolean value. When the option is selected, the rule cannot be reactivated (looped) if a consequence of the rule re-triggers a previously met condition. When the condition is not selected, the rule can be looped in these circumstances.
Example: |
|
| A string identifying an agenda group to which you want to assign the rule. Agenda groups allow you to partition the agenda to provide more execution control over groups of rules. Only rules in an agenda group that has acquired a focus are able to be activated.
Example: |
|
| A string identifying an activation (or XOR) group to which you want to assign the rule. In activation groups, only one rule can be activated. The first rule to fire will cancel all pending activations of all rules in the activation group.
Example: |
|
| A long integer value defining the duration of time in milliseconds after which the rule can be activated, if the rule conditions are still met.
Example: |
|
|
A string identifying either
Example: |
|
| A Quartz calendar definition for scheduling the rule.
Example: |
|
| A Boolean value, applicable only to rules within agenda groups. When the option is selected, the next time the rule is activated, a focus is automatically given to the agenda group to which the rule is assigned.
Example: |
|
|
A Boolean value, applicable only to rules within rule flow groups or agenda groups. When the option is selected, the next time the ruleflow group for the rule becomes active or the agenda group for the rule receives a focus, the rule cannot be activated again until the ruleflow group is no longer active or the agenda group loses the focus. This is a stronger version of the
Example: |
|
| A string identifying a rule flow group. In rule flow groups, rules can fire only when the group is activated by the associated rule flow.
Example: |
|
|
A string identifying either
Example: |