Data Types in the DMN Engine
A decision table allows to specify the types of inputs and outputs. When the DMN engine evaluates an input or an output, it checks if the type of the value matches the specified type. If the types do not match, the engine tries to transform the value into the specified type or throws an exception.
The DMN engine supports basic types which can be extended by custom types.
Supported Data Types
The following types are supported by the DMN engine:
Data Type | Can transform from | Produce values of type |
---|---|---|
string | java.lang.Object | StringValue |
boolean | java.lang.Boolean, java.lang.String | BooleanValue |
integer | java.lang.Number, java.lang.String | IntegerValue |
long | java.lang.Number, java.lang.String | LongValue |
double | java.lang.Number, java.lang.String | DoubleValue |
date |
java.util.Date, java.lang.String, java.time.LocalDateTime, java.time.ZonedDateTime |
DateValue |
Each data type transformer produces a typed value which contains the value and additional type informations.
If the given type does not match one of the above types then the value is transformed into an untyped value by default.
Working with Dates
The DMN engine supports a date
type which is a combination of date and time.
By default, the data type transformer accept objects of the types:
java.util.Date
- Strings having the format
yyyy-MM-dd'T'HH:mm:ss
java.time.LocalDateTime
java.time.ZonedDateTime
If you prefer another format or different representation of a date, implement a custom type and replace the default transformer.
Setting the Data Type of an Input
The type of a decision table input is specified by the typeRef
attribute on the
inputExpression
element.
<decision>
<decisionTable>
<input id="orderSum" label="Order sum">
<inputExpression typeRef="double">
<text>sum</text>
</inputExpression>
</input>
<!-- ... -->
</decisionTable>
</decision>
Setting the Data Type of an Output
The type of a decision table output is specified by the typeRef
attribute on the output
element.
<decision>
<decisionTable>
<!-- ... -->
<output id="result" label="Check Result" name="result" typeRef="string" />
<!-- ... -->
</decisionTable>
</decision>
Setting the Data Type of a Variable
The type of a decision literal expression result is specified by the typeRef
attribute on the variable
element.
<decision>
<variable name="result" typeRef="string" />
<!-- ... -->
</decision>
Implement a Custom Data Type
Use of Internal API
Please be aware that these APIs are not part of the public API and may change in later releases.
The default data types of the DMN engine can be extended or replaced by custom types. For example, you can add a new type for time or change the transformation to support a different date format or localized boolean constants.
To do this, implement a new DmnDataTypeTransformer
. The transformation is processed in the
transform()
method and returns a typed value. If it cannot successfully transform a value,
it must throw an IllegalArgumentException
.
public class CustomDataTypeTransformer implements DmnDataTypeTransformer {
public TypedValue transform(Object value) throws IllegalArgumentException {
// transform the value into a typed value
return typedValue;
}
}
To use this data type transformer in the DMN engine, add it to the DMN engine configuration.