Expressions in the DMN Engine
Decision tables and decision literal expressions allow specifying different types of expressions. This section describes which types of expressions exist. It lists which expression languages are supported and demonstrates how to change the used expression language for an expression.
Expressions in DMN
As shown in the decision table and decision literal expression reference, four types of expressions are supported:
- Input Expression: sets the input value for an input column of the decision table
- Input Entry: used to determine if a rule of the decision table is applicable
- Output Entry: returns a value which is added to the output of a matched rule of the decision table
- Literal Expression: used to determine the value of a decision literal expression
You can read more on this in the DMN 1.3 reference. In
the DMN 1.3 XML, expressions can be found in the XML
elements inputExpression
, inputEntry
, outputEntry
and literalExpression
:
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn">
<decision id="decision" name="Decision">
<decisionTable>
<input id="input">
<!-- the input expression determines the input value of a column -->
<inputExpression>
<text>age</text>
</inputExpression>
</input>
<output id="output"/>
<rule id="rule1">
<!-- the input entry determines if the rule is applicable -->
<inputEntry>
<text>[18..30]</text>
</inputEntry>
<!-- the output entry determines the rule if it is applicable -->
<outputEntry>
<text>"okay"</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
<decision id="decision2 name="Decision 2">
<!-- the literal expression determines the value of this decision -->
<literalExpression>
<text>a + b</text>
</literalExpression>
</decision>
</definitions>
Supported Expression Languages
The Camunda DMN engine supports two expression languages out of the box:
JUEL
: A Camunda-maintained implementation of the Java Unified Expression LanguageFEEL
: The Friendly Enough Expression Language of the DMN 1.2 standard.
Depending on the JDK you use, there may also be a Javascript
implementation
available like Rhino or Nashhorn.
You can also use every other script language which provides a JSR-223
implementation. This includes groovy
, python
and ruby
. To use these
languages you have to add the corresponding dependency to your project.
For example, to use groovy
as language for expressions add these dependencies
to your project pom.xml
:
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-json</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-xml</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-templates</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-dateutil</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-datetime</artifactId>
<version>${GROOVY_VERSION}</version>
</dependency>
Default Expression Languages
The default expression languages of the different expression types in the DMN engine are as follows:
- Input Expression:
FEEL
- Input Entry:
FEEL
- Output Entry:
FEEL
- Literal Expression:
FEEL
Legacy Behavior
You can find how to go back to the legacy behavior, where JUEL
was used for input expressions,
output entries and literal expressions here.
The default language can be changed by setting it directly in the DMN 1.3 XML as global expression language with the expressionLanguage
attribute of
the definitions
element:
<!-- this sets the default expression language for all expressions -->
<!-- in this file to javascript -->
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn" expressionLanguage="javascript">
<decision id="decision" name="Decision">
<decisionTable>
<!-- ... -->
</decisionTable>
</decision>
</definitions>
Additionally, it is possible to change the default expression language in the default DMN engine configuration as described in the user guide.
Configuring the Expression Language
It is also possible to set the language for each expression individually using the expressionLanguage
attribute:
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn">
<decision id="decision" name="Decision">
<decisionTable>
<input id="input">
<!-- use javascript for this input expression -->
<inputExpression expressionLanguage="javascript">
<text>age</text>
</inputExpression>
</input>
<output id="output"/>
<rule id="rule1">
<!-- use juel for this input entry -->
<inputEntry expressionLanguage="juel">
<text><![CDATA[cellInput >= 18 && cellInput <= 30]]></text>
</inputEntry>
<!-- use javascript for this output entry -->
<outputEntry expressionLanguage="javascript">
<text>"okay"</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
<decision id="decision2" name="Decision 2">
<!-- use groovy for this literal expression -->
<literalExpression expressionLanguage="groovy">
<text>a + b</text>
</literalExpression>
</decision>
</definitions>
If you want to use another Java Unified Expression Language or FEEL implementation, you can replace the default implementations in the DMN engine configuration. This way you can also change the JSR-223 script engine resolving, for example if you want to configure the script engine before using it.