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) では、以下のデータ型がサポートされます。
- 数値
- 文字列
- ブール値
- 日付
- 時間
- 日時
- 日時で指定する期間
- 年および月で指定する期間
- 関数
- コンテキスト
- 範囲 (または間隔)
- リスト
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 パラメーター パラメーター タイプ 形式 from
string
date string
例
date( "2012-12-25" ) - date( "2012-12-24" ) = duration( "P1D" )
- date( from ) - date and time の使用
値を
from
からdate
に変換し、時間のコンポーネントを null に設定します。表4.4 パラメーター パラメーター タイプ from
date 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 パラメーター パラメーター タイプ year
number
month
number
day
number
例
date( 2012, 12, 25 ) = date( "2012-12-25" )
- date and time( date, time )
指定した日付から
date and time
を生成して、時間のコンポーネントと指定の時間を無視します。表4.6 パラメーター パラメーター タイプ date
date
またはdate and time
time
time
例
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 パラメーター パラメーター タイプ 形式 from
string
date 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 パラメーター パラメーター タイプ 形式 from
string
time string
例
time( "23:59:00z" ) + duration( "PT2M" ) = time( "00:01:00@Etc/UTC" )
- time( from )
指定のパラメーターから
time
を生成し、日付コンポーネントを無視します。表4.9 パラメーター パラメーター タイプ from
time
または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 パラメーター パラメーター タイプ hour
number
minute
number
second
number
offset
(任意)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
有効な数字を表す
string
grouping separator
スペース ( )、コンマ (
,
)、ピリオド (.
)、または nulldecimal separator
grouping separator
と同じタイプですが、同じ値は使用できません。例
number( "1 000,0", " ", "," ) = number( "1,000.0", ",", "." )
- string( from )
指定のパラメーターを文字列表現にします。
表4.12 パラメーター パラメーター タイプ from
null 値以外の値
例
string( 1.1 ) = "1.1" string( null ) = null
- duration( from )
from
をdays and time duration
、またはyears and months duration
に変換します。表4.13 パラメーター パラメーター タイプ 形式 from
string
duration 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 パラメーター パラメーター タイプ from
date
またはdate and time
to
date
または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 パラメーター パラメーター タイプ negand
boolean
例
not( true ) = false not( null ) = null
4.3.2.3. 文字列関数
以下の関数は、文字列の操作をサポートします。
FEEL では、Unicode 文字はコードポイントを基にカウントされます。
- substring( string, start position, length? )
指定の長さの開始地点からサブ文字列を返します。最初の文字の位置値は
1
です。表4.16 パラメーター パラメーター タイプ string
string
start position
number
length
(任意)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 パラメーター パラメーター タイプ string
string
例
string length( "tes" ) = 3 string length( "\U01F40Eab" ) = 3
- upper case( string )
指定の文字列の大文字バージョンを生成します。
表4.18 パラメーター パラメーター タイプ string
string
例
upper case( "aBc4" ) = "ABC4"
- lower case( string )
指定の文字列の小文字バージョンを生成します。
表4.19 パラメーター パラメーター タイプ string
string
例
lower case( "aBc4" ) = "abc4"
- substring before( string, match )
一致した値の前にあるサブ文字列を計算します。
表4.20 パラメーター パラメーター タイプ string
string
match
string
例
substring before( "testing", "ing" ) = "test" substring before( "testing", "xyz" ) = ""
- substring after( string, match )
一致した値の後にあるサブ文字列を計算します。
表4.21 パラメーター パラメーター タイプ string
string
match
string
例
substring after( "testing", "test" ) = "ing" substring after( "", "a" ) = ""
- replace( input, pattern, replacement, flags? )
正規表現の置換を計算します。
表4.22 パラメーター パラメーター タイプ input
string
pattern
string
replacement
string
flags
(任意)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 パラメーター パラメーター タイプ string
string
match
string
例
contains( "testing", "to" ) = false
- starts with( string, match )
指定の値と一致する文字列で開始する場合に、
true
を返します。表4.24 パラメーター パラメーター タイプ string
string
match
string
例
starts with( "testing", "te" ) = true
- ends with( string, match )
指定の値と一致する文字列で終了する場合に、
true
を返します。表4.25 パラメーター パラメーター タイプ string
string
match
string
例
ends with( "testing", "g" ) = true
- matches( input, pattern, flags? )
入力が正規表現と一致する場合に
true
を返します。表4.26 パラメーター パラメーター タイプ input
string
pattern
string
flags
(任意)string
注記この関数は、XQuery 1.0 and XPath 2.0 Functions and Operators で定義されている正規表現パラメーターを使用します。
例
matches( "teeesting", "^te*sting" ) = true
- split( string, delimiter )
元の文字列のリストを返し、区切り文字の正規表現パターンで分割します。
表4.27 パラメーター パラメーター タイプ string
string
delimiter
正規表現パターンの
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 パラメーター パラメーター タイプ list
list
element
null を含むすべてのタイプ
例
list contains( [1,2,3], 2 ) = true
- count( list )
リスト内の要素をカウントします。
表4.29 パラメーター パラメーター タイプ list
list
例
count( [1,2,3] ) = 3 count( [] ) = 0 count( [1,[2,3]] ) = 2
- min( list )
リストの値と同じ最小の要素を返します。
表4.30 パラメーター パラメーター タイプ list
list
別の署名
min( e1, e2, ..., eN )
例
min( [1,2,3] ) = 1 min( 1 ) = 1 min( [1] ) = 1
- max( list )
リストの値と同じ最大の要素を返します。
表4.31 パラメーター パラメーター タイプ list
list
別の署名
max( e1, e2, ..., eN )
例
max( 1,2,3 ) = 3 max( [] ) = null
- sum( list )
リスト内の数字の合計を返します。
表4.32 パラメーター パラメーター タイプ list
number
要素のlist
別の署名
sum( n1, n2, ..., nN )
例
sum( [1,2,3] ) = 6 sum( 1,2,3 ) = 6 sum( 1 ) = 1 sum( [] ) = null
- mean( list )
リスト内の要素の平均 (計算平均) を計算します。
表4.33 パラメーター パラメーター タイプ list
number
要素の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 パラメーター パラメーター タイプ list
boolean
要素の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 パラメーター パラメーター タイプ list
boolean
要素の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 パラメーター パラメーター タイプ list
list
start position
number
length
(任意)number
例
sublist( [4,5,6], 1, 2 ) = [4,5]
- append( list, item )
アイテムに追加されるリストを作成します。
表4.37 パラメーター パラメーター タイプ list
list
item
任意のタイプ
例
append( [1], 2, 3 ) = [1,2,3]
- concatenate( list )
連結されたリストの結果でリストを作成します。
表4.38 パラメーター パラメーター タイプ list
list
例
concatenate( [1,2],[3] ) = [1,2,3]
- insert before( list, position, newItem )
指定の位置に挿入された
newItem
でリストを作成します。表4.39 パラメーター パラメーター タイプ list
list
position
number
newItem
任意のタイプ
例
insert before( [1,3],1,2 ) = [2,1,3]
- remove( list, position )
指定の位置から除外された要素を削除してリストを作成します。
表4.40 パラメーター パラメーター タイプ list
list
position
number
例
remove( [1,2,3], 2 ) = [1,3]
- reverse( list )
逆リストを返します。
表4.41 パラメーター パラメーター タイプ list
list
例
reverse( [1,2,3] ) = [3,2,1]
- index of( list, match )
要素に一致するインデックスを返します。
パラメーター
-
list
タイプのlist
-
任意のタイプの
match
表4.42 パラメーター パラメーター タイプ list
list
match
任意のタイプ
例
index of( [1,2,3,2],2 ) = [2,4]
-
- union( list )
複数のリストから全要素のリストを返し、重複を除外します。
表4.43 パラメーター パラメーター タイプ list
list
例
union( [1,2],[2,3] ) = [1,2,3]
- distinct values( list )
単一リストから要素のリストを返し、重複を除外します。
表4.44 パラメーター パラメーター タイプ list
list
例
distinct values( [1,2,3,2,1] ) = [1,2,3]
- flatten( list )
フラット化されたリストを返します。
表4.45 パラメーター パラメーター タイプ list
list
例
flatten( [[1,2],[[3]], 4] ) = [1,2,3,4]
- product( list )
リスト内の数字の積を返します。
表4.46 パラメーター パラメーター タイプ list
number
要素のlist
別の署名
product( n1, n2, ..., nN )
例
product( [2, 3, 4] ) = 24 product( 2, 3, 4 ) = 24
- median( list )
リストの数字の中央値を返します。要素の数が奇数の場合、結果は中央の要素になります。要素の数が偶数の場合、結果は中央にある 2 つの要素の平均になります。
表4.47 パラメーター パラメーター タイプ list
number
要素の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 パラメーター パラメーター タイプ list
number
要素のlist
別の署名
stddev( n1, n2, ..., nN )
例
stddev( 2, 4, 7, 5 ) = 2.081665999466132735282297706979931 stddev( [47] ) = null stddev( 47 ) = null stddev( [ ] ) = null
- mode( list )
リスト内の数字の最頻値を返します。複数の要素が返される場合、番号は昇順でソートされます。
表4.49 パラメーター パラメーター タイプ list
number
要素の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) satisfies (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 パラメーター パラメーター タイプ n
number
scale
範囲の
[−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 パラメーター パラメーター タイプ n
number
例
floor( 1.5 ) = 1 floor( -1.5 ) = -2
- ceiling( n )
指定された数値以上の最小の整数を返します。
表4.55 パラメーター パラメーター タイプ n
number
例
ceiling( 1.5 ) = 2 ceiling( -1.5 ) = -1
- abs( n )
絶対値を返します。
表4.56 パラメーター パラメーター タイプ n
number
、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 パラメーター パラメーター タイプ dividend
number
divisor
number
例
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 パラメーター パラメーター タイプ n
number
例
sqrt( 16 ) = 4
- log( number )
指定された数値の対数を返します。
表4.59 パラメーター パラメーター タイプ n
number
例
decimal( log( 10 ), 2 ) = 2.30
- exp( number )
オイラーの数値
e
を、指定された数の累乗で返します。表4.60 パラメーター パラメーター タイプ n
number
例
decimal( exp( 5 ), 2 ) = 148.41
- odd( number )
指定された数が奇数の場合は
true
を返します。表4.61 パラメーター パラメーター タイプ n
number
例
odd( 5 ) = true odd( 2 ) = false
- even( number )
指定された数が偶数の場合は
true
を返します。表4.62 パラメーター パラメーター タイプ n
number
例
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 パラメーター パラメーター タイプ date
date
またはdate and time
例
day of year( date(2019, 9, 17) ) = 260
- day of week( date )
グレゴリオ暦の曜日 (
"Monday"
、"Tuesday"
、"Wednesday"
、"Thursday"
、"Friday"
、"Saturday"
、または"Sunday"
) を返します。表4.65 パラメーター パラメーター タイプ date
date
または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 パラメーター パラメーター タイプ date
date
またはdate and time
例
month of year( date(2019, 9, 17) ) = "September"
- month of year( date )
ISO 8601 で定義されているグレゴリオ暦の週を返します。
表4.67 パラメーター パラメーター タイプ date
date
または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 パラメーター パラメーター タイプ list
list
precedes
function
例
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 パラメーター パラメーター タイプ m
context
key
string
例
get value( {key1 : "value1"}, "key1" ) = "value1" get value( {key1 : "value1"}, "unexistent-key" ) = null
- get entries( m )
指定されたコンテキストのキーと値のペアのリストを返します。
表4.70 パラメーター パラメーター タイプ m
context
例
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
の各表現概念と矛盾します。