4.3. FEEL を使用したルール表現
FEEL (Friendly Enough Expression Language) は、オブジェクトマネージメントグループ (OMG: Object Management Group) の DMN 仕様が定義する式言語です。FEEL 式は DMN モデルを使用して、意思決定のロジックを定義します。FEEL は、デシジョンモデル設定概念にセマンティクスを割り当てて、意思決定のモデル化および実行を容易にすることを目的としています。意思決定要件ダイアグラム (DRD) の FEEL 式は、デシジョンノードおよびビジネスナレッジモデルのボックス式のテーブルセルで使用されます。
DMN における FEEL の詳細は、OMG の Decision Model and Notation specification を参照してください。
4.3.1. FEEL のデータ型
FEEL (Friendly Enough Expression Language) では、以下のデータ型がサポートされます。
- 数値
- 文字列
- ブール値
- 日付
- 時間
- 日時
- 日時で指定する期間
- 年および月で指定する期間
- 関数
- コンテキスト
- 範囲 (または間隔)
- リスト
FEEL では、DMN 仕様で変数を function
、context
、range
、または list
として宣言する明示的な方法はありませんが、Red Hat Decision Manager では、これらの種類の変数をサポートするように DMN 型が拡張されています。
次の一覧では、各データ型を説明します。
- 数値
数値は、FEEL では IEEE 754-2008 の 10 進法の 128 形式 (34 桁) に基づいています。内部的には、数値は Java の
MathContext DECIMAL128
を持つBigDecimals
として表されます。FEEL でサポートされる数値データ型は 1 つしかないため、整数と浮動小数点には同じ型が使用されます。FEEL では、小数点の記号にドット (
.
) が使用されます。-INF
、+INF
、またはNaN
はサポートされません。FEEL では、null
を使用して、無効な数字を表します。Red Hat Decision Manager では、DMN 仕様が拡張され、以下の数値表記法もサポートされます。
-
科学的記数法: 接尾辞
e<exp>
またはE<exp>
を付けて、科学的記数法を使用できます。たとえば、1.2e3
は1.2*10**3
と表記するのと同じですが、式ではなくリテラルを使用しています。 -
16 進数: プリフィックス
0x
を付けて、16 進数を使用できます。たとえば、0xff
は、10 進数の255
と同じです。大文字および小文字いずれもサポートされます。たとえば、0XFF
は0xff
と同じです。 -
型の接尾辞: 型の接尾辞として
f
、F
、d
、D
、l
、L
を使用できます。この接尾辞は無視されます。
-
科学的記数法: 接尾辞
- 文字列
FEEL では、二重引用符で区切った文字が文字列として解釈されます。
例
"John Doe"
- ブール値
-
FEEL は、3 値ブール論理を使用するため、ブール論理式には
true
、false
、またはnull
を使用できます。 - 日付
FEEL では日付リテラルがサポートされていませんが、組み込みの
date()
関数を使用して日付の値を構築できます。時間文字列は、FEEL では XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠します。形式は、"YYYY-MM-DD"
で、YYYY
は 4 桁の年数、MM
は 2 桁の月数、DD
は日数に置き換えます。以下に例を示します。
date( "2017-06-23" )
日付オブジェクトには、真夜中を表す
"00:00:00"
と同一の時間があります。日付には、タイムゾーンがなく、ローカルであると見なされます。- 時間
FEEL では時間リテラルがサポートされていませんが、組み込みの
time()
関数を使用して時間の値を構築できます。時間文字列は、FEEL では XML Schema Part 2: Datatypes ドキュメントで定義されている形式に準拠します。形式は"hh:mm:ss[.uuu][(+-)hh:mm]"
です。ここで、hh
は時間 (00
から23
)、mm
は分、ss
は秒です。任意で、ミリ秒 (uuu
) を定義でき、UTC 時間の正 (+
) または負 (-
) のオフセットを追加してタイムゾーンを定義できます。オフセットを使用する代わりに、z
文字を使用して UTC 時間を表すことができますが、これは-00:00
のオフセットと同じです。オフセットが定義されていない場合には、時間はローカルとみなされます。例 :
time( "04:25:12" ) time( "14:10:00+02:00" ) time( "22:35:40.345-05:00" ) time( "15:00:30z" )
オフセットまたはタイムゾーンを定義する時間値は、オフセットまたはタイムゾーンを定義しないローカル時間と比較できません。
- 日時
FEEL では日時リテラルがサポートされていませんが、組み込みの
date and time()
関数を使用して値を構築できます。日時文字列は、FEEL では XML Schema Part 2: Datatypes ドキュメントに定義された形式に準拠します。形式は"<date>T<time>"
です。<date>
および<time>
は規定の XML スキーマ形式に準拠し、T
で結合されます。例 :
date and time( "2017-10-22T23:59:00" ) date and time( "2017-06-13T14:10:00+02:00" ) date and time( "2017-02-05T22:35:40.345-05:00" ) date and time( "2017-06-13T15:00:30z" )
オフセットまたはタイムゾーンを定義する日時の値と、オフセットまたはタイムゾーンを定義しないローカルの日時の値を比較することはできません。
重要DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード
dateTime
をdate and time
の同義語として使用してください。- 日時で指定する期間
FEEL では日と時間で指定する期間を表すリテラルがサポートされていませんが、組み込みの
duration()
関数を使用して値を構築できます。FEEL では、XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠しますが、日、時間、分、および秒にしか適用されません。月および年はサポートされません。例 :
duration( "P1DT23H12M30S" ) duration( "P23D" ) duration( "PT12H" ) duration( "PT35M" )
重要DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード
dayTimeDuration
をdays and time duration
の同義語として使用してください。- 年および月で指定する期間
FEEL では年と月で指定する期間リテラルがサポートされていませんが、組み込みの
duration()
関数を使用して値を構築できます。FEEL では XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠しますが、年と月にしか適用されません。日、時間、分、または秒はサポートされません。例 :
duration( "P3Y5M" ) duration( "P2Y" ) duration( "P10M" ) duration( "P25M" )
重要DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード
yearMonthDuration
をyears and months duration
の同義語として使用してください。- 関数
FEEL には、関数を作成するのに使用する
function
リテラル (または無名関数) があります。DMN 仕様で変数をfunction
として宣言する明示的な方法が提供されていませんが、Red Hat Decision Manager では、関数をサポートするように DMN 型が拡張されています。以下に例を示します。
function(a, b) a + b
この例では、FEEL 式は、パラメーター
a
およびb
を追加して結果を返す関数を作成します。- コンテキスト
FEEL には、コンテキストを作成するのに使用する
context
リテラルがあります。context
は、FEEL ではキーと値のペアのリストとなり、Java などの言語におけるマッピングに似ています。DMN 仕様で変数をcontext
として宣言する明示的な方法が提供されていませんが、Red Hat Decision Manager では、コンテキストをサポートするように組み込みの DMN 型が拡張されています。以下に例を示します。
{ x : 5, y : 3 }
この式では、チャート内の等位を示す 2 つのエントリー (
x
およびy
) を持つコンテキストが作成されます。DMN 1.2 では、コンテキスト作成に、キーの一覧を属性として含めてアイテム定義を作成し、そのアイテム定義型を含めて変数を宣言する方法も使用できます。
Red Hat Decision Manager の DMN API では、
DMNContext
の DMNItemDefinition
構造様式として、次の 2 つがサポートされます。-
ユーザー定義の Java タイプ: DMN の
ItemDefinition
で各コンポーネントのプロパティーとゲッターを定義する有効な JavaBeans オブジェクト。必要に応じて、無効な Java 識別子になるコンポーネント名を示すゲッターに対して@FEELProperty
アノテーションを使用することもできます。 -
java.util.Map
インターフェイス: DMN のItemDefinition
でコンポーネント名に対応するキーで、適切なエンティティーを定義する必要があります。
-
ユーザー定義の Java タイプ: DMN の
- 範囲 (または間隔)
FEEL には、範囲または間隔を作成するのに使用する
range
リテラルがあります。FEEL のrange
は、下方境界および上方境界を定義する値で、開区間または閉区間のいずれかにできます。DMN 仕様には (別の式で使用する以外に) 変数をrange
と宣言する明示的な方法はありませんが、Red Hat Decision Manager では、範囲をサポートするように DMN 型が拡張されています。範囲の構文は以下の形式で定義されます。
range := interval_start endpoint '..' endpoint interval_end interval_start := open_start | closed_start open_start := '(' | ']' closed_start := '[' interval_end := open_end | closed_end open_end := ')' | '[' closed_end := ']' endpoint := expression
エンドポイントの式は比較可能な値を返す必要があり、下方エンドポイントは上方エンドポイントよりも低くなる必要があります。
たとえば、以下のリテラル式は、
1
から10
まで (いずれも閉区間) の間隔を定義します。[ 1 .. 10 ]
以下のリテラル式は 1 時間から 12 時間までの間隔を定義します。下方境界は含まれます (閉区間) が、上方境界は含まれません (開区間)。
[ duration("PT1H") .. duration("PT12H") )
デシジョンテーブルの範囲を使用して値の範囲をテストしたり、単純なリテラル式で範囲を使用したりできます。たとえば、以下のリテラル式は、変数
x
が0
から100
の間にある場合はtrue
を返します。x in [ 1 .. 100 ]
- リスト
FEEL には、アイテムの一覧を作成するのに使用する
list
リテラルがあります。FEEL のlist
は、値のコンマ区切りの一覧を角カッコで囲んで表現できます。DMN 仕様には (別の式で使用する以外に) 変数をlist
と宣言する明示的な方法はありませんが、Red Hat Decision Manager では、範囲をサポートするように DMN 型が拡張されています。以下に例を示します。
[ 2, 3, 4, 5 ]
FEEL のリストはすべて同じ型の要素を含み、変更できません。リストの要素はインデックスでアクセスでき、最初の要素が
1
になります。負のインデックスは、リストの末尾から数えた要素を表します。たとえば、-1
は最後の要素にアクセスできることを示します。たとえば、以下の式は、リスト
x
の 2 番目の要素を返します。x[2]
以下の式は、リスト
x
の、最後から 2 番目の要素を返します。x[-2]
一覧の要素は、
count
の関数でカウントすることもでき、この関数は、要素の一覧をパラメーターとして使用します。たとえば、以下の式では
4
を返します。count([ 2, 3, 4, 5 ])