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 仕様で変数を functioncontextrange、または 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.2e31.2*10**3 と表記するのと同じですが、式ではなくリテラルを使用しています。
  • 16 進数: プリフィックス 0x を付けて、16 進数を使用できます。たとえば、0xff は、10 進数の 255 と同じです。大文字および小文字いずれもサポートされます。たとえば、0XFF0xff と同じです。
  • 型の接尾辞: 型の接尾辞として fFdDlL を使用できます。この接尾辞は無視されます。
文字列

FEEL では、二重引用符で区切った文字が文字列として解釈されます。

"John Doe"

ブール値
FEEL は、3 値ブール論理を使用するため、ブール論理式には truefalse、または 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 スキーマでスペースをサポートしない場合は、キーワード dateTimedate and time の同義語として使用してください。

日時で指定する期間

FEEL では日と時間で指定する期間を表すリテラルがサポートされていませんが、組み込みの duration() 関数を使用して値を構築できます。FEEL では、XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠しますが、日、時間、分、および秒にしか適用されません。月および年はサポートされません。

例 :

duration( "P1DT23H12M30S" )
duration( "P23D" )
duration( "PT12H" )
duration( "PT35M" )
重要

DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード dayTimeDurationdays and time duration の同義語として使用してください。

年および月で指定する期間

FEEL では年と月で指定する期間リテラルがサポートされていませんが、組み込みの duration() 関数を使用して値を構築できます。FEEL では XML Schema Part 2: Datatypes ドキュメントに定義されている形式に準拠しますが、年と月にしか適用されません。日、時間、分、または秒はサポートされません。

例 :

duration( "P3Y5M" )
duration( "P2Y" )
duration( "P10M" )
duration( "P25M" )
重要

DMN 仕様の実装が、XML スキーマでスペースをサポートしない場合は、キーワード yearMonthDurationyears 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 の DMN ItemDefinition 構造様式として、次の 2 つがサポートされます。

  • ユーザー定義の Java タイプ: DMN の ItemDefinition で各コンポーネントのプロパティーとゲッターを定義する有効な JavaBeans オブジェクト。必要に応じて、無効な Java 識別子になるコンポーネント名を示すゲッターに対して @FEELProperty アノテーションを使用することもできます。
  • java.util.Map インターフェイス: DMN の ItemDefinition でコンポーネント名に対応するキーで、適切なエンティティーを定義する必要があります。
範囲 (または間隔)

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") )

デシジョンテーブルの範囲を使用して値の範囲をテストしたり、単純なリテラル式で範囲を使用したりできます。たとえば、以下のリテラル式は、変数 x0 から 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 の後に Ttime string 列が続く形式に従います。
  • duration string: P1Y2M などの XQuery 1.0 and XPath 2.0 Data Model に定義されている days and time duration および years and months duration の形式に従います
date( from ) - date の使用

fromdate 値に変換します。

表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 )

指定の区切り文字を使用して fromnumber に変換します。

表4.11 パラメーター

パラメータータイプ

from

有効な数字を表す string

grouping separator

スペース ( )、コンマ (,)、ピリオド (.)、または null

decimal 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 )

fromdays 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 文字列 (馬の記号の後に ab) となります。

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)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 パラメーター

パラメータータイプ

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

numberdays 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 を返します。

署名

  1. before( point1 point2 )
  2. before( point range )
  3. before( range point )
  4. before( range1,range2 )

true に評価するための要件

  1. point1 < point2
  2. point < range.start or ( point = range.start and not(range.start included) )
  3. range.end < point or ( range.end = point and not(range.end included) )
  4. 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 を返します。

署名

  1. after( point1 point2 )
  2. after( point range )
  3. after( range, point )
  4. after( range1 range2 )

true に評価するための要件

  1. point1 > point2
  2. point > range.end or ( point = range.end and not(range.end included) )
  3. range.start > point or ( range.start = point and not(range.start included) )
  4. 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 を返します。

署名

  1. meets( range1, range2 )

true に評価するための要件

  1. 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 を返します。

署名

  1. met by( range1, range2 )

true に評価するための要件

  1. 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 を返します。

署名

  1. overlaps( range1, range2 )

true に評価するための要件

  1. ( 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 を返します。

署名

  1. overlaps before( range1 range2 )

true に評価するための要件

  1. ( 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 を返します。

署名

  1. overlaps after( range1 range2 )

true に評価するための要件

  1. ( 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 を返します。

署名

  1. finishes( point, range )
  2. finishes( range1, range2 )

true に評価するための要件

  1. range.end included and range.end = point
  2. 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 を返します。

署名

  1. finished by( range, point )
  2. finished by( range1 range2 )

true に評価するための要件

  1. range.end included and range.end = point
  2. 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 を返します。

署名

  1. includes( range, point )
  2. includes( range1, range2 )

true に評価するための要件

  1. (range.start < point and range.end > point) or (range.start = point and range.start included) or (range.end = point and range.end included)
  2. ( 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 を返します。

署名

  1. during( point, range )
  2. during( range1 range2 )

true に評価するための要件

  1. (range.start < point and range.end > point) or (range.start = point and range.start included) or (range.end = point and range.end included)
  2. ( 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 を返します。

署名

  1. starts( point, range )
  2. starts( range1, range2 )

true に評価するための要件

  1. range.start = point and range.start included
  2. 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 を返します。

署名

  1. started by( range, point )
  2. started by( range1, range2 )

true に評価するための要件

  1. range.start = point and range.start included
  2. 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 を返します。

署名

  1. coincides( point1, point2 )
  2. coincides( range1, range2 )

true に評価するための要件

  1. point1 = point2
  2. 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 名は 文字?、または _ の要素で始める必要があります。ユニコード文字も使用できます。変数名は、言語キーワード (andtrueevery など) で開始することはできません。先頭以外には (複数桁の) 数値、空白文字、特殊文字 (+-/*'. など) を使用できます。

たとえば、以下の名前はすべて有効な 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 を使用すると、foreverysome の各表現概念と矛盾します。