2.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 を参照してください。
2.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"
"John Doe"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ブール値
-
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" )
date( "2017-06-23" )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 日付オブジェクトには、真夜中を表す
"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" )
time( "04:25:12" ) time( "14:10:00+02:00" ) time( "22:35:40.345-05:00" ) time( "15:00:30z" )Copy to Clipboard Copied! Toggle word wrap Toggle overflow オフセットまたはタイムゾーンを定義する時間値は、オフセットまたはタイムゾーンを定義しないローカル時間と比較できません。
- 日時
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" )
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" )Copy to Clipboard Copied! Toggle word wrap Toggle overflow オフセットまたはタイムゾーンを定義する日時の値と、オフセットまたはタイムゾーンを定義しないローカルの日時の値を比較することはできません。
重要DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード
dateTimeをdate and timeの同義語として使用してください。- 日時で指定する期間
FEEL では日と時間で指定する期間を表すリテラルがサポートされていませんが、組み込みの
duration()関数を使用して値を構築できます。FEEL では、XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠しますが、日、時間、分、および秒にしか適用されません。月および年はサポートされません。例 :
duration( "P1DT23H12M30S" ) duration( "P23D" ) duration( "PT12H" ) duration( "PT35M" )
duration( "P1DT23H12M30S" ) duration( "P23D" ) duration( "PT12H" ) duration( "PT35M" )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード
dayTimeDurationをdays and time durationの同義語として使用してください。- 年および月で指定する期間
FEEL では年と月で指定する期間リテラルがサポートされていませんが、組み込みの
duration()関数を使用して値を構築できます。FEEL では XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠しますが、年と月にしか適用されません。日、時間、分、または秒はサポートされません。例 :
duration( "P3Y5M" ) duration( "P2Y" ) duration( "P10M" ) duration( "P25M" )
duration( "P3Y5M" ) duration( "P2Y" ) duration( "P10M" ) duration( "P25M" )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード
yearMonthDurationをyears and months durationの同義語として使用してください。- 関数
FEEL には、関数を作成するのに使用する
functionリテラル (または無名関数) があります。DMN 仕様で変数をfunctionとして宣言する明示的な方法が提供されていませんが、Red Hat Decision Manager では、関数をサポートするように DMN 型が拡張されています。以下に例を示します。
function(a, b) a + b
function(a, b) a + bCopy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、FEEL 式は、パラメーター
aおよびbを追加して結果を返す関数を作成します。- コンテキスト
FEEL には、コンテキストを作成するのに使用する
contextリテラルがあります。contextは、FEEL ではキーと値のペアのリストとなり、Java などの言語におけるマッピングに似ています。DMN 仕様で変数をcontextとして宣言する明示的な方法が提供されていませんが、Red Hat Decision Manager では、コンテキストをサポートするように組み込みの DMN 型が拡張されています。以下に例を示します。
{ x : 5, y : 3 }{ x : 5, y : 3 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow この式では、チャート内の等位を示す 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 型が拡張されています。範囲の構文は以下の形式で定義されます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow エンドポイントの式は比較可能な値を返す必要があり、下方エンドポイントは上方エンドポイントよりも低くなる必要があります。
たとえば、以下のリテラル式は、
1から10まで (いずれも閉区間) の間隔を定義します。[ 1 .. 10 ]
[ 1 .. 10 ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のリテラル式は 1 時間から 12 時間までの間隔を定義します。下方境界は含まれます (閉区間) が、上方境界は含まれません (開区間)。
[ duration("PT1H") .. duration("PT12H") )[ duration("PT1H") .. duration("PT12H") )Copy to Clipboard Copied! Toggle word wrap Toggle overflow デシジョンテーブルの範囲を使用して値の範囲をテストしたり、単純なリテラル式で範囲を使用したりできます。たとえば、以下のリテラル式は、変数
xが0から100の間にある場合はtrueを返します。x in [ 1 .. 100 ]
x in [ 1 .. 100 ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - リスト
FEEL には、アイテムの一覧を作成するのに使用する
listリテラルがあります。FEEL のlistは、値のコンマ区切りの一覧を角カッコで囲んで表現できます。DMN 仕様には (別の式で使用する以外に) 変数をlistと宣言する明示的な方法はありませんが、Red Hat Decision Manager では、範囲をサポートするように DMN 型が拡張されています。以下に例を示します。
[ 2, 3, 4, 5 ]
[ 2, 3, 4, 5 ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow FEEL のリストはすべて同じ型の要素を含み、変更できません。リストの要素はインデックスでアクセスでき、最初の要素が
1になります。負のインデックスは、リストの末尾から数えた要素を表します。たとえば、-1は最後の要素にアクセスできることを示します。たとえば、以下の式は、リスト
xの 2 番目の要素を返します。x[2]
x[2]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の式は、リスト
xの、最後から 2 番目の要素を返します。x[-2]
x[-2]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 一覧の要素は、
countの関数でカウントすることもでき、この関数は、要素の一覧をパラメーターとして使用します。たとえば、以下の式では
4を返します。count([ 2, 3, 4, 5 ])
count([ 2, 3, 4, 5 ])Copy to Clipboard Copied! Toggle word wrap Toggle overflow