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 ])
4.3.2. FEEL の組み込み関数
他のプラットフォームやシステムとの相互運用性を促進するために、FEEL (Friendly Enough Expression Language) には組み込み関数のライブラリーが含まれています。組み込みの FEEL 機能は、DMN デシジョンサービスで関数を使用できるように、Drools の Decision Model and Notation (DMN) エンジンで実装されています。
以下のセクションでは、NAME( PARAMETERS ) の形式で記載されている、FEEL の組み込み関数ごとに説明します。DMN における FEEL の詳細は、OMG の Decision Model and Notation specification を参照してください。
4.3.2.1. 変換関数
以下の関数は、異なるタイプの値同士での変換をサポートします。以下の例のように、これらの関数の一部は、特定の文字列形式を使用します。
-
date string:2020-06-01など、XML Schema Part 2: Datatypes ドキュメントで定義されている形式に準拠します。 time string: 以下のいずれかの形式に従います。-
23:59:00zなど、XML Schema Part 2: Datatypes ドキュメントに定義されている形式 -
00:01:00@Etc/UTCなど、ISO 8601 で定義したローカルの時間の後に@および IANA タイムゾーンを続けた形式
-
-
date time string:2012-12-25T11:00:00Zのように、date stringの後にTとtime string列が続く形式に従います。 -
duration string:P1Y2Mなどの XQuery 1.0 and XPath 2.0 Data Model に定義されているdays and time durationおよびyears and months durationの形式に従います
- date( from ) - date の使用
fromをdate値に変換します。表4.3 パラメーター
パラメーター タイプ 形式 fromstringdate string例
date( "2012-12-25" ) - date( "2012-12-24" ) = duration( "P1D" )
- date( from ) - date and time の使用
値を
fromからdateに変換し、時間のコンポーネントを null に設定します。表4.4 パラメーター
パラメーター タイプ fromdate and time例
date(date and time( "2012-12-25T11:00:00Z" )) = date( "2012-12-25" )
- date( year, month, day )
指定の year、month、および day の値から
dateを生成します。表4.5 パラメーター
パラメーター タイプ yearnumbermonthnumberdaynumber例
date( 2012, 12, 25 ) = date( "2012-12-25" )
- date and time( date, time )
指定した日付から
date and timeを生成して、時間のコンポーネントと指定の時間を無視します。表4.6 パラメーター
パラメーター タイプ datedateまたはdate and timetimetime例
date and time ( "2012-12-24T23:59:00" ) = date and time(date( "2012-12-24" ), time( "23:59:00" ))
- date and time( from )
指定の文字列から
date and timeを生成します。表4.7 パラメーター
パラメーター タイプ 形式 fromstringdate time string例
date and time( "2012-12-24T23:59:00" ) + duration( "PT1M" ) = date and time( "2012-12-25T00:00:00" )
- time( from )
指定の文字列から
timeを生成します。表4.8 パラメーター
パラメーター タイプ 形式 fromstringtime string例
time( "23:59:00z" ) + duration( "PT2M" ) = time( "00:01:00@Etc/UTC" )
- time( from )
指定のパラメーターから
timeを生成し、日付コンポーネントを無視します。表4.9 パラメーター
パラメーター タイプ fromtimeまたはdate and time例
time(date and time( "2012-12-25T11:00:00Z" )) = time( "11:00:00Z" )
- time( hour, minute, second, offset? )
指定した hour、minute、および second のコンポーネント値から
timeを生成します。表4.10 パラメーター
パラメーター タイプ hournumberminutenumbersecondnumberoffset(任意)days and time durationまたは null例
time( "23:59:00z" ) = time(23, 59, 0, duration( "PT0H" ))
- number( from, grouping separator, decimal separator )
指定の区切り文字を使用して
fromをnumberに変換します。表4.11 パラメーター
パラメーター タイプ from有効な数字を表す
stringgrouping separatorスペース ( )、コンマ (
,)、ピリオド (.)、または nulldecimal separatorgrouping separatorと同じタイプですが、同じ値は使用できません。例
number( "1 000,0", " ", "," ) = number( "1,000.0", ",", "." )
- string( from )
指定のパラメーターを文字列表現にします。
表4.12 パラメーター
パラメーター タイプ fromnull 値以外の値
例
string( 1.1 ) = "1.1" string( null ) = null
- duration( from )
fromをdays and time duration、またはyears and months durationに変換します。表4.13 パラメーター
パラメーター タイプ 形式 fromstringduration string例
date and time( "2012-12-24T23:59:00" ) - date and time( "2012-12-22T03:45:00" ) = duration( "P2DT20H14M" ) duration( "P2Y2M" ) = duration( "P26M" )
- years and months duration( from, to )
指定した 2 つのパラメーター間の
years and months durationを計算します。表4.14 パラメーター
パラメーター タイプ fromdateまたはdate and timetodateまたはdate and time例
years and months duration( date( "2011-12-22" ), date( "2013-08-24" ) ) = duration( "P1Y8M" )
4.3.2.2. ブール値関数
以下の関数は、ブール値の操作をサポートします。
- not( negand )
negandオペランドの論理否定を実行します。表4.15 パラメーター
パラメーター タイプ negandboolean例
not( true ) = false not( null ) = null
4.3.2.3. 文字列関数
以下の関数は、文字列の操作をサポートします。
FEEL では、Unicode 文字はコードポイントを基にカウントされます。
- substring( string, start position, length? )
指定の長さの開始地点からサブ文字列を返します。最初の文字の位置値は
1です。表4.16 パラメーター
パラメーター タイプ stringstringstart positionnumberlength(任意)number例
substring( "testing",3 ) = "sting" substring( "testing",3,3 ) = "sti" substring( "testing", -2, 1 ) = "n" substring( "\U01F40Eab", 2 ) = "ab"
注記FEEL では、文字リテラルの
"\U01F40Eab"は🐎ab文字列 (馬の記号の後にaとb) となります。
- string length( string )
指定の文字列の長さを計算します。
表4.17 パラメーター
パラメーター タイプ stringstring例
string length( "tes" ) = 3 string length( "\U01F40Eab" ) = 3
- upper case( string )
指定の文字列の大文字バージョンを生成します。
表4.18 パラメーター
パラメーター タイプ stringstring例
upper case( "aBc4" ) = "ABC4"
- lower case( string )
指定の文字列の小文字バージョンを生成します。
表4.19 パラメーター
パラメーター タイプ stringstring例
lower case( "aBc4" ) = "abc4"
- substring before( string, match )
一致した値の前にあるサブ文字列を計算します。
表4.20 パラメーター
パラメーター タイプ stringstringmatchstring例
substring before( "testing", "ing" ) = "test" substring before( "testing", "xyz" ) = ""
- substring after( string, match )
一致した値の後にあるサブ文字列を計算します。
表4.21 パラメーター
パラメーター タイプ stringstringmatchstring例
substring after( "testing", "test" ) = "ing" substring after( "", "a" ) = ""
- replace( input, pattern, replacement, flags? )
正規表現の置換を計算します。
表4.22 パラメーター
パラメーター タイプ inputstringpatternstringreplacementstringflags(任意)string注記この関数は、XQuery 1.0 and XPath 2.0 Functions and Operators で定義されている正規表現パラメーターを使用します。
例
replace( "abcd", "(ab)|(a)", "[1=$1][2=$2]" ) = "[1=ab][2=]cd"
- contains( string, match )
文字列に一致部分が含まれる場合に
trueを返します。表4.23 パラメーター
パラメーター タイプ stringstringmatchstring例
contains( "testing", "to" ) = false
- starts with( string, match )
指定の値と一致する文字列で開始する場合に、
trueを返します。表4.24 パラメーター
パラメーター タイプ stringstringmatchstring例
starts with( "testing", "te" ) = true
- ends with( string, match )
指定の値と一致する文字列で終了する場合に、
trueを返します。表4.25 パラメーター
パラメーター タイプ stringstringmatchstring例
ends with( "testing", "g" ) = true
- matches( input, pattern, flags? )
入力が正規表現と一致する場合に
trueを返します。表4.26 パラメーター
パラメーター タイプ inputstringpatternstringflags(任意)string注記この関数は、XQuery 1.0 and XPath 2.0 Functions and Operators で定義されている正規表現パラメーターを使用します。
例
matches( "teeesting", "^te*sting" ) = true
- split( string, delimiter )
元の文字列のリストを返し、区切り文字の正規表現パターンで分割します。
表4.27 パラメーター
パラメーター タイプ stringstringdelimiter正規表現パターンの
string注記この関数は、XQuery 1.0 and XPath 2.0 Functions and Operators で定義されている正規表現パラメーターを使用します。
例
split( "John Doe", "\\s" ) = ["John", "Doe"] split( "a;b;c;;", ";" ) = ["a","b","c","",""]
4.3.2.4. リスト関数
以下の関数は、リストの操作をサポートします。
FEEL では、リストに含まれる最初の要素のインデックスは 1 となります。リストに含まれる最後の要素のインデックスは -1 として特定できます。
- list contains( list, element )
リストに対象の要素が含まれる場合には
trueを返します。表4.28 パラメーター
パラメーター タイプ listlistelementnull を含むすべてのタイプ
例
list contains( [1,2,3], 2 ) = true
- count( list )
リスト内の要素をカウントします。
表4.29 パラメーター
パラメーター タイプ listlist例
count( [1,2,3] ) = 3 count( [] ) = 0 count( [1,[2,3]] ) = 2
- min( list )
一覧の値と同じ最小の要素を返します。
表4.30 パラメーター
パラメーター タイプ listlist別の署名
min( e1, e2, ..., eN )
例
min( [1,2,3] ) = 1 min( 1 ) = 1 min( [1] ) = 1
- max( list )
一覧の値と同じ最大の要素を返します。
表4.31 パラメーター
パラメーター タイプ listlist別の署名
max( e1, e2, ..., eN )
例
max( 1,2,3 ) = 3 max( [] ) = null
- sum( list )
リスト内の数字の合計を返します。
表4.32 パラメーター
パラメーター タイプ listnumber要素のlist別の署名
sum( n1, n2, ..., nN )
例
sum( [1,2,3] ) = 6 sum( 1,2,3 ) = 6 sum( 1 ) = 1 sum( [] ) = null
- mean( list )
リスト内の要素の平均 (計算平均) を計算します。
表4.33 パラメーター
パラメーター タイプ listnumber要素のlist別の署名
mean( n1, n2, ..., nN )
例
mean( [1,2,3] ) = 2 mean( 1,2,3 ) = 2 mean( 1 ) = 1 mean( [] ) = null
- all( list )
リスト内の全要素が true の場合は
trueを返します。表4.34 パラメーター
パラメーター タイプ listboolean要素のlist別の署名
all( b1, b2, ..., bN )
例
all( [false,null,true] ) = false all( true ) = true all( [true] ) = true all( [] ) = true all( 0 ) = null
- any( list )
リスト内の要素が true の場合は
trueを返します。表4.35 パラメーター
パラメーター タイプ listboolean要素のlist別の署名
any( b1, b2, ..., bN )
例
any( [false,null,true] ) = true any( false ) = false any( [] ) = false any( 0 ) = null
- sublist( list, start position, length? )
開始位置からサブリストを返します。ただし、length 要素に限定されます。
表4.36 パラメーター
パラメーター タイプ listliststart positionnumberlength(任意)number例
sublist( [4,5,6], 1, 2 ) = [4,5]
- append( list, item )
アイテムに追加されるリストを作成します。
表4.37 パラメーター
パラメーター タイプ listlistitem任意のタイプ
例
append( [1], 2, 3 ) = [1,2,3]
- concatenate( list )
連結された一覧の結果で一覧を作成します。
表4.38 パラメーター
パラメーター タイプ listlist例
concatenate( [1,2],[3] ) = [1,2,3]
- insert before( list, position, newItem )
指定の位置に挿入された
newItemでリストを作成します。表4.39 パラメーター
パラメーター タイプ listlistpositionnumbernewItem任意のタイプ
例
insert before( [1,3],1,2 ) = [2,1,3]
- remove( list, position )
指定の位置から除外された要素を削除して一覧を作成します。
表4.40 パラメーター
パラメーター タイプ listlistpositionnumber例
remove( [1,2,3], 2 ) = [1,3]
- reverse( list )
逆リストを返します。
表4.41 パラメーター
パラメーター タイプ listlist例
reverse( [1,2,3] ) = [3,2,1]
- index of( list, match )
要素に一致するインデックスを返します。
パラメーター
-
listタイプのlist -
任意のタイプの
match
表4.42 パラメーター
パラメーター タイプ listlistmatch任意のタイプ
例
index of( [1,2,3,2],2 ) = [2,4]
-
- union( list )
複数のリストから全要素の一覧を返し、重複を除外します。
表4.43 パラメーター
パラメーター タイプ listlist例
union( [1,2],[2,3] ) = [1,2,3]
- distinct values( list )
単一リストから要素の一覧を返し、重複を除外します。
表4.44 パラメーター
パラメーター タイプ listlist例
distinct values( [1,2,3,2,1] ) = [1,2,3]
- flatten( list )
フラット化されたリストを返します。
表4.45 パラメーター
パラメーター タイプ listlist例
flatten( [[1,2],[[3]], 4] ) = [1,2,3,4]
- product( list )
リスト内の数字の積を返します。
表4.46 パラメーター
パラメーター タイプ listnumber要素のlist別の署名
product( n1, n2, ..., nN )
例
product( [2, 3, 4] ) = 24 product( 2, 3, 4 ) = 24
- median( list )
リストの数字の中央値を返します。要素の数が奇数の場合、結果は中央の要素になります。要素の数が偶数の場合、結果は中央にある 2 つの要素の平均になります。
表4.47 パラメーター
パラメーター タイプ listnumber要素のlist別の署名
median( n1, n2, ..., nN )
例
median( 8, 2, 5, 3, 4 ) = 4 median( [6, 1, 2, 3] ) = 2.5 median( [ ] ) = null
- stddev( list )
リストの数値の標準偏差を返します。
表4.48 パラメーター
パラメーター タイプ listnumber要素のlist別の署名
stddev( n1, n2, ..., nN )
例
stddev( 2, 4, 7, 5 ) = 2.081665999466132735282297706979931 stddev( [47] ) = null stddev( 47 ) = null stddev( [ ] ) = null
- mode( list )
リスト内の数字の最頻値を返します。複数の要素が返される場合、番号は昇順でソートされます。
表4.49 パラメーター
パラメーター タイプ listnumber要素のlist別の署名
mode( n1, n2, ..., nN )
例
mode( 6, 3, 9, 6, 6 ) = [6] mode( [6, 1, 9, 6, 1] ) = [1, 6] mode( [ ] ) = [ ]
4.3.2.4.1. ループステートメント
ループステートメントは、一部の要素が特定の条件を満たしているかどうかを変換または検証できます。
- For in(list)
リスト要素を繰り返し処理します。
表4.50 パラメーター
パラメーター タイプ list任意の要素のリスト例
for i in [1, 2, 3] return i * i = [1, 4, 9] for i in [1,2,3], j in [1,2,3] return i*j = [1, 2, 3, 2, 4, 6, 3, 6, 9]
- some in(list)satisfy(condition)
リスト内のいずれかの要素が条件を満たす場合、単一のブール値 (true または false) に戻ります。
表4.51 パラメーター
パラメーター タイプ list任意の要素のリストconditionブール式は true または false と評価します。
例
some i in [1, 2, 3] satisfies i > 3 = true some i in [1, 2, 3] satisfies i > 4 = false
- (リスト) のすべてが (条件) を満たす
リスト内のすべての要素が条件を満たす場合、単一のブール値 (true または false) に戻ります。
表4.52 パラメーター
パラメーター タイプ list任意の要素のリストconditionブール式は true または false と評価します。
例
every i in [1, 2, 3] satisfies i > 1 = false every i in [1, 2, 3] satisfies i > 0 = true
4.3.2.5. 数値関数
以下の関数は、数値演算をサポートしています。
- decimal( n, scale )
指定されたスケールの数値を返します。
表4.53 パラメーター
パラメーター タイプ nnumberscale範囲の
[−6111..6176]のnumber注記この関数は、少数値を最も近い 10 進数の数値に丸める
FEEL:number定義と合致するように実装されます。例
decimal( 1/3, 2 ) = .33 decimal( 1.5, 0 ) = 2 decimal( 2.5, 0 ) = 2 decimal( 1.035, 2 ) = 1.04 decimal( 1.045, 2 ) = 1.04 decimal( 1.055, 2 ) = 1.06 decimal( 1.065, 2 ) = 1.06
- floor( n )
指定された数値以下の最大の整数を返します。
表4.54 パラメーター
パラメーター タイプ nnumber例
floor( 1.5 ) = 1 floor( -1.5 ) = -2
- ceiling( n )
指定された数値以上の最小の整数を返します。
表4.55 パラメーター
パラメーター タイプ nnumber例
ceiling( 1.5 ) = 2 ceiling( -1.5 ) = -1
- abs( n )
絶対値を返します。
表4.56 パラメーター
パラメーター タイプ nnumber、days and time duration、またはyears and months duration例
abs( 10 ) = 10 abs( -10 ) = 10 abs( @"PT5H" ) = @"PT5H" abs( @"-PT5H" ) = @"PT5H"
- modulo( dividend, divisor )
除数による被除数の除算の余りを返します。被除数または除数のいずれかが負の場合、結果は除数と同じ符号になります。
注記この関数は、
modulo(dividend, divisor) = dividend - divisor*floor(dividen d/divisor)としても表されます。表4.57 パラメーター
パラメーター タイプ dividendnumberdivisornumber例
modulo( 12, 5 ) = 2 modulo( -12,5 )= 3 modulo( 12,-5 )= -3 modulo( -12,-5 )= -2 modulo( 10.1, 4.5 )= 1.1 modulo( -10.1, 4.5 )= 3.4 modulo( 10.1, -4.5 )= -3.4 modulo( -10.1, -4.5 )= -1.1
- sqrt( number )
指定された数値の平方根を返します。
表4.58 パラメーター
パラメーター タイプ nnumber例
sqrt( 16 ) = 4
- log( number )
指定された数値の対数を返します。
表4.59 パラメーター
パラメーター タイプ nnumber例
decimal( log( 10 ), 2 ) = 2.30
- exp( number )
オイラーの数値
eを、指定された数の累乗で返します。表4.60 パラメーター
パラメーター タイプ nnumber例
decimal( exp( 5 ), 2 ) = 148.41
- odd( number )
指定された数が奇数の場合は
trueを返します。表4.61 パラメーター
パラメーター タイプ nnumber例
odd( 5 ) = true odd( 2 ) = false
- even( number )
指定された数が偶数の場合は
trueを返します。表4.62 パラメーター
パラメーター タイプ nnumber例
even( 5 ) = false even ( 2 ) = true
4.3.2.6. 日付および時刻の関数
以下の関数は、日付および時刻の演算をサポートしています。
- is( value1, value2 )
両方の値が FEEL セマンティックドメインの同じ要素である場合は、
trueを返します。表4.63 パラメーター
パラメーター タイプ value1任意のタイプ
value2任意のタイプ
例
is( date( "2012-12-25" ), time( "23:00:50" ) ) = false is( date( "2012-12-25" ), date( "2012-12-25" ) ) = true is( time( "23:00:50z" ), time( "23:00:50" ) ) = false
4.3.2.7. リスト関数
次の関数は、単一のスカラー値とそのような値の範囲の間の関係を確立するための時間的順序付け操作をサポートします。これらの関数は、Health Level Seven (HL7) International の Clinical Quality Language (CQL) 1.4 syntax のコンポーネントに似ています。
- before( )
要素
Aが要素Bの前にあり、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
before( point1 point2 ) -
before( point range ) -
before( range point ) -
before( range1,range2 )
trueに評価するための要件-
point1 < point2 -
point < range.start or ( point = range.start and not(range.start included) ) -
range.end < point or ( range.end = point and not(range.end included) ) -
range1.end < range2.start or (( not(range1.end included) or not(range2.start included) ) and range1.end = range2.start )
例
before( 1, 10 ) = true before( 10, 1 ) = false before( 1, [1..10] ) = false before( 1, (1..10] ) = true before( 1, [5..10] ) = true before( [1..10], 10 ) = false before( [1..10), 10 ) = true before( [1..10], 15 ) = true before( [1..10], [15..20] ) = true before( [1..10], [10..20] ) = false before( [1..10), [10..20] ) = true before( [1..10], (10..20] ) = true
-
- after( )
要素
Aが要素Bの後にあり、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
after( point1 point2 ) -
after( point range ) -
after( range, point ) -
after( range1 range2 )
trueに評価するための要件-
point1 > point2 -
point > range.end or ( point = range.end and not(range.end included) ) -
range.start > point or ( range.start = point and not(range.start included) ) -
range1.start > range2.end or (( not(range1.start included) or not(range2.end included) ) and range1.start = range2.end )
例
after( 10, 5 ) = true after( 5, 10 ) = false after( 12, [1..10] ) = true after( 10, [1..10) ) = true after( 10, [1..10] ) = false after( [11..20], 12 ) = false after( [11..20], 10 ) = true after( (11..20], 11 ) = true after( [11..20], 11 ) = false after( [11..20], [1..10] ) = true after( [1..10], [11..20] ) = false after( [11..20], [1..11) ) = true after( (11..20], [1..11] ) = true
-
- meets( )
要素
Aが要素Bを満たし、trueに評価されるための関連要件も満たされた場合はtrueを返します。署名
-
meets( range1, range2 )
trueに評価するための要件-
range1.end included and range2.start included and range1.end = range2.start
例
meets( [1..5], [5..10] ) = true meets( [1..5), [5..10] ) = false meets( [1..5], (5..10] ) = false meets( [1..5], [6..10] ) = false
-
- met by( )
要素
Aが要素Bによって満たされ、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
met by( range1, range2 )
trueに評価するための要件-
range1.start included and range2.end included and range1.start = range2.end
例
met by( [5..10], [1..5] ) = true met by( [5..10], [1..5) ) = false met by( (5..10], [1..5] ) = false met by( [6..10], [1..5] ) = false
-
- overlaps( )
要素
Aが要素Bとオーバーラップし、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
overlaps( range1, range2 )
trueに評価するための要件-
( range1.end > range2.start or (range1.end = range2.start and (range1.end included or range2.end included)) ) and ( range1.start < range2.end or (range1.start = range2.end and range1.start included and range2.end included) )
例
overlaps( [1..5], [3..8] ) = true overlaps( [3..8], [1..5] ) = true overlaps( [1..8], [3..5] ) = true overlaps( [3..5], [1..8] ) = true overlaps( [1..5], [6..8] ) = false overlaps( [6..8], [1..5] ) = false overlaps( [1..5], [5..8] ) = true overlaps( [1..5], (5..8] ) = false overlaps( [1..5), [5..8] ) = false overlaps( [1..5), (5..8] ) = false overlaps( [5..8], [1..5] ) = true overlaps( (5..8], [1..5] ) = false overlaps( [5..8], [1..5) ) = false overlaps( (5..8], [1..5) ) = false
-
- overlaps before( )
要素
Aが要素Bの前にオーバーラップし、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
overlaps before( range1 range2 )
trueに評価するための要件-
( range1.start < range2.start or (range1.start = range2.start and range1.start included and range2.start included) ) and ( range1.end > range2.start or (range1.end = range2.start and range1.end included and range2.start included) ) and ( range1.end < range2.end or (range1.end = range2.end and (not(range1.end included) or range2.end included )) )
例
overlaps before( [1..5], [3..8] ) = true overlaps before( [1..5], [6..8] ) = false overlaps before( [1..5], [5..8] ) = true overlaps before( [1..5], (5..8] ) = false overlaps before( [1..5), [5..8] ) = false overlaps before( [1..5), (1..5] ) = true overlaps before( [1..5], (1..5] ) = true overlaps before( [1..5), [1..5] ) = false overlaps before( [1..5], [1..5] ) = false
-
- overlaps after( )
要素
Aが要素Bの後にオーバーラップする場合に、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
overlaps after( range1 range2 )
trueに評価するための要件-
( range2.start < range1.start or (range2.start = range1.start and range2.start included and not( range1.start included)) ) and ( range2.end > range1.start or (range2.end = range1.start and range2.end included and range1.start included) ) and ( range2.end < range1.end or (range2.end = range1.end and (not(range2.end included) or range1.end included)) )
例
overlaps after( [3..8], [1..5] )= true overlaps after( [6..8], [1..5] )= false overlaps after( [5..8], [1..5] )= true overlaps after( (5..8], [1..5] )= false overlaps after( [5..8], [1..5) )= false overlaps after( (1..5], [1..5) )= true overlaps after( (1..5], [1..5] )= true overlaps after( [1..5], [1..5) )= false overlaps after( [1..5], [1..5] )= false overlaps after( (1..5), [1..5] )= false overlaps after( (1..5], [1..6] )= false overlaps after( (1..5], (1..5] )= false overlaps after( (1..5], [2..5] )= false
-
- finishes( )
要素
Aが要素Bを終了し、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
finishes( point, range ) -
finishes( range1, range2 )
trueに評価するための要件-
range.end included and range.end = point -
range1.end included = range2.end included and range1.end = range2.end and ( range1.start > range2.start or (range1.start = range2.start and (not(range1.start included) or range2.start included)) )
例
finishes( 10, [1..10] ) = true finishes( 10, [1..10) ) = false finishes( [5..10], [1..10] ) = true finishes( [5..10), [1..10] ) = false finishes( [5..10), [1..10) ) = true finishes( [1..10], [1..10] ) = true finishes( (1..10], [1..10] ) = true
-
- finished by( )
要素
Aが要素Bによって終了し、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
finished by( range, point ) -
finished by( range1 range2 )
trueに評価するための要件-
range.end included and range.end = point -
range1.end included = range2.end included and range1.end = range2.end and ( range1.start < range2.start or (range1.start = range2.start and (range1.start included or not(range2.start included))) )
例
finished by( [1..10], 10 ) = true finished by( [1..10), 10 ) = false finished by( [1..10], [5..10] ) = true finished by( [1..10], [5..10) ) = false finished by( [1..10), [5..10) ) = true finished by( [1..10], [1..10] ) = true finished by( [1..10], (1..10] ) = true
-
- includes( )
要素
Aが要素Bを含み、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
includes( range, point ) -
includes( range1, range2 )
trueに評価するための要件-
(range.start < point and range.end > point) or (range.start = point and range.start included) or (range.end = point and range.end included) -
( range1.start < range2.start or (range1.start = range2.start and (range1.start included or not(range2.start included))) ) and ( range1.end > range2.end or (range1.end = range2.end and (range1.end included or not(range2.end included))) )
例
includes( [1..10], 5 ) = true includes( [1..10], 12 ) = false includes( [1..10], 1 ) = true includes( [1..10], 10 ) = true includes( (1..10], 1 ) = false includes( [1..10), 10 ) = false includes( [1..10], [4..6] ) = true includes( [1..10], [1..5] ) = true includes( (1..10], (1..5] ) = true includes( [1..10], (1..10) ) = true includes( [1..10), [5..10) ) = true includes( [1..10], [1..10) ) = true includes( [1..10], (1..10] ) = true includes( [1..10], [1..10] ) = true
-
- during( )
要素
Aが要素Bの間にあり、trueに評価するための関連要件も満たされた場合はtrueを返します。署名
-
during( point, range ) -
during( range1 range2 )
trueに評価するための要件-
(range.start < point and range.end > point) or (range.start = point and range.start included) or (range.end = point and range.end included) -
( range2.start < range1.start or (range2.start = range1.start and (range2.start included or not(range1.start included))) ) and ( range2.end > range1.end or (range2.end = range1.end and (range2.end included or not(range1.end included))) )
例
during( 5, [1..10] ) = true during( 12, [1..10] ) = false during( 1, [1..10] ) = true during( 10, [1..10] ) = true during( 1, (1..10] ) = false during( 10, [1..10) ) = false during( [4..6], [1..10] ) = true during( [1..5], [1..10] ) = true during( (1..5], (1..10] ) = true during( (1..10), [1..10] ) = true during( [5..10), [1..10) ) = true during( [1..10), [1..10] ) = true during( (1..10], [1..10] ) = true during( [1..10], [1..10] ) = true
-
- starts( )
要素
Aが要素Bを開始し、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
starts( point, range ) -
starts( range1, range2 )
trueに評価するための要件-
range.start = point and range.start included -
range1.start = range2.start and range1.start included = range2.start included and ( range1.end < range2.end or (range1.end = range2.end and (not(range1.end included) or range2.end included)) )
例
starts( 1, [1..10] ) = true starts( 1, (1..10] ) = false starts( 2, [1..10] ) = false starts( [1..5], [1..10] ) = true starts( (1..5], (1..10] ) = true starts( (1..5], [1..10] ) = false starts( [1..5], (1..10] ) = false starts( [1..10], [1..10] ) = true starts( [1..10), [1..10] ) = true starts( (1..10), (1..10) ) = true
-
- started by( )
要素
Aが要素Bによって開始し、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
started by( range, point ) -
started by( range1, range2 )
trueに評価するための要件-
range.start = point and range.start included -
range1.start = range2.start and range1.start included = range2.start included and ( range2.end < range1.end or (range2.end = range1.end and (not(range2.end included) or range1.end included)) )
例
started by( [1..10], 1 ) = true started by( (1..10], 1 ) = false started by( [1..10], 2 ) = false started by( [1..10], [1..5] ) = true started by( (1..10], (1..5] ) = true started by( [1..10], (1..5] ) = false started by( (1..10], [1..5] ) = false started by( [1..10], [1..10] ) = true started by( [1..10], [1..10) ) = true started by( (1..10), (1..10) ) = true
-
- coincides( )
要素
Aが要素Bに一致し、評価がtrueになるための関連要件も満たされた場合はtrueを返します。署名
-
coincides( point1, point2 ) -
coincides( range1, range2 )
trueに評価するための要件-
point1 = point2 -
range1.start = range2.start and range1.start included = range2.start included and range1.end = range2.end and range1.end included = range2.end included
例
coincides( 5, 5 ) = true coincides( 3, 4 ) = false coincides( [1..5], [1..5] ) = true coincides( (1..5), [1..5] ) = false coincides( [1..5], [2..6] ) = false
-
4.3.2.8. 時間関数
以下の関数は、一般的な時間演算をサポートしています。
- day of year( date )
その年のその日のグレゴリオ暦の数値を返します。
表4.64 パラメーター
パラメーター タイプ datedateまたはdate and time例
day of year( date(2019, 9, 17) ) = 260
- day of week( date )
グレゴリオ暦の曜日 (
"Monday"、"Tuesday"、"Wednesday"、"Thursday"、"Friday"、"Saturday"、または"Sunday") を返します。表4.65 パラメーター
パラメーター タイプ datedateまたはdate and time例
day of week( date(2019, 9, 17) ) = "Tuesday"
- month of year( date )
グレゴリオ暦の月 (
"January"、"February"、"March"、"April"、"May"、"June"、"July"、"August"、"September"、"October"、"November"、または"December") を返します。表4.66 パラメーター
パラメーター タイプ datedateまたはdate and time例
month of year( date(2019, 9, 17) ) = "September"
- month of year( date )
ISO 8601 で定義されているグレゴリオ暦の週を返します。
表4.67 パラメーター
パラメーター タイプ datedateまたはdate and time例
week of year( date(2019, 9, 17) ) = 38 week of year( date(2003, 12, 29) ) = 1 week of year( date(2004, 1, 4) ) = 1 week of year( date(2005, 1, 1) ) = 53 week of year( date(2005, 1, 3) ) = 1 week of year( date(2005, 1, 9) ) = 1
4.3.2.9. ソート関数
次の関数は、並べ替え操作をサポートしています。
- sort( list, precedes )
同じ要素のリストを返しますが、ソート関数に従って順序付けされます。
表4.68 パラメーター
パラメーター タイプ listlistprecedesfunction例
sort( list: [3,1,4,5,2], precedes: function(x,y) x < y ) = [1,2,3,4,5]
4.3.2.10. コンテキスト関数
以下の関数は、コンテキスト操作をサポートします。
- get value( m, key )
指定のエントリーキーのコンテキストから値を返します。
表4.69 パラメーター
パラメーター タイプ mcontextkeystring例
get value( {key1 : "value1"}, "key1" ) = "value1" get value( {key1 : "value1"}, "unexistent-key" ) = null- get entries( m )
指定されたコンテキストのキーと値のペアの一覧を返します。
表4.70 パラメーター
パラメーター タイプ mcontext例
get entries( {key1 : "value1", key2 : "value2"} ) = [ { key : "key1", value : "value1" }, {key : "key2", value : "value2"} ]
4.3.3. FEEL の変数および関数名
従来の多くの式言語と異なり、FEEL (Friendly Enough Expression Language) は、変数および関数名でスペースと少数の特殊文字をサポートします。FEEL 名は 文字、?、または _ の要素で始める必要があります。ユニコード文字も使用できます。変数名は、言語キーワード (and、true、every など) で開始することはできません。先頭以外には (複数桁の) 数値、空白文字、特殊文字 (+、-、/、*、'、. など) を使用できます。
たとえば、以下の名前はすべて有効な FEEL 名です。
- Age
- Birth Date
- Flight 234 pre-check procedure
FEEL の変数名および関数名には、いくつかの制約が適用されます。
- 曖昧性 (多義性)
-
名前の一部に、スペース、キーワード、およびその他の特殊文字を使用して FEEL に多義性を持たせることができます。この多義性は、式のコンテキストで左から右に名前を一致させて解決されます。パーサーは、変数名を、その範囲に一致する中で一番長い名前に解決します。必要に応じて、
( )を使用して名前の多義性を排除できます。 - 名前で使用されるスペース
DMN 仕様では、FEEL 名におけるスペース使用を制限します。DMN 仕様によると、名前には複数のスペースを使用できますが、連続して使用することはできません。
言語を使いやすく、スペース使用に関するよくある誤りを回避するために、Red Hat Decision Manager では、スペースを連続して使用する制限が取り除かれています。Red Hat Decision Manager では、スペースを連続して使用する変数名がサポートされますが、スペースを連続して使用してもスペースの数は 1 つに正規化されます。たとえば、Red Hat Decision Manager の変数参照では、スペースが 1 つの
First Nameも、スペースが 2 つのFirst Nameも使用できます。また、Red Hat Decision Manager では、Web ページ、タブ、改行でよく見られる分割できない空白文字などの使用を正規化します。Red Hat Decision Manager の FEEL エンジンの観点では、このような文字はすべて、処理される前に 1 つの空白文字に正規化されます。
- キーワードの
in -
キーワードの
inは、この言語の中で、唯一変数名に使用できないキーワードです。仕様では、変数名にキーワードを使用できますが、変数名にinを使用すると、for、every、someの各表現概念と矛盾します。