Oracle® Fusion Middleware Oracle Business Process Managementによるビジネス・ルールの設計 12c (12.2.1) E72523-01 |
|
前 |
次 |
この章では、ファクト・タイプと呼ばれるOracle Business Rulesデータ・モデル要素について説明します。ファクトはルールの判断対象となるオブジェクトです。ファクト・プロパティ値のグループ化を定義する、値セットと呼ばれるもう1つの要素についても説明します。
この章の内容は以下のとおりです。
ルール・デザイナでは、データ・モデルの一部であるファクト・タイプを使用してOracle Business Rulesにビジネス・オブジェクトおよびそのメソッドを認識させます。ファクト・タイプは、データ・モデルにおけるタイプ定義です。ファクトは、そのファクト・タイプのインスタンスであり、ルールの実行対象とすることができるデータ構造です。
たとえば、ファクト・タイプは、関連するプロパティ(ビジネス条件)のコレクションであると、ファクトはそのビジネス条件にバインドされた関連するデータのコレクションです。顧客ファクトには、名前だけでなく、アドレス、履歴、信用格付などが含まれる場合があります。
ルールを作成する前に、ファクト・タイプおよび値セットを作成できます。
ルール・デザイナでは、次の種類のファクトを使用できます。
XMLファクト: XMLファクトは、XMLスキーマを指定して既存のソースからインポートされます。インポートしたXMLファクトに別名を追加するか、XMLファクトをRLファクトと併用し、ビジネス・ニーズに応じてデータ・モデルを変更できます。
詳細は、「XMLファクトの使用」を参照してください。
Javaファクト: Javaファクトは既存のソースからインポートされます。Javaファクトに別名を追加するか、RLファクトと併用し、ビジネス・ニーズをデータ・モデルのターゲットにすることができます。また、Javaファクトは、作成するルールまたはデシジョン表で使用する関連Javaクラスのインポートにも使用されます。
詳細は、「Javaファクトの使用」を参照してください。
RLファクト: RLファクトは、ユーザーが直接作成でき、外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはプロパティを持つJavaBeanと似ています。RLファクトには、名前付きの型指定プロパティのセットが含まれます。プロパティ値には、文字列のようなプリミティブ、別の構造化ファクトまたはリストを使用できます。RLファクトは、迅速で独立的な開発およびデシジョン・ロジックのテストに役立ちます。インポートされたスキーマを使用可能にするか安定させる前に、RLファクトを使用して、インポートされたファクト・タイプから最終的に取得される入力データ(XMLスキーマなど)を、モデル化できます。中間デシジョンはアプリケーションに返されません(顧客を優良または不良に分類するサブデシジョンなど)。通常は、デシジョンの入力および出力データに使用されるファクト・タイプをインポートすることが最適な方法です。RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。
詳細は、「RLファクトの使用」を参照してください。
ADFビジネス・コンポーネント・ファクト: ADFビジネス・コンポーネント・ファクトを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます。ADFビジネス・コンポーネントのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。
詳細は、「ADFビジネス・コンポーネント・ファクトの使用」を参照してください。
ルール対応アプリケーションのビジネス・オブジェクトを調査するルールを作成したり、結果をアプリケーションに返す場合は、通常、Javaファクト・タイプとXMLファクト・タイプを使用します。RL Languageファクト・タイプ定義を使用して、Rules Engineで他のルールを起動できる中間ファクトを作成します。ADFビジネス・コンポーネント・ファクト・タイプを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます
Oracle Business Rulesでは、ルールに対して実行できるファクトは、アサートされたデータ・オブジェクトです。各オブジェクト・インスタンスは単一のファクトに対応しています。オブジェクトが(変更済かどうかに関係なく)再アサートされると、Rules Engineが更新され、そのオブジェクトの新しい状態が反映されます。オブジェクトの再アサートによるファクトの作成はありません。特定のファクト・タイプに複数のファクトを指定するには、オブジェクト・インスタンスを個別にアサートする必要があります。
値セットを作成すると、指定したタイプの値のリストまたは値の範囲を定義できます。値セットを作成すると、値セットを、一致するタイプのビジネス条件に関連付けることができます。値セットがビジネス条件に関連付けられている場合、Oracle Business Rulesでは、デシジョン表に含まれているルールでビジネス条件の値に対する制約として定義した値または範囲が使用されます。
詳細は、次を参照してください。
XMLファクト・タイプを使用すると、ルールを記述する際にXMLスキーマのタイプ、要素および属性を使用できます。XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、Javaファクト・タイプやRLファクト・タイプの場合と同様にIF/THENルールおよびデシジョン表ルールの作成に使用できます。XMLスキーマ定義およびXMLファクト・タイプの間のマッピングには、Java Architecture for XML Binding (JAXB)が使用されます。
Oracle Business Rulesでは、デフォルトでOracle Application Serverに同梱されているJAXB 2.0を使用します。JSR-222に定義されているJAXBは、XMLスキーマ定義内のタイプ、名前、規則および、Javaで使用可能なタイプ、許可される名前、規則の間のマッピングを提供します。たとえば、xsd:integer
タイプのorder-id
という要素は、BigInteger
型のorderID
というJava Beanプロパティにマップされます(xsd:int
タイプはJavaのint
にマップされます)。
注意:
XSDに単純型のプリミティブまたは非プリミティブ・ルート要素が含まれる場合、JAXBでは単純型要素がJAXBElementにマッピングされ、ObjectFactoryクラスのみが生成されます。ビジネス・ルールで使用される複合型のファクトを作成する必要があります。XMLスキーマに定義されている要素およびタイプをデータ・モデルにインポートし、タイプのインスタンスをルールで作成、アサート、変更および取消しできます。ほとんどのXML文書では階層情報が記述されており、各要素にはサブ要素が含まれています。通常、ユーザーはこの階層内の複数の要素および要素間の階層関係に基づいて個々のルールを記述します。
Oracle Business Rulesでは、ファクトをアサートする際のデフォルト動作は単一のファクト・インスタンスをアサートすることのみで、サブ要素の階層内で参照している可能性のある子オブジェクトはアサートしません。ルールまたはデシジョン表の作成時には、通常、ルート要素への参照に基づいて要素の階層全体をアサートするようにします。Oracle Business Rulesには、階層を再帰的にアサートできるように
assertTree
アクション・タイプが用意されています。詳細は、「ツリー・モードのルールの使用」を参照してください。
データ・モデルでXMLスキーマ定義を使用する前に、XMLスキーマをインポートする必要があります。この手順では、JAXBクラスを生成し、生成されたクラスおよびパッケージをルール・デザイナで参照可能なXMLスキーマに関連付けます。
XMLスキーマをインポートしてXMLファクトを追加する手順は、次のとおりです。
XMLファクトを使用するには、Rules Designerで「XMLファクトの編集 -」ダイアログを開きます。
XMLファクトを表示して編集する手順は、次のとおりです。
「XMLファクトの編集 -」ダイアログには、表3-1 に示すフィールドがあります。
表3-1 XMLファクト: 「XMLファクトの編集 -」ダイアログのフィールド
フィールド | 説明 |
---|---|
名前 |
XMLファクト名が表示されます。JAXB生成クラスの名前は変更できません。 |
エイリアス |
XMLファクトの別名を入力します。この値は変更できます。デフォルトは、未修飾のクラス名です。 |
修飾子パターン |
このフィールドは動詞ルールに使用されます。 ここで何も指定されていない場合は、グローバル修飾子が使用されます。カスタム修飾子パターンがファクトに指定されている場合、パターンに2つの部分({member}、{fact})が含まれている必要があります。次のようにパターンを指定します。
動詞ルールの使用方法の詳細は、「動詞ルールおよびビジネス・フレーズの概要」を参照してください。 |
スーパー・クラス |
このファクトに関連付けられているJavaスーパークラスが表示されます。 |
XML名 |
XMLファクトに関連付けられているXML名が表示されます。 |
生成元 |
ビジネス・ルール・データ・モデルにコピーされる際にXMLファクトのソースとなったXMLスキーマ・ファイルが表示されます。 |
参照可能 |
ルール・デザイナのリストにXMLファクトを表示する場合に選択します。XMLファクトから他のXMLファクトが参照されることによって、ツリーが形成されることがあります。ルールで参照するプロパティを含む、すべてのXMLファクト・タイプを参照可能にする必要があります。 |
XPathアサーションのサポート |
ファクトについてXPathアサーションを有効化する場合に選択します。この機能は、下位互換性のためにのみ提供されています。通常、このオプションは使用しません。 |
説明 |
XMLファクトの説明を入力します。 |
「属性」領域 |
表示または編集するXMLファクトのJAXBクラスに関連付けられている、使用可能なコンストラクタ、プロパティ、メソッドまたはフィールドを選択します。 |
列を幅に合せる |
列幅を調整するには、このチェック・ボックスを選択します。 |
プロジェクト内でXMLスキーマが変更された場合、Oracle Business Rulesディクショナリにスキーマを再インポートする必要があります。スキーマを再インポートすると、Oracle Business Rulesでは、JAXBを使用してすべてのXMLファクト・タイプに対してソース・スキーマをすべて再コンパイルし、更新されたXMLスキーマ定義を使用してXMLファクト・タイプ定義を更新します。スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。
注意:
スキーマの再インポート時に、XMLファクトの変更基準となるXMLスキーマが変更された場合、ファクトが更新され、ベース・ディレクトリにインポートされます。リンクされたディクショナリ内のファクトを使用する場合は、変更されたスキーマのXMLファクトを、リンクされたディクショナリではなく、ベース・ディクショナリからリロードする必要があります。
XMLファクトを再インポートする手順は、次のとおりです。
再インポート操作が完了した後、互換性のない変更(更新されたスキーマに、ルールで参照されているプロパティを削除したという変更が含まれているなど)によって発生する検証警告があれば、訂正する必要があります。
XMLファクトを使用する際の注意事項は、次のとおりです。
XMLスキーマにrestriction
定義が含まれていると、要素内での使用に有効なタイプを制限できます。restrictionの一般的な用途は、次に示すXMLスキーマのrestrictionのように、要素に使用できる文字列の列挙を定義することです。
<xs:simpleType name="status-type"> <xs:restriction base="xs:string"> <xs:enumeration value="manual"/> <xs:enumeration value="approved"/> <xs:enumeration value="rejected"/> </xs:restriction> </xs:simpleType>
Oracle JAXB 2.0では、restrictionがJava列挙タイプにマップされます。ルール・デザイナを使用してJava列挙タイプまたは要素をXML制限とともにインポートすると、列挙を表す静的な最終フィールドを式に使用できます。また、Oracle Business Rulesでは列挙ごとに、すべての列挙値およびNULLを含む値セットが作成されます。値セットの詳細は、「値セットの使用」を参照してください。
Oracle Application Serverには、デフォルト・バージョンのJAXBバインド・コンパイラが同梱されています。異なるJAXBバインド・コンパイラも使用できます。ただし、異なるJAXBバインド・コンパイラを使用する場合は、XMLスキーマ処理を手動で実行し、生成されたJavaパッケージおよびクラスをJavaファクトとしてデータ・モデルにインポートする必要があります。
JAXBの詳細は、次を参照してください。
スキーマまたはクラスを変更し、実行時に変更後のスキーマまたはクラスを使用する場合、ファクトを再インポートする必要があります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。詳細は、「スキーマが更新されたXMLファクトをリロードする方法」を参照してください。
ほとんどのユーザーは、ObjectFactoryを使用またはインポートする必要はありません。ObjectFactoryをインポートして使用する必要がある場合は、インポートする各XMLスキーマに異なるパッケージ名を使用しないと、異なるObjectFactoryクラスが競合します。
minOccurs="0"
およびnillable="true"
を含む要素のあるXMLスキーマの使用では、JAXBでの特別な処理が発生します。詳細は、「xsd:string入力済要素を持つXMLスキーマをタイプJAXBElementとしてインポートするのはなぜですか。」を参照してください。
JAXBのデフォルト要素の命名規則では、XMLスキーマ要素名にアンダースコア文字を含むXMLスキーマのコンパイルに失敗します。詳細は、「アンダースコアを持つXMLスキーマでJAXBコンパイルに失敗するのはなぜですか。」を参照してください。
デシジョン・サービスの入力のタイプおよび名前には、特定の制限があります。詳細は、「デシジョン・サービスの入力と出力の要素タイプはどのように制限されますか。」を参照してください。
組込みディクショナリには、JavaラッパーのInteger
、Long
、Short
、Float
、Double
、BigDecimal
、BigInteger
に対するサポートが含まれています。これらのタイプは、XMLファクト・タイプに表示されます。
ルール・デザイナでは、Javaファクトをインポートすると、Javaクラスおよびそのメソッドがルール・デザイナで参照可能になります。ルール・デザイナでは、Javaコードやバイトコードがデータ・モデルやディクショナリにコピーされることはありません。
Javaファクト・タイプを使用すると、Javaクラスの選択したプロパティおよびメソッドをRules Engineにインポートできるため、ルールではそのJavaクラスのインスタンスへのアクセス、作成、変更および削除が可能となります。
Javaファクト・タイプをインポートすると、Rules EngineはJavaクラスに定義されているpublic属性、publicメソッドおよびBeanプロパティにアクセスして使用できます(Beanプロパティが適切です。これは、BeanプロパティがModifyアクションで変更できるからです)。
Javaファクトをルールおよびデシジョン表で使用する前に、Javaファクトを含むクラスおよびパッケージをルール・デザイナで使用可能にする必要があります。そのためには、ルール・デザイナを使用してJavaクラスを含むクラスパスを指定し、Javaファクトをインポートします。
Javaファクトをインポートして定義する手順は、次のとおりです。
Javaファクトのインポート後にJavaファクトを表示および編集するには、「Javaファクトの編集 -」ダイアログを使用します。
Javaファクトを表示して編集する手順は、次のとおりです。
「Javaファクトの編集 -」ダイアログには、表3-2 に示すフィールドがあります。
表3-2 「Javaファクトの編集 -」ダイアログのフィールド
フィールド | 説明 |
---|---|
クラス |
Javaファクトに関連付けられているソースのJavaファクト・クラスが表示されます。 |
エイリアス |
Javaファクトの別名を入力します。 |
修飾子パターン |
このフィールドは動詞ルールに使用されます。 ここで何も指定されていない場合は、グローバル修飾子が使用されます。カスタム修飾子パターンがファクトに指定されている場合、パターンに2つの部分({member}、{fact})が含まれている必要があります。次のようにパターンを指定します。
動詞ルールの使用方法の詳細は、「動詞ルールおよびビジネス・フレーズの概要」を参照してください。 |
スーパー・クラス |
このファクトに関連付けられているJavaスーパークラスが表示されます。 |
表示可能 |
ルール・デザイナのリストにJavaファクトを表示する場合に選択します。 |
説明 |
Javaファクトの説明を入力します。 |
「属性」領域 |
表示または編集するJavaファクトのJavaクラスに関連付けられている、使用可能なクラス・プロパティ、コンストラクタ、メソッドまたはフィールドを選択します。 |
プロパティ |
いくつかのJavaオブジェクトには、そのオブジェクトの定義に役立つフィールドがあります。たとえば、Calendarには、週の初めの日、タイムゾーンなどを定義するためのプロパティがあります。 |
列を幅に合せる |
列幅を調整するには、このチェック・ボックスを選択します。 |
属性の説明 |
「属性の説明」は、そのプロパティの説明です。 |
Javaファクトを定義する際の注意事項は、次のとおりです。
Windowsシステムでは、「クラスパス」領域でクラスパスの指定に円記号(\
)またはスラッシュ(/)を使用できます。ルール・デザイナでは、どちらのパス・セパレータも使用できます。
ルール・デザイナで使用するクラスおよびインタフェースは、次のルールに従う必要があります。つまり、クラスまたはインタフェースを使用する場合、参照可能にできるのは、そのスーパー・クラスまたは実装されるインタフェースの1つのみです。
クラスパスを指定する際に、JARファイル、ZIPファイルまたはディレクトリのフルパスを指定できます。
クラスパスにディレクトリ名を指定する場合、そのディレクトリでは、ルート・パッケージ(完全パッケージ名に含まれる最初のパッケージ)が格納されているディレクトリで終わるクラスパスを指定します。つまり、クラスパスでディレクトリを指定すると、ルール・デザイナではそのツリー内でパッケージ名構造と一致するディレクトリ名が検索されます。
たとえば、c:\myprj\cool\example\Test1.class
にあるクラスcool.example.Test1
をインポートするには、クラスパスの値c:\myprj
を指定します。
クラスを変更した場合は、ファクトを再インポートする必要があります。再インポート操作の完了後、クラスの変更によって検証警告が表示されることがあります。互換性のない変更(ルールで参照されているプロパティの削除など)によって発生する検証警告があれば、訂正する必要があります。
RLファクトは、ユーザーが直接作成でき外部ソースが存在しないタイプの唯一のファクトです。他のすべてのタイプのOracle Business Rulesファクトはインポートされます。RLファクトは、リレーショナル・データベースの行またはメソッドがないJavaBeanと同じです。RLファクトには、データ・モデルで使用可能なタイプ(RLファクト、Javaファクトまたはプリミティブ・タイプ)のプロパティのリストが含まれています。
RLファクトを使用すると、動的な仮想型を提供することでJavaアプリケーションのオブジェクト・モデルを拡張できます。
次に例を示します。
R1: if monthly spend = Customer.monthlySpend then assert new Temp(three month spend: monthly spend[0] + monthly spend[1] + monthly spend[2]) R2: if Temp.three month spend > 500 then modify Temp(status: GOLD) R3: if Temp.status == GOLD then assert new Result(discount: 0.10).
ルール・デザイナでテストおよびプロトタイプ化を行う場合、RLファクトを作成し、ルールの記述およびテストに使用してから、スキーマをインポートし、XMLファクトに切り替えることができます(承認済XMLスキーマが作成されるか使用可能になるまで、待機が必要な場合があります)。RLファクトから対応するXMLファクトに切り替える手順は、次のとおりです。
RLファクトを削除します(これにより、作成したルールまたはデシジョン表で削除対象のRLファクトを使用しているという検証警告が表示されます)。
XMLファクトをインポートし、そのXMLファクトおよびプロパティに、手順1で削除したRLファクトとプロパティの名前と一致する別名を与えます。
このプロセスでは、XMLファクトとプロパティの別名および型が削除するRLファクトの別名および型と一致する場合、検証警告が削除されます。
RLファクトにプロパティを追加するには、「RLファクトの編集 -」ダイアログを使用します。
RLファクトを表示、編集してRLファクトのプロパティを追加する手順は、次のとおりです。
Rules Designerで、「ファクト」ナビゲーション・タブを選択します。
「RLファクト」タブで、ファクトを表示または編集するRLファクトをダブルクリックします。図3-6 に示すように、「RLファクトの編集 -」ダイアログが表示されます。
RLファクトのプロパティを追加するには、「RLファクトの編集 -」ダイアログの「プロパティ」領域で「作成」をクリックします。
「名前」フィールドにプロパティ名を入力します。
「タイプ」フィールドで、リストからタイプを選択するか、またはプロパティ・タイプを入力します。
値セットをプロパティに関連付けるには、「値セット」フィールドのリストから、値セットを選択します。
プロパティに初期値を関連付けるには、「初期値」フィールドに値を入力します。
必要に応じて前述の手順を繰り返し、さらにプロパティを追加します。
「OK」をクリックします。
「RLファクトの編集 -」ダイアログを使用してRLファクトにプロパティを追加する場合、図3-7 に示すように、「プロパティ」領域の「初期値」フィールドに候補値のリストが表示されます。
ルール・デザイナの一部のフィールドを使用する際は、初期値のリストや他のリストが空の場合があります。この場合、リストは空のボックスです。したがって、ルール・デザイナで値の入力に役立つオプションがみつからない場合、テキスト入力領域に値を直接入力するか、または「式ビルダー」ボタンをクリックして「式ビルダー」ダイアログを表示する必要があります。
ADFビジネス・コンポーネント・ファクトを使用すると、ルールおよびデシジョン表でADFビジネス・コンポーネントをファクトとして使用できます。ADFビジネス・コンポーネントのファクトを使用することで、ルールのベースとして必要なビジネス・オブジェクトを表すビュー・オブジェクトのグラフをアサートし、Oracle Business Rulesにビュー・オブジェクトのグラフ内で各種の関連ビュー・オブジェクト間の関係管理に伴う複雑な処理を実行させることができます。
詳細は、「Oracle Business RulesとADFビジネス・コンポーネントの使用」を参照してください。
ADFビジネス・コンポーネント・ビュー・オブジェクトをインポートすると、ビュー・オブジェクの各属性に対応するプロパティを持つADFビジネス・コンポーネント・ファクト・タイプが作成されます。
ADFビジネス・コンポーネント・ファクトを追加する手順は、次のとおりです。
表示されたいずれかのクラスパスの「ADFビジネス・コンポーネント・ファクト」ダイアログの「クラスパスの検索」領域に表示されるクラスパス・リストには、プロジェクトで使用できるオブジェクト定義を表示できます。プロジェクトに使用できないクラスパスを使用する必要がある場合は、このダイアログで「クラスパスに追加」をクリックするだけで十分です(非常にまれなケース)。
ADFビジネス・コンポーネント・ファクトには、循環参照が含まれていることがあります。この警告がビジネス・ルール検証ログに表示された場合は、循環参照を手動で解決する必要があります。そのためには、循環参照に関係するいずれかのプロパティの「参照可能」チェック・ボックスの選択を解除する必要があります。
各ADFビジネス・コンポーネント・ファクト・タイプには、各ファクト・インスタンスが表すoracle.jbo.Row
を参照するViewRowImpl
という名前のプロパティと、この行と親行のキー値セットの取得に使用可能なoracle.rules.sdk2.decisionpoint.KeyChain
オブジェクトを指すkey_values
という名前のプロパティが含まれています。
ADFビジネス・コンポーネントを使用する際の注意事項は、次のとおりです。
ビュー・オブジェクト定義間の関係は、ビュー定義の属性、特にビュー・リンクのアクセッサである属性のイントロスペクションによって決定されます。
ADFビジネス・コンポーネント・ファクト・タイプ・インポータでは、どの関係が1対1で、どの関係が1対多であるかが正しく判別され、それに従ってディクショナリに定義が生成されます。1対多関係の場合、生成されるプロパティのタイプはList
で、実行時に示されたタイプのファクトが含まれています。
循環的なタイプ依存性を持つADFビジネス・コンポーネント・ファクト・タイプは使用できません。循環に関係する1つ以上のプロパティの「参照可能」チェック・ボックスの選択を解除して、これらの循環を絶つ必要があります。
ADFビジネス・コンポーネント・ファクト・タイプはJavaファクト・タイプではなく、ビュー・オブジェクト用に明示的に作成された実装クラスのメソッドは起動できません。
この種のメソッドをコールする必要がある場合は、ビュー・オブジェクト実装をADFビジネス・コンポーネント・ファクト・タイプのかわりにJavaファクト・タイプとしてディクショナリに追加します。この場合、すべてのgetter、setterおよびその他のメソッドが使用可能になりますが、関連するビュー・オブジェクトにアクセスできなくなり、そのオブジェクトへのアクセスが必要な場合は、これらの関係を明示的に管理する必要があるというトレードオフがあります。
内部的には、ADFビジネス・コンポーネント・ファクト・タイプはRLファクト・タイプのインスタンスです。
つまり、このことは、ADFビジネス・コンポーネント・ビュー・オブジェクト・インスタンスをルール・セッションに直接アサートすることはできず、かわりにMetadataHelper
およびADFBCFactTypeHelper
クラスに用意されているヘルパー・メソッドを使用する必要があることを意味します。詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。
値セットを作成すると、値リストまたは値範囲のリストを定義して、Oracle Business Rules内のファクトまたはファクト・プロパティについて許容範囲内の値セットを制限できます。値セットは、名前が付けられてデータ・モデルに格納される再利用可能なグローバル値セットとして、または、デシジョン表を定義するときに指定し、1つの条件式にのみ適用されるローカル値セットとして定義できます。
ローカル値セットの使用方法の詳細は、「デシジョン表への条件行の追加方法」を参照してください。
値セットは次のように使用できます。
値セットとファクト・タイプ・プロパティを関連付けることができます。これにより、ファクト・プロパティについて許容範囲内の値セットを制限できます。詳細は、「値セットをファクト・プロパティに関連付ける方法」を参照してください。
値セットは、いくつかのプリミティブ値(数値、文字列、日付、ブール、または列挙)の値リストまたは値範囲を定義します。値セットは、ファクト・タイプ・プロパティの値に対して固定の選択肢のセット(たとえば、男性または女性など)を提供するために、そのプロパティと関連付けることができます。値セットは、デシジョン表の条件式の値に対して固定の選択肢のセットを提供するために、その条件と関連付ける必要があります。これらの選択肢(値または値範囲)は、デシジョン表の条件セルに入力されます。
デシジョン表の各条件式では、値セットの値または範囲により、複数の可能性を決定できます。値セットを使用すると、条件式のそれぞれの可能性が値または範囲に分けられ、それらでは1つのセルが、値セットの値の1つの値または範囲を指定します(または、セルごとに複数の値または範囲を指定することもできます)。たとえば、色について定義した値セットでは、値または範囲に"blue"、"red"、"orange"といった文字列のリストを含むことができます。整数を含む値セットでは、1未満、1から10、10より上の3つの範囲を持つことができます。詳細は、「デシジョン表への条件行の追加方法」を参照してください。
グローバル、関数および関数の引数を値セットに関連付けることができます。値セットをグローバルに関連付けると、割り当てられた値が値セットで指定された値に制限されていることを、デザインタイムに検証できます。値セットを関数引数と関連付けると、その関数がその値セット内の値でのみ呼び出されることが検証されます。値セットをこのように使用すると、ルール・デザイナでは、許可されない定数の引数値が割り当てられるか、渡されたグローバル値および関数の引数について検証警告をレポートできます。関数と値セットを関連付けると、その関数がデシジョン表の条件行の式として使用されるときに、その条件行がその値セットを使用するように自動的に設定されます。検証されるのは定数式値のみです。グローバル初期式値および関数パラメータ式値が、関連付けられた値セットに対して必ず検証されるようにするには、その式に関連付けられた「定数」チェック・ボックスを選択します。値セットに関連付けられたグローバルまたは関数の引数に基づく実行時チェックは適用されません。詳細は、「値セットを関数または関数の引数に関連付ける方法」を参照してください。
デザインタイムの検証に加え、LOV値セットを使用して、IF/THENルールのテストおよびアクションで式の入力時にリストに表示されるオプションを提供できます。詳細は、「値セットを使用してテスト式のオプションを指定する方法」を参照してください。
値セットには次の3つの形式があります。
LOV: 値リストで定義されます(「値リスト・グローバル値セットの定義方法」を参照)。
範囲: 範囲のエンドポイントで定義される値範囲のリストで定義されます(「範囲リスト・グローバル値セットの定義方法」を参照)。
列挙: 次のいずれかからインポートされる列挙タイプのリストで定義されます。
XMLタイプ(「XMLタイプからの列挙タイプ(列挙)値セットの定義方法」を参照)。
Javaファクト(「Javaタイプからの列挙タイプ(列挙)値セットの定義方法」を参照)。
値リスト値セットでは、その値セットの値または範囲のタイプおよびリストを指定できます。詳細は、「値リスト値セットに関する必知事項」を参照してください。
値リスト(LOV)グローバル値セットを定義する手順は次のとおりです。
デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられているLOV値セット内の値または範囲の相対位置を変更することで管理できます。
範囲リスト値セットでは、その値セットの値または範囲のタイプおよびエンドポイントを指定できます。詳細は、「範囲値セットに関する必知事項」を参照してください。
範囲リスト(範囲)グローバル値セットを定義する手順は、次のとおりです。
XMLスキーマをインポートする際に、XSDに列挙値が含まれていると、ルール・デザイナでは列挙ごとに列挙タイプ値セットが自動的に作成されます。列挙タイプ値セットは読取り専用ですが、バケットの順序は変更できます。
詳細は、「XMLファクトに関する必知事項」を参照してください。
XMLタイプから列挙タイプ(列挙)値セットを定義する手順は、次のとおりです。
デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙値セット内の値の相対位置を変更することで管理できます。
Java列挙をインポートすると、ルール・デザイナではJava列挙ごとに列挙タイプの値セットが自動的に作成されます。列挙タイプ値セットは読取り専用ですが、バケットの順序は変更できます。
Javaファクトから列挙タイプ(列挙)値セットを定義する手順は、次のとおりです。
デシジョン表でのルールの順序付けは、デシジョン表で条件式に関連付けられている列挙値セット内の値または範囲の相対位置を変更することで管理できます。
デシジョン表では、条件式に関連付けられている値セット内の値の順序によって条件セルの順序が決まり、したがってルールの順序も決まります。デシジョン表でのルールの順序付けは、条件式に関連付けられている値リスト値セット内の値の相対位置を変更することで管理できますが、範囲の順序は変更できません。
図3-11 は、値リストを使用した色を指定する値セットのルール・デザイナでの値セット定義を示しています。
図3-11 に示すように、デフォルトの値リスト値セットでは、otherwise
という値が値リスト(LOV)に含まれています。このotherwise
という値は、他のすべての値と性質が異なり、他の値または範囲を持たないすべての値タイプと一致します。したがって、値リストのotherwise
を使用すると、値セットを使用する条件式はすべての値を処理可能になり、指定したタイプのすべての値と一致するようになります。この場合の一致は、定義された値か、otherwise
値のいずれかに対するものです。otherwise
値をLOV値セットから削除できませんが、「アクションで許可済」チェック・ボックスを選択解除して除外することはできます(otherwise
を除外すると、値セット内の値リストに存在しない値を割り当てようとすると、検証警告が表示されます)。
表3-3 に、ルール・デザイナでLOV値セットについてサポートされている値セット値を示します。
表3-3 LOV値セットに対してサポートされているタイプ
型 | 説明 |
---|---|
Javaプリミティブ型 |
|
|
|
|
現行ロケールの |
注意:
デシジョン表でブール型を使用する場合、LOV値セットを指定する必要はありません。ブール型の場合、Oracle Business Rulesには可能な値(true
およびfalse
)用の組込み値または範囲が用意されています。
範囲リスト値セットに値または範囲を追加すると、現在選択している値および次に上位の値に基づいて値が計算されます。エンドポイント値を変更すると、値は自動的に値セット内でソートされるため、新規値の追加先はどこでもかまいません。ただし、ルール・デザイナでは、現行の値セットのエンドポイント値とそのエンドポイント値の間に値がない場合があります。この場合、ルール・デザイナでは次の書式の検証警告が表示されます。
RUL-05849: Valueset has duplicate bucket value "4999"
この問題を解決するには、値のエンドポイントを変更し、重複する値を削除する必要があります。
表3-4 に、ルール・デザイナで範囲値についてサポートされているタイプを示します。
表3-4 範囲値に対してサポートされているタイプ
型 | 説明 |
---|---|
選択したプリミティブ型 |
|
|
現行ロケールの |
「範囲」フィールドに関する次の規則に注意してください。
論理演算子: 正または負の無限大に関する範囲を指定します。たとえば、>=25
は25以上で正の無限大を意味し、<18
は負の無限大から18未満を意味します。
大カッコ「[
」: このエンドポイント値を含む範囲を指定します。たとえば、[18..25)
は18以上25未満を意味します。
丸カッコ「)」: このエンドポイント値を除く範囲を指定します。たとえば、(18..25]
は18より大きく25以下を意味します。
値セット内の値または範囲を定義する際、許可されていない値に対応する一部の値または範囲を定義できます。たとえば、運転者の年齢の値セットの場合、通常、0より小さい値を含む値は許可しません。したがって、運転者のデータを持つファクトに、運転者の年齢の値セットに関連付けられている年齢プロパティが含まれる場合は、年齢プロパティが-1などの値に設定されているファクトを作成または変更できないようにする必要があります。値セットで、有効な値に対して「アクションで許可済」を選択し、無効な値に対してこのオプションの選択を解除します。
値セット・オプション「許可されない値をテストに含める」により、デシジョン表の条件およびルールのテストで「アクションで許可済」が選択されているかどうかに関係なく、すべての値を含めることができるようになります。すべての値または範囲を含めることで、不正な値を明示的にテストできます。オプション「許可されない値をテストに含める」を使用すると、次のような2つのケースに対応できます。
Oracle Business Rules Engineの入力データがクリーンで、無効なデータ(負の年齢など)が含まれていない場合。この場合、「許可されない値をテストに含める」の選択を解除する必要があります。注意: age < 0
を「アクションで許可済」に設定しないのは、これにより、modify(driver, age: -1))
のような無効な値を使用するアクションを作成しようとした場合に、デザインタイムの検証警告が提供されるためです。詳細は、「値セットをルールのオプション値の制約として使用する方法」を参照してください。
ルールのテストやデシジョン表で、除外した値を検討したい場合があります。この場合、「許可されない値をテストに含める」を選択する必要があります。これは、Oracle Business Rules Engineの入力データがクリーンでなく、無効なデータ(無効な負の年齢など)が含まれているような場合に役立ちます。すべての値セットのアクションを提供するデシジョン表では、除外した値のケースを含めて、エラー・ファクトのアサートなど、適切なアクションを提供することもできます。この処理のためには、値セット内のすべての値の「アクションで許可済」フィールドを選択するか、「アクションで許可済」フィールドの構成をそのままにして「許可されない値をテストに含める」フィールドを選択できます。「許可されない値をテストに含める」フィールドを使用すると、便利で、すべての値を再構成する必要がないだけでなく、「アクションで許可済」の構成が保持されるため、簡単にこの値セットを再使用して最初のケースを処理できます(「許可されない値をテストに含める」の選択を解除していない場合)。
値セットに値を入力する場合、入力する値は、その値セットに指定されたタイプに対して有効であることが必要です。入力した値が値セット・タイプに無効であると、ルール・デザイナで引用符が追加され文字列になります。入力されたデータが指定タイプに対して適切でない場合、引用符を追加することによってのみ有効なリテラルとなります。たとえば、intタイプのLOV値セットで2.2という値を入力すると、ルール・デザイナから次のような警告が表示されます。
RUL-05833: Invalid characters "2.2" in value
この問題を解決するには、値に有効な値(この場合は値2など)を入力するか、値セットのタイプを変更します。
別の例として、値に値を入力する場合、たとえばデータ型がshortの値セットで値を入力し、値999999の値を追加すると、ルール・デザイナによってこれに"999999"という値が割り当てられます。Shortの最大値は32767です。この場合、データ型がshortの値セットに対して「String」は有効な値ではないため、前述の例と同様に値に関する警告が表示されます。これを解決するには、すべての値に対して適切な値(この例では、32767以下の値)を入力します。
グローバル値セットを定義した後、データ・モデルの一部をそのグローバル値セットに関連付けることができます(それらのタイプに互換性がある場合)。これにより、デシジョン表を定義する際、「条件」領域にある条件セルに値セットを自動的に割り当てることができます。また、値セットがビジネス条件に関連付けられている場合、Oracle Business Rulesでは、ルールでビジネス条件の式の値に対する制約として定義した値または範囲が使用されます。
次の4種類のビジネス条件を値セットに関連付けることができます。
ファクト・プロパティ
関数の結果
関数の引数
グローバル値
デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内のファクト・プロパティに関連付けることができます。
値セットをファクト・プロパティに関連付ける手順は次のとおりです。
デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内の関数に関連付けることができます。
値セットを関数の戻り値に関連付ける手順は、次のとおりです。
デシジョン表を作成する準備のため、グローバル値セットをデータ・モデル内のグローバル値に関連付けることができます。
値セットをグローバル値に関連付ける手順は、次のとおりです。