ルールの操作
ルール・セットには、ビジネス・プロセスの特定の機能を満たすために定義された 1 つ以上のルールが含まれます。ルール・エディタ ([相互運用性]→[ビルド]→[ビジネス・ルール]) で新しいルール定義を作成すると、ルール・セットにルールを追加する準備が整います。
各ルールに名前を付けることはできますが、必須ではありません。既定では、InterSystems IRIS® では、rule#n の形式のルール名が使用され、順番に番号が割り当てられます。ルールにユーザ定義の名前を付与すると、その名前がクラス定義に表示されると共に、ルール・ログで内部ルール名の横に括弧で囲んで示されます。ルール・セット内のルールの順序を変えると、n の値が変わります。
if 節と else 節について
ルールには 1 つ以上の if 節と 1 つの else 節を含めることができます。各節には、assign や return などのアクションを含めることができます。
if 節のロジックを実行できるのは、節に関連付けられている condition プロパティが真の場合のみです。else 節のロジックを実行できるのは、前の if 節に関連付けられているいずれの condition プロパティも真でない場合のみです。ルールに複数の if 節が含まれる場合、節に関連付けられている condition プロパティが真である、最初の if 節のロジックのみが実行されます。条件の詳細は、"If 節の条件プロパティの編集" を参照してください。
ルールを開発する際は、以下の点に留意してください。
-
ルール・セットの実行で return アクションが検出されると、ルール・セットの実行は終了し、そのルール定義クラスを呼び出したビジネス・プロセスに戻ります。
-
return を省略することによって、ルール・セット内の複数のルールの実行を制御できます。つまり、すべてのルールをチェックする必要がある場合は、どのルール節でも return アクションを使用しないようにします。そして、どのルール節も真として評価されなかった場合のために、ルール・セットの最後に return アクションで値を提供します。
-
if 節ごとに条件プロパティを 1 つ指定します。汎用ビジネス・ルール・セットの一般的な設計は、一連の if 条件で構成されるルールを 1 つ組み込み、どの条件が真であるかに応じて値を返す、というものです。どの条件も真でない場合にデフォルト値を返すには、else 節を return と共に使用します。
-
ルーティング・ルール・セットの一般的な設計は、複数のルールを使用してルールごとに異なる制約を定義し、制約に一致したメッセージのルーティング方法とルーティング先を示す if 節を各ルールに 1 つ組み込むというものです。
-
"仮想プロパティ・パスの基本設定" に説明されている構文を使用して、仮想ドキュメントのプロパティ・パスにアクセスできます。
アクションについて
ルールの各 if 節または else 節にはアクションを含めることができますが、必須ではありません。節のアクションが実行されるのは、節に関連付けられている条件が真の場合かつその場合のみです。以下のアクションがサポートされています。
ルール・セットのタイプ | アクション | 説明 |
---|---|---|
すべて | assign | ビジネス・プロセスの実行コンテキストのプロパティに値を割り当てます。 |
すべて | return | ルールをそれ以上実行せずにビジネス・プロセスに戻ります。また、汎用ルールの場合、示された値を結果ロケーションに返します。 |
すべて | trace | このルールの特定の部分が実行されたときに、入力された情報がイベント・ログに追加されます。詳細は、"<trace>" を参照してください。 |
すべて | debug | ルールの当該部分が実行されたときに、式のテキストと値がルール・ログに追加されます。debug アクションが実行されるのは、ルータ・ビジネス・プロセスの RuleLogging プロパティで d フラグが指定されている場合のみです。RuleLogging プロパティの詳細は、"ルールのロギング" を参照してください。 |
セグメント化された仮想ドキュメントのルーティング・ルールまたは HL7 メッセージのルーティング・ルール | foreach | 繰り返しセグメントをループします。繰り返しセグメントとして指定されている場合、繰り返しループ内にある場合、またはその両方の場合、セグメントを繰り返すことができます。詳細は、"foreach アクションの使用法" を参照してください。 |
ルーティング・ルール | send | ルーティング・エンジン・ビジネス・プロセスによって評価されると、このアクションは必要に応じて変換処理を行った後に、特定のターゲットにメッセージを送信します。データをデータ変換に渡す機能については、"データ変換へのデータの引き渡し" を参照してください。 |
ルーティング・ルール | delete | ルーティング・エンジン・ビジネス・プロセスによって評価されると、このアクションは現在のメッセージを削除します。 |
ルーティング・ルール | delegate | ルーティング・エンジン・ビジネス・プロセスによって評価されると、このアクションはメッセージを別のルールに委任します。 |
BPL <rule> 内では、send、delete、および delegate アクションは使用できません。これらを含めると、そのアクションは実行されず、指定したアクションを含む文字列値が返されます。
論理的に適切で、意図したとおりに実行されるようにルール・セットを構築する必要があります。例えば、既定の返り値を設定することは、ルール・セット内のどのルールも実行されない場合には意味がありますが、1 つのルールが常に実行されるようなルール・セットを作成した場合には意味がありません。一般に、ほとんどのアクションは、ルールの if 節にあります。
foreach アクションの使用法
foreach アクションでは、繰り返しセグメントをループし、そのセグメント内の任意のフィールドを参照できます。
繰り返しセグメントは、"仮想プロパティ・パスの基本設定" で説明されている構文を使用して、foreach アクションの propertypath プロパティで指定します。例えば、HL7 ドキュメントの繰り返しの OBXgrp 内の OBX セグメントにアクセスするには、HL7.{OBXgrp().OBX} を指定します。ここで、空のかっこは繰り返しグループを示します。foreach アクションには 1 つ以上の if 節と 1 つの else 節を含めることができます。節内では、節の条件が真の場合に実行するアクションを指定します。
例えば、foreach アクションを使用して、繰り返しセグメントのフィールドに、いつ特定の値が含まれるかを特定し、値が存在する場合にメッセージをルーティングする send アクションを指定できます。特定のフィールドを参照するには、Segment.{<field-name>} を使用できます (例 : Segment.{ObservationIdentifier})。
foreach アクションの if 節と else 節には、1 つ以上の rule ノードを含めることができます。ただし、foreach アクションを入れ子にすることはできません。
ルールが foreach ループ内で return アクションを実行する場合、そのループまたはルールだけではなく、ルール・セット全体を終了させます。
以下の例は、ビジネス・ルール内での foreach の使用を示しています。このアクションは、HL7 ドキュメントの繰り返しの OBX セグメントを反復して、ObservationIdentifier フィールドに、いつ特定の文字列値が含まれるかを特定します。値が見つかった場合、ルールはドキュメントをファイル操作に送信します。値が見つからない場合、ルールは trace アクションを使用して、イベント・ログにエントリを記録します。
式の定義
式を使用して、以下の 4 つのプロパティの値を変更できます。
-
if 節の condition プロパティ — if 節でロジックを実行する条件を指定します。詳細は、"If 節の条件プロパティの編集" を参照してください。
-
assign アクションの value プロパティ — 割り当てる値を指定します。
-
汎用ビジネス・ルールの return アクションの value プロパティ — ルール・セットを実行したプロセスに返す値を指定します。
-
trace アクションの value プロパティ — トレース・メッセージに含めるテキストを指定します。リテラル・テキスト文字列または評価対象となる式を指定できます。式は、対応する <process> 要素の language 属性で指定されているスクリプト言語を使用する必要があります。
各プロパティを、以下のいずれかのサポートされている値に設定できます。
-
数値 (整数または小数)。1.1 や 23000 など。
-
二重引用符で囲まれた文字列値。例 :
"NY"
Important:二重引用符は必須です。
-
コンテキスト・プロパティの値。BPL ビジネス・プロセスには、context と呼ばれる汎用の永続変数を含めることができることを思い出してください。context 変数は、BPL の <context> 要素および <property> 要素を使用して定義します。context オブジェクトのプロパティには、ビジネス・プロセス内の任意の場所からアクセスできます。したがって、<rule> 要素を使用してビジネス・プロセスからルールを呼び出した場合、そのルール内からコンテキスト・プロパティにアクセスできます。
リストや配列などのコレクションが含まれるコンテキスト・プロパティの場合、InterSystems IRIS では、ビジネス・ルール内からさまざまな取得メソッドをサポートします。それらのメソッドとしては、Count()、Find()、GetAt()、GetNext()、GetPrevious()、IsDefined()、Next()、Previous() などがあります。詳細は、"コレクションを使用した作業" を参照してください。
Note:プロパティ名では大文字と小文字が区別され、引用符で囲むことはできません (例 : PlaceOfBirth)。
-
サポートされている演算子、リテラル値、汎用のプロパティ、および永続変数 context を使用する式。以下に例を示します。
((2+2)*5)/154.3 "hello" & "world" Age * 4 (((x=1) || (x=3)) && (y=2))
-
Min()、Max()、Round(n,m)、SubString() などの組み込み関数。関数名にはかっこが含まれている必要があります。また、Round の数値 n や m などの入力パラメータも含める必要があります。関数に入力値がない場合は、中身が空の左右のかっこを含める必要があります。
-
メッセージ・オブジェクトを表す Document 変数。
-
foreach アクション内のセグメント。詳細は、"アクションについて" を参照してください。
詳細は、"式の例" を参照してください。
If 節の条件プロパティの編集
ルール定義では、1 つの条件は 2 つの値とこれらの値間の比較演算子で構成されます。以下に例を示します。
Amount <= 5000
条件が真でない場合は、偽となります。条件プロパティにはその他の可能な値はありません。真または偽のみの結果を、ブーリアン値の結果と呼びます。InterSystems IRIS では、ブーリアン値の結果を整数値として格納します。1 は真で、0 は偽です。ほとんどの場合、この内部表現を使用する必要はありません。ただし、ルーティング・ルールの場合、ルールの制約が真の場合はいつでも、条件プロパティに対応する If 節を実行できます。この場合、条件プロパティを 1 に設定できます。
条件プロパティには、複数の条件を含めることができます。InterSystems IRIS は、対応するルールを実行するかどうか決定する前に、プロパティのすべての条件を評価および比較します。条件どうしのロジックは、AND 演算子または OR 演算子によって決定されます。例えば、以下の値の条件プロパティを考えてみます。
IF Amount <= 5000 AND CreditRating > 5 OR CurrentCustomer = 1
同じ値が、ルール・エディタでは次のように表示されます。
値には、Amount <= 5000、CreditRating > 5、CurrentCustomer = 1 という 3 つの条件があります。各条件は真か偽のいずれかになります。InterSystems IRIS は、これらの条件を個別に評価してから、AND および OR 演算子によって定義された、これらの条件の間の関係を評価します。
AND および OR 演算子は、真の値および偽の値に対してのみ機能します。すなわち、演算子は 2 つのブーリアン値の間に配置し、次のように 1 つのブーリアン値の結果を返す必要があります。
演算子 | 結果が真となる状況 |
---|---|
AND | 両方の値が真の場合。 |
OR | 少なくとも 1 つの値が真であるか、両方の値が真の場合。1 つの値が偽でもう一方の値が真の場合でも、全体としての結果は真になります。 |
条件プロパティに複数の AND または OR 演算子が含まれる場合、AND 演算子が OR 演算子よりも優先されます。また、すべての AND 演算子が先に実行され、次に OR 演算子が実行されます。例えば、以下の条件セットを考えてみます。
IF Amount <= 5000 AND CreditRating > 5 OR CurrentCustomer = 1 AND CreditRating >= 5
同じ条件セットが、ルール・エディタでは次のように表示されます。
InterSystems IRIS は、条件を次のように評価します。
IF (Amount <= 5000 AND CreditRating > 5) OR (CurrentCustomer = 1 AND CreditRating >= 5)
以下のいずれかまたは両方の文が真の場合、全体としての条件セットは真となります。
-
誰かが 5,000 未満の金額を要求し、さらにその人の信用等級が平均よりも優れている。
-
現在の銀行顧客の誰かが任意の金額を要求し、さらにその人の信用等級が平均以上である。
両方の文が偽の場合、全体としての条件セットは偽となります。
別の方法で説明すると、InterSystems IRIS は次の手順を実行して条件セットを評価します。
-
以下の AND 式の結果が真か偽かを判別します。
IF Amount <= 5000 AND CreditRating > 5
この結果を “SafeBet” と呼ぶとします。
-
以下の AND 式の結果が真か偽かを判別します。
IF CurrentCustomer = 1 AND CreditRating >= 5
この結果を “KnownEntity” と呼ぶとします。
-
以下の OR 式の結果が真か偽かを判別します。
IF SafeBet is true OR KnownEntity is true
SafeBet が真で KnownEntity が偽の場合、条件セットは真となります。同様に、SafeBet が偽で KnownEntity が真の場合でも、条件セットは真となります。最後に、SafeBet と KnownEntity の両方が真の場合、条件セットは真となります。
式の演算子
式を定義する際は、以下の算術演算子のいずれかを選択できます。
演算子 | 意味 |
---|---|
+ | 加算 (2 進および単項) |
– | 減算 (2 進および単項) |
* | 乗算 |
/ | 除算 |
さらに、以下の論理演算子がサポートされています。論理演算子は、1 (真) または 0 (偽) の整数値を返します。
演算子 | 意味 | 式が真となる状況 |
---|---|---|
AND (&&) | および | 両方の値が真の場合。 |
OR (||) | または | 少なくとも 1 つの値が真の場合。両方の値が真であるか、1 つの値のみが真である必要があります。 |
! | 偽 (単項) | 値が偽の場合。 |
= | 等しい | 2 つの値が等しい場合。 |
!= | 等しくない | 2 つの値が等しくない場合。 |
> | より大 | 演算子の左側の値が演算子の右側の値よりも大きい場合。 |
< | より小 | 左側の値が演算子の右側の値よりも小さい場合。 |
>= | 以上 | 左側の値が右側の値よりも大きいか、または 2 つの値が等しい場合。 |
<= | 以下 | 左側の値が右側の値よりも小さいか、または 2 つの値が等しい場合。 |
[ | Contains | 文字列は右側のサブ文字列を含みます。Contains のパターン・マッチングは、完全一致です。左側の値が “Hollywood, California” で、右側の値が “od, Ca” の場合は一致と見なされますが、値が “Wood” の場合は一致と見なされません。 |
最後に、以下の文字列演算子を使用できます。
演算子 | 意味 |
---|---|
& | 文字列の連結演算子。 |
_ | リテラル文字列、式、または変数を結合するバイナリの連結。 |
複数の演算子が式に含まれているとき、演算子は先頭から後方に向かって以下のような優先順位で評価されます。
-
次の論理演算子すべて : ! = != < > <= >= [
-
乗算と除算 : * /
-
加算と減算 : + –
-
文字列の連結 : & _
-
論理 AND : &&
-
論理 OR : ||
式の関数
ルール定義内では、式には InterSystems IRIS ユーティリティ関数の 1 つへの呼び出しを含めることができます。このような関数には、他のプログラミング言語に存在するものと類似する数学的な処理関数または文字列処理関数などがあります。式を定義するには、ドロップダウン・リストから関数を選択するだけです。
使用可能なユーティリティ関数のリストとそれらをビジネス・ルールまたは DTL データ変換で使用するための適切な構文については、"プロダクションで使用するユーティリティ関数" を参照してください。
式の例
ルール定義内では、式は、値とプロパティを組み合わせて値を返すための公式です。以下の表に、式とその算出値の例を示します。
式 | 算出値 |
---|---|
((2+2)*5)/154.3 | 0.129617628 |
"hello" & "world" | "helloworld" |
Age * 4 | Age が context プロパティ (BPL で <context> および <property> 要素を使用して定義できる汎用永続変数 context のプロパティ) で、その数値が 30 である場合、この式の値は 120 です。 |
1+2.5*2 | 6 |
2*5 | 10 |
Min(Age,80,Limit) | この式では、組み込みの Min() 関数が使用されます。Age が値 30 を持つ context プロパティであり、同じくプロパティである Limit の値が 65 であるとき、この式の値は 30 になります。 |
Round(1/3,2) | この式では、組み込みの Round() 関数が使用されます。結果は 0.33 です。 |
x<65&&A="F"||x>80 | この式では、演算子の優先順位規則が使用されます (詳細は、"式の演算子" で説明します)。A が F の文字列値を持つ context プロパティであり、同じくプロパティである x が 38 の整数値を持っている場合、この式は 1 の整数値を持ちます。InterSystems IRIS では、整数値 1 は真、整数値 0 は偽を意味します。 |
Min(10,Max(X,Y)) | この式では、Min() および Max() 関数が使用されます。X が数値 9.125 を持つ context プロパティであり、(同じくプロパティである) Y の数値が 6.875 であるとき、この式の値は 9.125 になります。 |
(((x=1) || (x=3)) && (y=2)) | この式では、複雑な論理リレーションシップ内での優先順位を明確に示すため、かっこが使用されます。 |
その値として式を取るプロパティを選択すると、ルール・セット・ダイアグラムの上部に空白のテキスト・フィールドが表示されます。テキスト・フィールドではどんな文字列でも指定できるため、プロパティに適切な構文が使用されていることを確認する必要があります。式を生成する際には、以下のルールを考慮します。
-
式には、前述のように、数値、文字列、context プロパティ、その他の式、関数、またはこれらの有効な組み合わせを使用して、任意の値を記述できます。
-
式の中の空白は無視されます。
-
式には、サポートされる任意の演算子を使用できます。
-
既定の演算子優先順位を上書きするか、式を読みやすくする場合は、かっこを使用して式の部分をグループにまとめ、優先順位を示すことができます。例えば、結果が 6 になる以下の式を考えてみます。
1+2.5*2
式を次のように変更すると、結果は 7 になります。
(1+2.5)*2
-
ビジネス・ルールでは、(((x=1) || (x=3)) && (y=2)) のように、かっこを使用して複雑な論理式をグループ化できます。
制約の定義
ルール・セットにルーティング・ルールが含まれる場合、ルール・セットを通過するメッセージが、そのルールに対して定義されている制約と一致すると、そのルール・ロジックが実行されるように、制約を定義することができます。フィールドを空白のままにすると、すべての値と一致することになります。ルールの制約を設定するには、そのルールをダブルクリックし、以下の設定を定義します。
以下の項目のいずれかの構成名。
-
ビジネス・サービス (ルーティング・インタフェース用)
-
メッセージ・ルーティング・プロセス (別のルールがこのルーティング・ルール・セットに連鎖している場合)
このルールによってルーティングするプロダクション・メッセージ・オブジェクトを指定します。このフィールドの値は、以下のルーティング・ルール・タイプに応じて決まります。
-
汎用メッセージ・ルーティング・ルールの場合、 [メッセージ・クラス] フィールドの横にある省略記号 (...) をクリックして [ファインダダイアログ] を呼び出し、該当するメッセージ・クラスを選択できます。メッセージ・クラスのカテゴリを選択して、選択肢を絞り込むことができます。
-
仮想ドキュメントのメッセージ・ルーティング・ルールの場合、定義されている仮想ドキュメント・クラスのリストから選択できます。
仮想ドキュメントのルーティング・ルールの場合、メッセージ・クラスのカテゴリを識別して、その構造を指定します。選択した仮想ドキュメント・クラスに定義されているカテゴリ・タイプのリストから選択できます。タイプは、組み込みのタイプか、カスタム・スキーマからインポートされたタイプです。
仮想ドキュメントのルーティング・ルールの場合、メッセージ構造を識別します。許容値はメッセージ・クラスに応じて異なります。選択した仮想ドキュメント・クラスに定義されているカテゴリ・タイプのリストから選択できます。タイプは、組み込みのタイプか、カスタム・スキーマからインポートされたタイプです。
[ドキュメント名] フィールドで複数の値を指定した場合、ルールは指定したいずれかの [ドキュメント名] 値と一致し、他の値とは一致しません。
ルールの無効化
ルール・セットがルールを実行しないようにしたいが、ルールは削除したくない場合、これを無効にすることができます。ルールをダブルクリックして、[無効] を選択するだけです。
データ変換へのデータの引き渡し
Send アクションは、プロダクション内のターゲットにメッセージを送信する前に、データ変換を呼び出すことができます。このデータ変換では、その aux 変数を使用して、ルールから情報を取得できます。ルールの名前やルールが起動された理由など、このデータの一部は、ルール・クラスを変更することなく、この変換に使用できます。
変換に追加情報を渡すには、IDE でルール・クラスを編集し、クラスのプロパティに値を割り当てる必要があります。ルール・クラスの RuleUserData プロパティに割り当てられた値は、変換が aux.RuleUserData 変数にアクセスする場合に使用できます。ルール・クラスの RuleActionUserData プロパティに割り当てられた値は、aux.RuleActionUserData として変換で使用できます。
変換での aux 変数へのアクセスの詳細は、DTL の構文ルールの有効な式のリストを参照してください。
ビジネス・ルール通知の追加
InterSystems IRIS では、あるルールを実行するたびにシステムで特定のアクションが実行されるように、ルール通知を設定できます。ルールに関連する大半のアクティビティとは異なり、通知の設定にはプログラミングが必要です。Ens.Rule.NotificationOpens in a new tab クラスのサブクラスを作成して、そのサブクラスの %OnNotify メソッドを上書きする必要があります。%OnNotify メソッドのシグニチャは、以下のとおりです。
ClassMethod %OnNotify(pReason As %String,
pRule As Ens.Rule.RuleDefinition)
As %Status
使用可能な pReason の値は次のとおりです。
-
BeforeSave
-
AfterSave
-
Delete
実行時にプロダクション・フレームワークは自動的に Ens.Rule.NotificationOpens in a new tab のサブクラスを検索し、%OnNotify 内のコードを使用してルールの実行時に行う操作を判断します。